【问题标题】:How to interpret the dynamic symbol table in an ELF executable?如何解释 ELF 可执行文件中的动态符号表?
【发布时间】:2011-10-29 12:15:44
【问题描述】:

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

我看了另一个阿里的博客 [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

【问题讨论】:

  • 好的,我已经等了一天的评论/答案,但我没有任何意见。我得出什么结论? :-/

标签: dynamic elf symbol-table


【解决方案1】:

根据 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 个字节。
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-08-25
    • 1970-01-01
    • 2015-12-20
    • 2011-01-20
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2014-12-05
    相关资源
    最近更新 更多