32位/64位ELF符号大小是多少?如何解析?readelf与文档数值冲突该采信哪个
32位/64位架构ELF符号大小说明
- 32位ELF的符号结构体
Elf32_Sym标准实际存储大小为16字节,各字段长度加总刚好为16,无对齐填充。 - 64位ELF的符号结构体
Elf64_Sym标准实际存储大小为24字节(即你读取到的十六进制0x18),字段总长度加总为4+1+1+2+8+8=24,无对齐填充。
文档数值不符原因
你参考的Oracle文档给出的30字节是未考虑结构体对齐规则、且字段排序不符合实际存储布局的理论字段长度加总,并非ELF文件中实际存储的符号条目大小,属于文档的计算逻辑偏差。
ELF符号解析步骤
- 第一步读取ELF文件头,确认当前文件是32位还是64位格式,获取节头表的偏移地址、节总数、节头大小三个参数。
- 第二步遍历节头表,筛选出类型为
SHT_SYMTAB(普通符号表)或SHT_DYNSYM(动态符号表)的节。 - 第三步读取目标节头的
sh_entsize字段,该值就是当前ELF文件中每个符号条目的实际存储大小。 - 第四步根据节头的
sh_offset字段定位到符号表在文件中的起始位置,每次读取sh_entsize长度的数据,按对应架构的符号结构体定义解析字段即可。
解析器开发采信规则
必须优先采信节头中读取到的
sh_entsize值,禁止硬编码固定的符号大小。
节头的sh_entsize是ELF文件本身声明的条目实际大小,适配所有合法的ELF格式(包括平台扩展、自定义结构的ELF文件),硬编码固定值会导致特殊ELF文件解析失败。
内容的提问来源于stack exchange,提问作者stav
相关产品推荐
相关产品推荐

