* elflink.c (_bfd_elf_merge_symbol): Allow type changes for
authorAlan Modra <amodra@gmail.com>
Tue, 21 Jun 2011 14:55:26 +0000 (14:55 +0000)
committerAlan Modra <amodra@gmail.com>
Tue, 21 Jun 2011 14:55:26 +0000 (14:55 +0000)
plugin symbols.  Fix segfault on linker scrip defined syms.

bfd/ChangeLog
bfd/elflink.c

index 327f83b..48fe504 100644 (file)
@@ -1,3 +1,8 @@
+2011-06-22  Alan Modra  <amodra@gmail.com>
+
+       * elflink.c (_bfd_elf_merge_symbol): Allow type changes for
+       plugin symbols.  Fix segfault on linker scrip defined syms.
+
 2011-06-20  Jakub Jelinek  <jakub@redhat.com>
 
        PR ld/12570
index a4b7a7a..b518da8 100644 (file)
@@ -1080,11 +1080,15 @@ _bfd_elf_merge_symbol (bfd *abfd,
       return TRUE;
     }
 
+  /* Plugin symbol type isn't currently set.  Stop bogus errors.  */
+  if (oldbfd != NULL && (oldbfd->flags & BFD_PLUGIN) != 0)
+    *type_change_ok = TRUE;
+
   /* Check TLS symbol.  We don't check undefined symbol introduced by
      "ld -u".  */
-  if ((ELF_ST_TYPE (sym->st_info) == STT_TLS || h->type == STT_TLS)
-      && ELF_ST_TYPE (sym->st_info) != h->type
-      && oldbfd != NULL)
+  else if (oldbfd != NULL
+          && ELF_ST_TYPE (sym->st_info) != h->type
+          && (ELF_ST_TYPE (sym->st_info) == STT_TLS || h->type == STT_TLS))
     {
       bfd *ntbfd, *tbfd;
       bfd_boolean ntdef, tdef;
@@ -1423,7 +1427,8 @@ _bfd_elf_merge_symbol (bfd *abfd,
   if (newdef && olddef && newweak)
     {
       /* Don't skip new non-IR weak syms.  */
-      if (!((oldbfd->flags & BFD_PLUGIN) != 0
+      if (!(oldbfd != NULL
+           && (oldbfd->flags & BFD_PLUGIN) != 0
            && (abfd->flags & BFD_PLUGIN) == 0))
        *skip = TRUE;