referenced:https://flapenguin.me/elf-dt-gnu-hash
Let's start with the hashing function. It can be found in bfd_elf_gnu_hash or in dl_new_hash.
#include <stdint.h>
uint32_t gnu_hash(const uint8_t* name) {
uint32_t h = 5381;
for (; *name; name++) {
h = (h << 5) + h + *name;
}
return h;
}
gnu_hash("") == 0x00001505
gnu_hash("printf") == 0x156b2bb8
gnu_hash("exit") == 0x7c967e3f
gnu_hash("syscall") == 0xbac212a0
struct gnu_hash_table {
uint32_t nbuckets;
uint32_t symoffset;
uint32_t bloom_size;
uint32_t bloom_shift;
uint64_t bloom[bloom_size]; /* uint32_t for 32-bit binaries */
uint32_t buckets[nbuckets];
uint32_t chain[];
};