.gnu.hash和.hash 这两个section都是以.dynsym中符号的符号名为键值的哈希表,主要用于向加载器提供按名字快速查找特定符号的功能。两种哈希表结构上的设计有所不同,查找效率也有区别。一般来说,.gnu.hash的符号查找效率更高,其结构设计也更复杂。本文中初步看一下.hash这种哈希表的结构,后面LLD链接器的相关文章中...
constElf64_Addr *bitmask = l->l_gnu_bitmask;// l->l_gnu_bitmask_idxbits = bitmask_nwords - 1,将取模变为取与// (new_hash / __ELF_NATIVE_CLASS) & l->l_gnu_bitmask_idxbits = 174Elf64_Addr bitmask_word = bitmask[(new_hash / __ELF_NATIVE_CLASS) & l->l_gnu_bitmask_idxbit...
.hash //旧版,可以查导入和导出函数 DT_HASH .gnu.hash //新版,只能查导出函数 DT_GNU_HASH ELF Hash Hash表定义如下 struct ELFHash { uint32_t nbucket; //bucket的数目 uint32_t nchain; //chain的数目,和动态符号表的符号数相同 uint32_t buckets[]; //nbucket个项的数组 uint32_t chains[]...
l_gnu_chain_zero:符号哈希值的开始地址 l_gnu_bitmask_idxbits:为对bitmask_nwords取模化为取与,由bitmask_nwords-1而来 为了便于理解,将.gnu.hash节中的内容画成示意图: 以libc为例。检查对应字段的值: $ objdump -s /lib/x86_64-linux-gnu/libc.so.6 | grep .gnu.hash -A 5 Contents of section...
哈希表可用于查询导出函数, 有两种, 目前的elf文件主要是用GNU HASH表作为导出表。 .hash //旧版,可以查导入和导出函数 DT_HASH .gnu.hash //新版,只能查导出函数 DT_GNU_HASH ELF Hash Hash表定义如下 struct ELFHash { uint32_t nbucket; //bucket的数目 uint32_t nchain; //chain的数目,和动态符...
查找GNU Hash表的示意图如下: chain表的虚线部分并不存在 除了导出符号之外的符号chain表并无必要保存,但chain表的索引和符号表要一一对应 所以chain表的理论起始地址=buckets+nbucket-symndx 但在文件的排列上,各项是连续的,chains有效内容仍然在buckets后方 ...
使用哈希表可以加快动态符号表的查找速度。哈希表就是DT_HASH的节,看下实际例子的输出,命令是readelf --gnu-hash-table: image.png 内容比较多,忽略了一部分,接下来看下结构: image.png 对应的哈希函数如下: image.png 一个哈希表需要解决如何快速查找,如何解决冲突的问题。 看看hash 表如何快速查找,这儿用到了...
000000000012935a0000000000000002 A 3 0 2[5].gnu.version_r VERNEED 0000000000f17ec4 00f17ec40000000000000080 0000000000000000 A 8 4 4[6].gnu.hash GNU_HASH 0000000000f17f48 00f17f48 00000000003e61c80000000000000000 A 3 0 8[7].hash HASH 00000000012fe110 012fe110 ...
Search or jump to... Search code, repositories, users, issues, pull requests... Provide feedback We read every piece of feedback, and take your input very seriously. Include my email address so I can be contacted Cancel Submit feedback Saved searches Use saved searches to filter your...
if (si->nbucket == 0) { //DT_HASH 是必须的. DL_ERR("empty/missing DT_HASH in \"%s\" (built with --hash-style=gnu?)", si->name); return false; } if (si->strtab == 0) {// DT_STRTAB 是必须的. DL_ERR("empty/missing DT_STRTAB in \"%s\"", si->name); return false...