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

12
我正在研究如何解析 ELF 可执行文件的动态符号表(.dynsym)。我已经成功地解析了符号表 .symtab(每个符号占用 16 字节),使用 value 属性来表示符号的地址,name 属性来表示字符串在 .strtab 段中的偏移量。但是,我无法使用同样的方法解析动态符号表(.dynsym)。我参考了 Ali 的博客[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

好的,我已经等了一天了,但是没有收到任何评论/答案。我该得出什么结论?:-/ - Hrishikesh Murali
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 -> 检查symbol_table[symb_index] == symbol-name


这是不正确的,因为Elf32_Half是2个字节,而不是4个字节,所以:4+4+4+1+1+2=16个字节。此外,值得注意的是,在ELFCLASS64(x86-64)中,这是24个字节。 - krb686

4

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

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

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

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

另请参阅:Jakub Jelinek 在 GNU binutils邮件列表 上发布的 GNU哈希表说明


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