12

我正在研究解释.dynsymELF 可执行文件的动态符号表 ()。我可以成功地解释符号表.symtab(每个符号 16 个字节),使用value属性表示符号的地址,使用属性name表示节中字符串开头的偏移量.strtab。但我无法.dynsym使用相同的方法解释动态符号表 ()。我参考了阿里的博客[1]。

我查看了 Ali 的 [2] 的另一个博客,但我不明白如何使用哈希表解释动态符号表。显然,它与符号表使用的映射不同。我应该如何解释动态符号表(.dynsym)?

此外,我正在查看的 ELF 可执行文件有两个部分,即.hash.gnu.hash. 我应该参考哪个部分的哈希值?

[1] http://blogs.oracle.com/ali/entry/inside_elf_symbol_tables
[2] http://blogs.oracle.com/ali/entry/gnu_hash_elf_sections

4

2 回答 2

5

根据 ELF 规范,每个符号都使用以下结构定义:

typedef struct {
      Elf32_Word
      Elf32_Addr
      Elf32_Word
      unsigned char
      unsigned char
      Elf32_Half
} Elf32_Sym;

所以一般来说这将是 16 个字节。动态和静态符号表使用相同的结构,所以解析这个表对于静态和链接是一样的。当然,这些值的含义并不总是相同的。

您可以通过两种方式访问​​符号表中的符号。首先,如果您已经知道符号索引,则可以转到该索引。但有时你没有符号索引,你只有一个符号名称,实际上你想检查符号表是否有一个具有该名称的符号的定义。在第二种情况下,您使用哈希部分。这些用于快速检查符号表中是否存在符号:symbol-name-> hash-> symb_index-> check if symbol_table[symb_index] == symbol-name

于 2012-10-01T02:04:44.377 回答
3

但我无法使用相同的方法解释动态符号表(.dynsym)。

您需要在该.dynstr部分中查找字符串。

此外,我正在查看的 ELF 可执行文件有两个部分,即 .hash 和 .gnu.hash。我应该参考哪个部分的哈希值?

这取决于您希望查找的符号类型。据我所知,GNU 风格的哈希表只包含与动态链接相关的信息。

另请参阅:Jakub Jelinek对 GNU 哈希表的描述,发布在 GNU binutils 邮件列表上。

于 2011-08-23T04:48:05.777 回答