根据链接elf-format中给定的Elf32_Ehdr结构(第9页),elf头大小应为52字节并固定。但是还有字段e_ehsize,可以大于52个字节。在哪里定义那些额外的字节,直到第一节标题开始?
答案 0 :(得分:2)
正如它所说,也在第9页:
某些目标文件控制结构可能会增长,因为ELF标头包含它们的实际大小。 如果目标文件格式更改,程序可能会遇到大于或小于预期的控制结构。因此,程序可能会忽略“额外”信息。 “缺失”信息的处理取决于上下文,并且将指定何时以及是否定义扩展。
(重点补充)。目前,没有任何内容定义任何额外字节的语义;他们将包括一个扩展。此外,文本暗示如果您发现Elf32_Ehdr
部分长度超过52个字节的文件,您可以安全地忽略额外的字节。
答案 1 :(得分:1)
请注意,ELF标头通常在32位机器上为52字节,在64位机器上为64字节。 旧规范[1]在其描述中不包括64位头。这可能是您一直使用的规范。 [1] http://www.skyfree.org/linux/references/ELF_Format.pdf
您可以检查访问文档的64位ELF标头[2]。 [2] ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/elf64-2.4.pdf
32位和64位ELF标头之间的区别在于:
typedef struct{
........ // struct Elf32_Ehdr
Elf64_Addr e_entry; //[8 bytes] Elf32_Addr [4 bytes]
Elf64_Off e_phoff; //[8 bytes] Elf32_Off [4 bytes]
Elf64_Off e_shoff; //[8 bytes] Elf32_Off [4 bytes]
.......
} Elf64_Ehdr;
因此,32到64位ELF标题的大小差异是(4 * 3)= 12字节。另请注意,标头可能在末尾包含额外的位,如规范所示 解析ELF二进制文件时,请确保先读取前16个字节,以确定该文件是32位还是64位小精灵。