我有以下strace输出,我正在经历一些关于程序stream程的教程。 以下是令我困惑的部分:
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就足够了。
前512个字节包含标识文件types,目标平台,版本等所需的标题。 一旦头被读取,代码然后跳转到该特定types的文件的处理程序。