关于ELF _DYNAMIC符号表条目数及动态表相关疑问的技术问询
关于ELF _DYNAMIC相关问题的解答
1. ELF _DYNAMIC符号表的条目数是多少?
_DYNAMIC本身并没有直接提供动态符号表(.dynsym)的条目数字段。要获取这个数值,有两种可靠的方式:
- 查看程序头表(Program Header Table)中对应
.dynsym段的p_memsz字段,用这个总字节数除以DT_SYMENT(动态符号表条目的字节大小),就能得到条目数。 - 借助哈希表相关的动态标签(比如
DT_HASH)推导:哈希表的第一个4字节是桶的数量,第二个4字节是链的数量,而链的数量恰好等于动态符号表的条目数(注意这里包含了第一个空符号条目)。
2. 关于_DYNAMIC标签的两个疑问
疑问一:DT_SYMTAB和DT_STRTAB对应的表是否为.dynsym和.dynstr?
完全正确!
DT_SYMTAB指向的就是动态符号表.dynsym的起始地址,这个表只包含动态链接必需的符号(不像.symtab包含所有符号)。DT_STRTAB指向的就是动态字符串表.dynstr的起始地址,专门用来存储.dynsym中符号的名称字符串。
疑问二:能否用「字符串表地址 - 符号表地址」除以DT_SYMENT来计算条目数?
绝对不建议这么做,因为.dynsym和.dynstr之间可能存在其他数据(比如.hash/.gnu.hash哈希表、或者其他动态段内容),两者的地址差并不等于动态符号表的总字节大小,这样计算出来的结果必然是错误的。
正确的做法还是参照第一个问题里的两种方法:要么通过程序头表的p_memsz计算,要么通过DT_HASH标签里的链数量来获取。
内容的提问来源于stack exchange,提问作者ezegoing
相关产品推荐
相关产品推荐

