libdyld: fix dyld_lookup algorithm.

This commit is contained in:
whitequark 2015-08-01 17:21:31 +03:00
parent d43e470e3c
commit 3f7f0a3151
1 changed files with 5 additions and 7 deletions

View File

@ -154,13 +154,11 @@ static unsigned long elf_hash(const unsigned char *name)
void *dyld_lookup(const char *symbol, struct dyld_info *info) { void *dyld_lookup(const char *symbol, struct dyld_info *info) {
unsigned hash = elf_hash((const unsigned char*) symbol); unsigned hash = elf_hash((const unsigned char*) symbol);
unsigned index = info->hash.bucket[hash % info->hash.nbucket]; unsigned index = info->hash.bucket[hash % info->hash.nbucket];
while(strcmp(&info->strtab[info->symtab[index].st_name], symbol) && while(strcmp(&info->strtab[info->symtab[index].st_name], symbol)) {
info->hash.chain[index] != STN_UNDEF) if(index == STN_UNDEF)
index = info->hash.chain[index];
if(info->hash.chain[index] != STN_UNDEF) {
return (void*)(info->base + info->symtab[index].st_value);
} else {
return NULL; return NULL;
index = info->hash.chain[index];
} }
return (void*)(info->base + info->symtab[index].st_value);
} }