我得到了以下 strace 输出,我正在通过这些输出来进一步了解程序流程。下面是让我感到困惑的部分:
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 中的注释:
ELF 头 32 位文件的长度为 52 字节,64 位文件的长度为 64 字节。每个程序头条目的长度分别为 32 和 56 字节。也就是说,即使文件有 10 个程序头条目,我们也只需要分别读取 372B/624B。再加上一点程序注释的余量,32 位和 64 位文件分别读取 512B 和 832B 就足够了。
答案1
前 512 个字节包含标头,用于识别文件类型、目标平台、版本等。读取标头后,代码将跳转到此特定文件类型的处理程序。