如何在ELF文件中正确识别并找到对应的字符串表?
如何在ELF文件中正确识别并找到对应的字符串表?
我刚碰到这个循环困境的时候也头大了半天,其实ELF格式早就为这个问题留了专门的解决方案——ELF头里的e_shstrndx字段,这就是打破循环的关键!
具体步骤拆解:
先读ELF头,直接定位.shstrtab
ELF文件最开头的Elf32_Ehdr(32位)或Elf64_Ehdr(64位)结构体里,有个e_shstrndx成员,它直接存储了.shstrtab节在节表头数组中的索引值。比如你贴的objdump输出里,.shstrtab是第13个节([13]),那你的ELF头里e_shstrndx的值应该就是13。读取.shstrtab的内容
拿到.shstrtab的节索引后,去节表头数组里找到对应的Elf32_Shdr/Elf64_Shdr结构体,用其中的sh_offset(文件中的偏移位置)和sh_size(节的大小),就能从ELF文件里把整个.shstrtab的字符串数据读出来。用.shstrtab获取所有节的名字
现在你有了节名字符串表,就可以遍历所有节表项了:每个节表项的sh_name字段是一个偏移值,指向.shstrtab中该节名字符串的起始位置。比如遍历到第12个节时,用它的sh_name去.shstrtab里查,就能得到.strtab这个名字,这样就轻松区分开两个STRTAB类型的节了。
额外补充:
- 你提到的
.symtab的sh_link字段确实指向它对应的.strtab索引,这是符号表和符号名字符串表的关联方式,但这和.shstrtab的定位无关——.shstrtab是靠ELF头的专属字段直接定位的,完全不需要提前知道任何节名。 - 至于NOTE节的
sh_link为空的情况,这是正常的:不同类型的节,sh_link字段的含义不同,比如NOTE节的sh_link本来就没有定义用途,不用在意它,我们只需要聚焦在ELF头的e_shstrndx来解决当前的循环问题就好。
备注:内容来源于stack exchange,提问作者emacs drives me nuts
相关产品推荐
相关产品推荐

