Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 26 Mar 2003 05:55:17 +0000 (05:55 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 26 Mar 2003 05:55:17 +0000 (05:55 +0000)
2003-03-25  H.J. Lu  <hjl@gnu.org>

* elf/dl-lookup.c (_dl_lookup_symbol): Avoid looking up protected
symbols twice.
(_dl_lookup_versioned_symbol): Likewise.

ChangeLog
elf/dl-lookup.c

index 0de4810..e849b38 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2003-03-25  H.J. Lu  <hjl@gnu.org>
+
+       * elf/dl-lookup.c (_dl_lookup_symbol): Avoid looking up protected
+       symbols twice.
+       (_dl_lookup_versioned_symbol): Likewise.
+
 2003-03-26  Jakub Jelinek  <jakub@redhat.com>
 
        * csu/tst-atomic.c (do_test): Add some new
index 4603761..2b74736 100644 (file)
@@ -273,17 +273,30 @@ _dl_lookup_symbol (const char *undef_name, struct link_map *undef_map,
     {
       /* It is very tricky.  We need to figure out what value to
          return for the protected symbol.  */
-      struct sym_val protected_value = { NULL, NULL };
-
-      for (scope = symbol_scope; *scope; ++scope)
-       if (_dl_do_lookup (undef_name, hash, *ref, &protected_value, *scope,
-                          0, flags, NULL, ELF_RTYPE_CLASS_PLT))
-         break;
-
-      if (protected_value.s != NULL && protected_value.m != undef_map)
+      if (type_class == ELF_RTYPE_CLASS_PLT)
        {
-         current_value.s = *ref;
-         current_value.m = undef_map;
+         if (current_value.s != NULL && current_value.m != undef_map)
+           {
+             current_value.s = *ref;
+             current_value.m = undef_map;
+           }
+       }
+      else
+       {
+         struct sym_val protected_value = { NULL, NULL };
+
+         for (scope = symbol_scope; *scope; ++scope)
+           if (_dl_do_lookup (undef_name, hash, *ref,
+                              &protected_value, *scope, 0, flags,
+                              NULL, ELF_RTYPE_CLASS_PLT))
+             break;
+
+         if (protected_value.s != NULL
+             && protected_value.m != undef_map)
+           {
+             current_value.s = *ref;
+             current_value.m = undef_map;
+           }
        }
     }
 
@@ -465,18 +478,31 @@ _dl_lookup_versioned_symbol (const char *undef_name,
     {
       /* It is very tricky.  We need to figure out what value to
          return for the protected symbol.  */
-      struct sym_val protected_value = { NULL, NULL };
-
-      for (scope = symbol_scope; *scope; ++scope)
-       if (_dl_do_lookup_versioned (undef_name, hash, *ref, &protected_value,
-                                    *scope, 0, version, NULL,
-                                    ELF_RTYPE_CLASS_PLT))
-         break;
-
-      if (protected_value.s != NULL && protected_value.m != undef_map)
+      if (type_class == ELF_RTYPE_CLASS_PLT)
        {
-         current_value.s = *ref;
-         current_value.m = undef_map;
+         if (current_value.s != NULL && current_value.m != undef_map)
+           {
+             current_value.s = *ref;
+             current_value.m = undef_map;
+           }
+       }
+      else
+       {
+         struct sym_val protected_value = { NULL, NULL };
+
+         for (scope = symbol_scope; *scope; ++scope)
+           if (_dl_do_lookup_versioned (undef_name, hash, *ref,
+                                        &protected_value,
+                                        *scope, 0, version, NULL,
+                                        ELF_RTYPE_CLASS_PLT))
+             break;
+
+         if (protected_value.s != NULL
+             && protected_value.m != undef_map)
+           {
+             current_value.s = *ref;
+             current_value.m = undef_map;
+           }
        }
     }