我正在研究解释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
答案 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上。