ELF 符号的大小到底是多少(64 位和 32 位)以及如何解析它

What exactly is the size of an ELF symbol (both for 64 & 32 bit) & how do you parse it

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

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

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

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

需要注意的是,我运行读取的ELF文件,在上图中,是一个64bit的executable

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

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

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

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

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

类型定义结构{ 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 位条目”,byte 表示 8 位条目,依此类推。

Elf64_Sym里面有8+1+1+8+8+8个字节,也就是34个字节。