2011-08-18 81 views
9

我在看解释ELF可执行文件的动态符号表(.dynsym)。我可以成功地解释使用“值”属性来表示符号的地址和“名称”的符号表的.symtab(针对每个符号16个字节)的属性来表示字符串的开头的在.strtab偏移部分。但我无法使用相同的方法来解释动态符号表(.dynsym)。我用阿里的博客[1]作为参考。如何解释ELF可执行文件中的动态符号表?

我看着阿里的[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穆拉利

+0

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

回答

2

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

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

另外,我正在看的ELF可执行文件有两个部分,分别是 即.hash和.gnu.hash。我参考了哪个部分的散列 值?

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

另见:Jakub Jelinek的description of GNU hash tables,贴在GNU binutils mailing list上。

3

从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] ==符号名称。

+0

这是不正确的,因为* Elf32_Half *是2个字节,而不是4,给出:4 + 4 + 4 + 1 + 1 + 2 = 16个字节。另外,值得注意的是,用* ELFCLASS64 *(x86-64),这是24个字节。 – krb686

+0

我相信你是对的。我会纠正的。 – JohnTortugo

相关问题