Os primeiros 512 bytes contêm o cabeçalho necessário para identificar o tipo de arquivo, a plataforma de destino, a versão e assim por diante. Depois que o cabeçalho é lido, o código salta para o manipulador desse tipo específico de arquivo.
Eu tenho a seguinte saída strace que eu estou passando para me ensinar um pouco mais sobre o fluxo de programas. Aqui está a seção que está me confundindo:
16:08:02 open("/lib/libncurses.so.5", O_RDONLY) = 3 <0.000046>
16:08:02 read(3, "\x7f\"..., 512) = 512 <0.000048>
16:08:02 fstat64(3, {st_dev=makedev(202, 0), st_ino=16548, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=464, st_size=231576, st_atime=2011/02/06-15:37:43, st_mtime=2011/01/04-06:05:23, st_ctime=2011/02/06-15:37:43}) = 0 <0.000038>
O que é ganho lendo os primeiros 512 bytes? Parece que esse padrão é comum em bibliotecas compartilhadas.
UPDATE: Acabei de receber uma excelente resposta , que esclarece a extensão de 512 bytes . Especificamente de um comentário em elf / dl-load.c:
The ELF header 32-bit files is 52 bytes long and in 64-bit files is 64 bytes long. Each program header entry is again 32 and 56 bytes long respectively. I.e., even with a file which has 10 program header entries we only have to read 372B/624B respectively. Add to this a bit of margin for program notes and reading 512B and 832B for 32-bit and 64-bit files respecitvely is enough.
Os primeiros 512 bytes contêm o cabeçalho necessário para identificar o tipo de arquivo, a plataforma de destino, a versão e assim por diante. Depois que o cabeçalho é lido, o código salta para o manipulador desse tipo específico de arquivo.