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...
一个符号的相关信息会在ELF文件中dynamic section的三块出现:.gnu.hash对应的符号哈希,.dynsym对应的动态符号表,.dynstr对应的字符表。在查找符号时,动态链接器首先从.gnu.hash中进行查询,得到该符号在动态符号表中的偏移。动态链接器根据这个偏移读出一个符号,并找到这个符号的名字在字符表中的偏移。从字符表中读出...
哈希表就是DT_HASH的节,看下实际例子的输出,命令是readelf --gnu-hash-table: image.png 内容比较多,忽略了一部分,接下来看下结构: image.png 对应的哈希函数如下: image.png 一个哈希表需要解决如何快速查找,如何解决冲突的问题。 看看hash 表如何快速查找,这儿用到了一个Bloom Filter, 本质上就是在查找前先...
*/ #define SHT_GNU_HASH 0x6ffffff6 /* GNU-style hash table. */ #define SHT_GNU_LIBLIST 0x6ffffff7 /* Prelink library list */ #define SHT_CHECKSUM 0x6ffffff8 /* Checksum for DSO content. */ #define SHT_LOSUNW 0x6ffffffa /* Sun-specific low bound. */ #define SHT_SUNW_move...
[ 8] .note.gnu.propert NOTE 0000000000000000 000000b0 0000000000000020 0000000000000000 A 0 0 8 [ 9] .eh_frame PROGBITS 0000000000000000 000000d0 0000000000000038 0000000000000000 A 0 0 8 [10] .rela.eh_frame RELA 0000000000000000 000002d0
这个字段指定了节的用途,例如PROGBITS表示这个节保存着程序定义的数据,如代码或初始化数据;GNU_HASH表示这个节保存着GNU版本的符号哈希表;DYNSYM表示这个节保存着动态符号表,里面包含着动态链接时使用的符号。 sh_flags:节的标志。这是一个位掩码,用于指定节的属性,比如是否可写、是否可执行、是否分配内存等。 sh_...
.hash节有时也称为.gnu.hahs,保存了一个用于查找符号的散列表。 .symtab节保存了ElfN_Sym类型的符号信息,因此节类型被标记为SHT_SYMTAB。 .strtab节保存的是符号字符串表,表中的内容会被.symtab的ElfN_Sym结构中的st_name条目引用。由于其保存了字符串表,因此节类型被标记为SHT_STRTAB。
02 .interp .note.ABI-tag .dynsym .gnu.version .gnu.version_r .gnu.hash .dynstr .rela.dyn .rela.plt .rodata .gcc_except_table .eh_frame_hdr .eh_frame 03 .text .init .fini malloc_hook google_malloc .plt 04 .tdata .fini_array .init_array .data.rel.ro .dynamic .got .got.plt ...
00 .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame 01 .ctors .dtors .jcr .data.rel.ro .dynamic .got .got.plt .bss 02 .dynamic 03 .eh_frame_hdr 04 这里可知,做为共享目标文件的动态库,它程序头...
02.interp.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.plt.got.text.fini.rodata.eh_frame_hdr.eh_frame 03.init_array.fini_array.data.rel.ro.dynamic.got.data.bss 04.dynamic ...