Some more fixes for the unique symbol handling.
authorUlrich Drepper <drepper@redhat.com>
Thu, 23 Jul 2009 14:36:34 +0000 (07:36 -0700)
committerUlrich Drepper <drepper@redhat.com>
Thu, 23 Jul 2009 14:36:34 +0000 (07:36 -0700)
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.

ChangeLog
elf/dl-lookup.c

index bea7ba0..5dc5d41 100644 (file)
--- 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.
index bdc84af..1333123 100644 (file)
@@ -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);