diff options
Diffstat (limited to 'tools/lsd/hash.c')
-rw-r--r-- | tools/lsd/hash.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/tools/lsd/hash.c b/tools/lsd/hash.c new file mode 100644 index 000000000..bbac6751b --- /dev/null +++ b/tools/lsd/hash.c @@ -0,0 +1,29 @@ +#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; +} |