我获得了一些符号和一个ELF文件的十六进制转储。如何知道这个符号出现在哪个节(section)中?
.strtab
和.shstrtab
有什么区别?还有另一个数组用于存储符号字符串吗?
当我获得符号名称表的索引时,它是在.strtab
还是在.shstrtab
中的索引?
我获得了一些符号和一个ELF文件的十六进制转储。如何知道这个符号出现在哪个节(section)中?
.strtab
和.shstrtab
有什么区别?还有另一个数组用于存储符号字符串吗?
当我获得符号名称表的索引时,它是在.strtab
还是在.shstrtab
中的索引?
对于第一个问题,我们需要使用 hexedit 工具来正确理解 ELF 文件。
对于第二个问题 - strtab 代表字符串表 shstrtab 代表节头字符串表。
当我们读取 ELF 头时,我们可以看到每个 ElfHeader 结构都包含一个名为 e_shstrndx 的成员。这是指向 shstrtab 的索引。如果您使用此索引,然后从 shstrtab 中读取,您可以找到该节的名称。
strtab 是所有其他引用的字符串表。当您从 ELF 对象读取符号时,每个符号结构(Elf32_Sym)都有一个名为 st_name 的成员。这是进入 strtab 获取该符号的字符串名称的索引。
请详细说明一下符号字符串数组?还有,名称表是什么意思?
您可以参考以下链接 - 在C中从Linux读取ELF字符串表
希望这回答了您的问题。
.strtab
。实际上,这通常是不正确的:用于动态链接的符号名称通常在单独的字符串表.dynstr
中。对于符号表(类型为SHT_SYMTAB
的节),节条目的sh_link
字段将指向正确的字符串表节。 - Alex Shpilkin我来回答第一个问题,因为Samir已经很好地回答了第二个问题。
符号的名称将在其中一个STRTAB
部分中,然后符号表中会有一个条目(SYMTAB
或DYNSYM
部分之一),该条目通过包含部分中的偏移量引用该字符串。符号表中的条目可以告诉您找到此符号的部分的索引,但无法告识您它在哪里被使用。
为此,您需要检查包含类型为REL
的节中的重定位表;常见名称包括.rel.dyn
,.rel.plt
。重定位表列出了另一个代码部分中对符号的所有引用,即代码和重定位部分是成对的。表中的每个条目都是符号的一个“用法”,并包含相应部分中使用的偏移量以及符号表中的符号索引。
如果您可以使用readelf
实用程序,则可以轻松使用readelf -r <binary> | grep <symbol name>
获取对符号的所有引用。