Suponho que add.bin
seja um arquivo esparso.
A maioria dos sistemas de arquivos unix suportam arquivos esparsos (de tamanhos quase arbitrários). Basicamente, você pode procurar um offset arbitrário antes de começar a escrever, e os blocos que você pula não serão realmente mapeados para o disco. Se você tentar lê-los, eles estarão cheios de 0s. Se você escrever para eles, eles vão surgir magicamente (mas apenas aqueles para os quais você escreve).
Veja um exemplo:
$ dd of=sparse obs=1K seek=1M if=<(echo foo)
0+1 records in
0+1 records out
4 bytes (4 B) copied, 0.000411909 s, 9.7 kB/s
$ ls -lh sparse
-rw-r--r-- 1 rici rici 1.1G Nov 23 17:22 sparse
$ du -h sparse
4.0K sparse
O arquivo que criei tem um bloco de 4 kilobytes em disco, dos quais apenas os quatro primeiros caracteres são usados. Mas se você ler o arquivo da maneira normal (sequencialmente desde o começo), você terá que ler um gigabyte de zeros antes de encontrar o foo
.
No Linux, du
normalmente é capaz de relatar o uso real do disco de um arquivo esparso. Você pode informá-lo para informar o "tamanho aparente" (que será mais parecido com o que ls -l
reporta) passando a opção -b
. Essa é uma extensão do Gnu; O Posix não exige que du
seja preciso em seus relatórios de tamanhos de arquivos esparsos. ("Cabe à implementação definir exatamente como seus métodos são precisos").
Presumivelmente, arm-none-eabi-objcopy
faz algo semelhante ao exemplo dd
acima, pois expande o exe
formatado em ELF em uma imagem RAM e preenche a imagem procurando em vez de preencher o arquivo com zeros. Este é, na verdade, o caso de uso clássico para arquivos esparsos, que podem ser mapeados na memória ( mmap
) sem incorrer em um custo para blocos não utilizados.