diff options
author | Ulrich Drepper <drepper@redhat.com> | 2009-07-23 07:36:34 -0700 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2009-07-23 07:36:34 -0700 |
commit | 077e7700b30df967d9000ebe692894fc5d66df80 (patch) | |
tree | 79e8781e5ddf99ed2efe5ec9185a65f158420055 | |
parent | 802fe9a1ca0577e8eac28c31a8c20497b15e7e69 (diff) | |
download | glibc-077e7700b30df967d9000ebe692894fc5d66df80.tar.gz glibc-077e7700b30df967d9000ebe692894fc5d66df80.tar.xz glibc-077e7700b30df967d9000ebe692894fc5d66df80.zip |
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.
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | elf/dl-lookup.c | 9 |
2 files changed, 7 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog index bea7ba0e2d..5dc5d41433 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 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 unique symbol definition. Patch by Jakub Jelinek. diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index bdc84afa56..1333123b0f 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -318,7 +318,7 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash, size_t hash2 = 1 + hash % (size - 2); while (1) { - if (table[idx].hashval == 0) + if (table[idx].name == NULL) { table[idx].hashval = hash; 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) /* Make sure we don't unload this object by artificially increason the open count. */ - ++table[idx].map->l_direct_opencount; + table[idx].map->l_flags_1 |= DF_1_NODELETE; return; } @@ -369,8 +369,7 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash, return 1; } - if (entries[idx].hashval == 0 - && entries[idx].name == NULL) + if (entries[idx].name == NULL) break; idx += hash2; @@ -392,7 +391,7 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash, } for (idx = 0; idx < size; ++idx) - if (entries[idx].hashval != 0) + if (entries[idx].name != NULL) enter (newentries, newsize, entries[idx].hashval, entries[idx].name, entries[idx].sym, entries[idx].map); |