summaryrefslogtreecommitdiffstats
path: root/tools/lsd/hash.c
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-03-03 19:28:42 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2009-03-03 19:28:42 -0800
commit88b607994a148f4af5bffee163e39ce8296750c6 (patch)
treefa249ff843e976cf034f2029437d3362a8396321 /tools/lsd/hash.c
parent05806d7af62e07c6225b2e7103a1b115ecf6c9ad (diff)
downloadbuild-88b607994a148f4af5bffee163e39ce8296750c6.zip
build-88b607994a148f4af5bffee163e39ce8296750c6.tar.gz
build-88b607994a148f4af5bffee163e39ce8296750c6.tar.bz2
auto import from //depot/cupcake/@135843
Diffstat (limited to 'tools/lsd/hash.c')
-rw-r--r--tools/lsd/hash.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/tools/lsd/hash.c b/tools/lsd/hash.c
new file mode 100644
index 0000000..bbac675
--- /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;
+}