【问题标题】:What exactly is the size of an ELF symbol (both for 64 & 32 bit) & how do you parse itELF 符号的确切大小是多少(64 位和 32 位)以及如何解析它
【发布时间】:2021-12-05 04:08:08
【问题描述】:

根据oracles documentation on the ELF file format,一个 64 位 elf 符号大小为 30 个字节(8 + 1 + 1 + 4 + 8 + 8),但是当我使用 readelf 打印出 elf 文件的节标题时,然后检查符号表部分标题的“EntSize”(条目大小)成员,它读取符号条目实际上只有十六进制 0x18(dec 24)大小。

我在 oracle 文档旁边附上了一张 readelfs 输出的图片。 “SYMTAB”下突出显示的字符是“EntSize”成员。

当我即将编写一个 ELF 解析器时,我很好奇我应该相信哪个? EntSize 成员或文档的读取值?

我也尝试在 this ELF 文档中寻找答案,但它似乎没有涉及 64 位 ELF 结构的任何细节。

需要注意的是,上图中我运行readelf的ELF文件是64位的可执行文件

【问题讨论】:

    标签: executable elf object-files ldd readelf


    【解决方案1】:

    EICLASS,ELF 幻数之后的字节,包含 ELF 文件的“类”,值“2”(当然是十六进制)表示 64 位类。

    在起草 32 位标准时,存在竞争的流行 64 位架构。 32 位标准对 64 位标准有点模糊,因为当时很可能想象多个相互竞争的 64 位标准

    https://www.uclibc.org/docs/elf-64-gen.pdf

    应涵盖 64 位标准,并更好地关注 64 位布局。

    你“解析”它的方式是按照结构中描述的顺序读取字节。

    typedef 结构 { Elf64_Word st_name; 无符号字符 st_info; 无符号字符 st_other; Elf64_Half st_shndx; Elf64_Addr st_value; Elf64_Xword st_size; } Elf64_Sym;

    前 8 个字节是 st_name,下一个字节是 st_info,依此类推。当然,了解结构在文件中“开始”的位置至关重要,上面的规范应该对此有所帮助。

    这里的“64”表示“64位条目”,字节表示8位条目,依此类推。

    Elf64_Sym 中有 8+1+1+8+8+8 个字节,即 34 个字节。

    【讨论】:

      猜你喜欢
      • 2015-06-06
      • 2023-04-07
      • 2013-07-17
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      相关资源
      最近更新 更多