如何解释ELF可执行文件中的动态符号表?

时间:2011-08-18 06:17:20

标签: dynamic elf symbol-table

我正在研究解释ELF可执行文件的动态符号表(.dynsym)。我可以使用.symtab属性成功解释符号表value(每个符号16个字节)以表示符号的地址,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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:2)

  

但是我无法解释动态符号表(.dynsym)   同样的方法。

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

  

另外,我正在查看的ELF可执行文件有两个部分,   即.hash和.gnu.hash。我在哪个部分引用哈希   值?

这取决于你想要查找的符号种类。据我所知, GNU样式哈希表仅包含与动态链接相关的信息。

另请参阅:Jakub Jelinek的description of GNU hash tables,发布在GNU binutils mailing list上。