* bfd/elflink.c (_bfd_elf_merge_symbol): Tighten up the test for early
authorMatthew Gretton-Dann <matthew.gretton-dann@arm.com>
Wed, 14 Apr 2010 08:29:33 +0000 (08:29 +0000)
committerMatthew Gretton-Dann <matthew.gretton-dann@arm.com>
Wed, 14 Apr 2010 08:29:33 +0000 (08:29 +0000)
exit due to merging the same weak symbol to test that the symbols are
actually weak.

bfd/ChangeLog
bfd/elflink.c

index b56b279eb85db4189c8c900a4b0c164db8cf4574..3ec74f2201bf5fbd2f5598e6a44b788a3b69156c 100644 (file)
@@ -1,3 +1,9 @@
+2010-04-14  Matthew Gretton-Dann  <matthew.gretton-dann@arm.com>
+
+       * elflink.c (_bfd_elf_merge_symbol): Tighten up the test for early
+       exit due to merging the same weak symbol to test that the symbols are
+       actually weak.
+
 2010-04-13  Alan Modra  <amodra@gmail.com>
 
        * elf64-ppc.c (ppc64_elf_relocate_section): Correct NOP location
index 98ea753579630ebaffefcac0abc0ba384164dc49..f445912dc98e50968deaed1e99ff78aff0c6f1e3 100644 (file)
@@ -1013,6 +1013,11 @@ _bfd_elf_merge_symbol (bfd *abfd,
       break;
     }
 
+  /* Differentiate strong and weak symbols.  */
+  newweak = bind == STB_WEAK;
+  oldweak = (h->root.type == bfd_link_hash_defweak
+            || h->root.type == bfd_link_hash_undefweak);
+
   /* In cases involving weak versioned symbols, we may wind up trying
      to merge a symbol with itself.  Catch that here, to avoid the
      confusion that results if we try to override a symbol with
@@ -1020,6 +1025,7 @@ _bfd_elf_merge_symbol (bfd *abfd,
      _GLOBAL_OFFSET_TABLE_, which are regular symbols defined in a
      dynamic object, which we do want to handle here.  */
   if (abfd == oldbfd
+      && (newweak || oldweak)
       && ((abfd->flags & DYNAMIC) == 0
          || !h->def_regular))
     return TRUE;
@@ -1241,11 +1247,6 @@ _bfd_elf_merge_symbol (bfd *abfd,
       return TRUE;
     }
 
-  /* Differentiate strong and weak symbols.  */
-  newweak = bind == STB_WEAK;
-  oldweak = (h->root.type == bfd_link_hash_defweak
-            || h->root.type == bfd_link_hash_undefweak);
-
   if (bind == STB_GNU_UNIQUE)
     h->unique_global = 1;