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

Hri*_*ali 11 dynamic elf symbol-table

我正在寻找解释.dynsymELF可执行文件的动态符号表().我可以.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

Joh*_*ugo 5

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

typedef struct {
      Elf32_Word
      Elf32_Addr
      Elf32_Word
      unsigned char
      unsigned char
      Elf32_Half
} Elf32_Sym;
Run Code Online (Sandbox Code Playgroud)

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

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


jko*_*shy 4

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

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

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

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

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