12
  1. 我得到了一些符号,并且得到了一个 ELF 文件(一个十六进制转储)。我怎么知道这个符号出现在哪个部分?

  2. .strtab和 和有什么不一样.shstrtab?是否还有另一个符号字符串数组?

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

4

2 回答 2

15

对于第一个问题,我们需要 elf 文件的 hexedit 才能正确理解。

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

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

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

您能否详细说明符号字符串数组?另外,名称表是什么意思?

您可以参考以下链接 - Reading ELF String Table on Linux from C

希望这能回答你的问题。

于 2012-07-03T13:35:58.997 回答
0

我将在第一个问题上试一试,因为 Samir 回答了第二个问题。

符号的名称将在其中一个STRTAB部分中,然后在符号表(SYMTABDYNSYM部分之一)中将有一个条目,该条目通过包含部分中的偏移量引用该字符串。符号表中的条目可以告诉您该符号所在部分的索引,但不能告诉您使用它的位置。

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

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

如果您设置为使用 hexedit/不能使用 readelf,那么您需要

  1. 找到符号名字符串在二进制中的偏移量,在哪个段,然后得到那个字符串在那个段的偏移量;

  2. 查看符号表中的所有条目并找到与该名称匹配的条目(st_name== 字符串部分中字符串的偏移量);

  3. 查看每个重定位表中的所有条目,以在该表的相应代码段中查找该符号的符号用法。每个条目的r_info字段包含它引用的符号表条目的索引(此索引被位映射到 的一部分r_info,并且在 32 位和 64 位的不同位置)。

与该符号表索引匹配的所有重定位条目都是您的字符串在某处的用法。

更多信息:

于 2021-10-04T16:55:20.077 回答