28 lines
747 B
C
28 lines
747 B
C
|
#include <common.h>
|
||
|
#include <debug.h>
|
||
|
#include <libelf.h>
|
||
|
#include <hash.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
int hash_lookup(Elf *elf,
|
||
|
Elf_Data *hash,
|
||
|
Elf_Data *symtab,
|
||
|
Elf_Data *symstr,
|
||
|
const char *symname) {
|
||
|
Elf32_Word *hash_data = (Elf32_Word *)hash->d_buf;
|
||
|
Elf32_Word index;
|
||
|
Elf32_Word nbuckets = *hash_data++;
|
||
|
Elf32_Word *buckets = ++hash_data;
|
||
|
Elf32_Word *chains = hash_data + nbuckets;
|
||
|
|
||
|
index = buckets[elf_hash(symname) % nbuckets];
|
||
|
while (index != STN_UNDEF &&
|
||
|
strcmp((char *)symstr->d_buf +
|
||
|
((Elf32_Sym *)symtab->d_buf)[index].st_name,
|
||
|
symname)) {
|
||
|
index = chains[index];
|
||
|
}
|
||
|
|
||
|
return index;
|
||
|
}
|