mirror of git://sourceware.org/git/glibc.git
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:
parent
802fe9a1ca
commit
077e7700b3
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue