Почему strace открывается, читает 512 байт и ТОГДА fstat libncurses?

У меня есть следующий вывод, через который я прохожу, чтобы немного больше узнать о потоке программ. Вот раздел, который меня смущает:

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>

Что получается при чтении первых 512 байт? Кажется, что этот шаблон является общим для общих библиотек.

ОБНОВЛЕНИЕ: я только что получил отличный ответ, который разъясняет длину 512 байт. В частности, из комментария в elf/dl-load.c:

32-битные файлы заголовка ELF имеют длину 52 байта, а в 64-битных файлах - 64 байта. Каждая запись заголовка программы снова имеет длину 32 и 56 байт соответственно. Т.е. даже с файлом, содержащим 10 записей заголовка программы, нам нужно прочитать только 372B/624B соответственно. Добавьте к этому немного запаса для программных заметок и достаточно чтения 512B и 832B для 32-битных и 64-битных файлов соответственно.

1 ответ

Решение

Первые 512 байтов содержат заголовок, необходимый для определения типа файла, целевой платформы, версии и т. Д. После прочтения заголовка код переходит к обработчику для этого конкретного типа файла.

Другие вопросы по тегам