| #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; |
| } |