C ELF头大小大于52字节
根据给定的Elf32_Ehdr结构(第9页),链接中的elf头大小应为52字节并固定。但也有字段e_ehsize,可以大于52字节。在何处定义这些额外字节,直到第一节标题开始?如第9页所述: 某些对象文件控制结构可能会增长,因为ELF头包含它们的实际大小如果对象文件格式更改,程序可能会遇到比预期大或小的控制结构。因此,程序可能会忽略“额外”信息。“缺少”信息的处理取决于上下文,并将在定义扩展时指定C ELF头大小大于52字节,c,elf,C,Elf,根据给定的Elf32_Ehdr结构(第9页),链接中的elf头大小应为52字节并固定。但也有字段e_ehsize,可以大于52字节。在何处定义这些额外字节,直到第一节标题开始?如第9页所述: 某些对象文件控制结构可能会增长,因为ELF头包含它们的实际大小如果对象文件格式更改,程序可能会遇到比预期大或小的控制结构。因此,程序可能会忽略“额外”信息。“缺少”信息的处理取决于上下文,并将在定义扩展时指定 (重点补充)。目前没有定义任何额外字节的语义;它们将包括一个扩展。此外,该文本还表明,如果您发现文
(重点补充)。目前没有定义任何额外字节的语义;它们将包括一个扩展。此外,该文本还表明,如果您发现文件的
Elf32_Ehdr
部分长度超过52字节,则可以安全地忽略多余的字节。请注意,在32位机器上,ELF头通常为52字节,在64位机器上为64字节。
旧规范[1]的描述中不包含64位标头。这可能是您一直在使用的规范。
[1]
您可以检查访问文档[2]的64位ELF头。
[2]
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位ELF 在某些情况下,它是固定的52字节时,我无法注意到。。。额外字节中有字符串,如节名等。我不确定它们是否定义在某个地方。谢谢@davmac你是对的!但通过我的试验,我记得固定的52个字节应该来自链接器或编译器设置,不把这些额外的字节