Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C ELF头大小大于52字节_C_Elf - Fatal编程技术网

C ELF头大小大于52字节

C ELF头大小大于52字节,c,elf,C,Elf,根据给定的Elf32_Ehdr结构(第9页),链接中的elf头大小应为52字节并固定。但也有字段e_ehsize,可以大于52字节。在何处定义这些额外字节,直到第一节标题开始?如第9页所述: 某些对象文件控制结构可能会增长,因为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个字节应该来自链接器或编译器设置,不把这些额外的字节