Home | History | Annotate | Download | only in lsd
      1 #include <common.h>
      2 #include <debug.h>
      3 #include <libelf.h>
      4 #include <hash.h>
      5 #include <string.h>
      6 
      7 int hash_lookup(Elf *elf,
      8                 Elf_Data *hash,
      9                 Elf_Data *symtab,
     10                 Elf_Data *symstr,
     11                 const char *symname)
     12 {
     13     Elf32_Word *hash_data = (Elf32_Word *)hash->d_buf;
     14     Elf32_Word index;
     15     Elf32_Word nbuckets = *hash_data++;
     16     Elf32_Word *buckets = ++hash_data;
     17     Elf32_Word *chains  = hash_data + nbuckets;
     18 
     19     index = buckets[elf_hash(symname) % nbuckets];
     20     while(index != STN_UNDEF &&
     21           strcmp((char *)symstr->d_buf +
     22                  ((Elf32_Sym *)symtab->d_buf)[index].st_name,
     23                  symname))
     24     {
     25         index = chains[index];
     26     }
     27 
     28     return index;
     29 }
     30