ELF中的字符串表

14
  1. 我获得了一些符号和一个ELF文件的十六进制转储。如何知道这个符号出现在哪个节(section)中?

  2. .strtab.shstrtab有什么区别?还有另一个数组用于存储符号字符串吗?

当我获得符号名称表的索引时,它是在.strtab还是在.shstrtab中的索引?


2个回答

18

对于第一个问题,我们需要使用 hexedit 工具来正确理解 ELF 文件。

对于第二个问题 - strtab 代表字符串表 shstrtab 代表节头字符串表。

当我们读取 ELF 头时,我们可以看到每个 ElfHeader 结构都包含一个名为 e_shstrndx 的成员。这是指向 shstrtab 的索引。如果您使用此索引,然后从 shstrtab 中读取,您可以找到该节的名称。

strtab 是所有其他引用的字符串表。当您从 ELF 对象读取符号时,每个符号结构(Elf32_Sym)都有一个名为 st_name 的成员。这是进入 strtab 获取该符号的字符串名称的索引。

请详细说明一下符号字符串数组?还有,名称表是什么意思?

您可以参考以下链接 - 在C中从Linux读取ELF字符串表

希望这回答了您的问题。


谢谢。您能否举个例子,说明什么是“其他引用”?节名称呢?它们也出现在strtab中吗? - user1479376
抱歉离开了几天。节名称存储在.shstrtab中。其他所有引用都指存储在DIE块中的符号。 - Samir Baid
不,没有要求除节名称外的所有字符串都必须使用.strtab。实际上,这通常是不正确的:用于动态链接的符号名称通常在单独的字符串表.dynstr中。对于符号表(类型为SHT_SYMTAB的节),节条目的sh_link字段将指向正确的字符串表节。 - Alex Shpilkin

0

我来回答第一个问题,因为Samir已经很好地回答了第二个问题。

符号的名称将在其中一个STRTAB部分中,然后符号表中会有一个条目(SYMTABDYNSYM部分之一),该条目通过包含部分中的偏移量引用该字符串。符号表中的条目可以告诉您找到此符号的部分的索引,但无法告识您它在哪里被使用。

为此,您需要检查包含类型为REL的节中的重定位表;常见名称包括.rel.dyn.rel.plt。重定位表列出了另一个代码部分中对符号的所有引用,即代码和重定位部分是成对的。表中的每个条目都是符号的一个“用法”,并包含相应部分中使用的偏移量以及符号表中的符号索引。

如果您可以使用readelf实用程序,则可以轻松使用readelf -r <binary> | grep <symbol name>获取对符号的所有引用。

如果您坚持使用hexedit/无法使用readelf,则需要:
1. 找到二进制文件中符号名称字符串的偏移量,所在的节以及该节中该字符串的偏移量; 2. 查找符号表中所有条目,找到与该名称匹配的条目(st_name == 字符串在字符串节中的偏移量); 3. 查找每个重定位表中的所有条目,以查找相应表格的代码节中该符号的符号用法。每个条目的r_info字段包含它引用的符号表条目的索引(此索引对于32位和64位位于不同位置,并且被位图化为r_info的一部分)。
所有与该符号表索引匹配的重定位条目都是某处使用您的字符串的地方。
更多信息:
符号表:https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-79797.html 重定位表:https://docs.oracle.com/cd/E19683-01/816-1386/6m7qcoblj/index.html#chapter6-54839

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接