Some more fixes for the unique symbol handling.

The hash value can be zero, so we need a different test for empty
slots.  And unify the way we prevent a DSO from being unloaded.
This commit is contained in:
Ulrich Drepper 2009-07-23 07:36:34 -07:00
parent 802fe9a1ca
commit 077e7700b3
2 changed files with 7 additions and 5 deletions

View File

@ -1,5 +1,8 @@
2009-07-23 Ulrich Drepper <drepper@redhat.com> 2009-07-23 Ulrich Drepper <drepper@redhat.com>
* elf/dl-lookup.c (dl_lookup_x): The hashval for unique symbol can
potentially be zero.
* elf/tst-unique1.c: Extend test to check for unloading DSO with * elf/tst-unique1.c: Extend test to check for unloading DSO with
unique symbol definition. unique symbol definition.
Patch by Jakub Jelinek. Patch by Jakub Jelinek.

View File

@ -318,7 +318,7 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
size_t hash2 = 1 + hash % (size - 2); size_t hash2 = 1 + hash % (size - 2);
while (1) while (1)
{ {
if (table[idx].hashval == 0) if (table[idx].name == NULL)
{ {
table[idx].hashval = hash; table[idx].hashval = hash;
table[idx].name = strtab + sym->st_name; table[idx].name = strtab + sym->st_name;
@ -336,7 +336,7 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
if (table[idx].map->l_type == lt_loaded) if (table[idx].map->l_type == lt_loaded)
/* Make sure we don't unload this object by /* Make sure we don't unload this object by
artificially increason the open count. */ artificially increason the open count. */
++table[idx].map->l_direct_opencount; table[idx].map->l_flags_1 |= DF_1_NODELETE;
return; return;
} }
@ -369,8 +369,7 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
return 1; return 1;
} }
if (entries[idx].hashval == 0 if (entries[idx].name == NULL)
&& entries[idx].name == NULL)
break; break;
idx += hash2; idx += hash2;
@ -392,7 +391,7 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
} }
for (idx = 0; idx < size; ++idx) for (idx = 0; idx < size; ++idx)
if (entries[idx].hashval != 0) if (entries[idx].name != NULL)
enter (newentries, newsize, entries[idx].hashval, enter (newentries, newsize, entries[idx].hashval,
entries[idx].name, entries[idx].sym, entries[idx].name, entries[idx].sym,
entries[idx].map); entries[idx].map);