Fix LTO mismatched TLS reference
authorAlan Modra <amodra@gmail.com>
Thu, 17 Apr 2014 03:38:32 +0000 (13:08 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 17 Apr 2014 03:40:35 +0000 (13:10 +0930)
PR 16846
* elflink.c (_bfd_elf_merge_symbol): Ignore TLS mismatch when
current bfd is a plugin.  Don't always set type_change_ok
when old bfd is a plugin.

bfd/ChangeLog
bfd/elflink.c

index c9af9da..bf71f22 100644 (file)
@@ -1,3 +1,10 @@
+2014-04-17  Alan Modra  <amodra@gmail.com>
+
+       PR 16846
+       * elflink.c (_bfd_elf_merge_symbol): Ignore TLS mismatch when
+       current bfd is a plugin.  Don't always set type_change_ok
+       when old bfd is a plugin.
+
 2014-04-16  Tristan Gingold  <gingold@adacore.com>
 
        * mach-o-x86-64.c (bfd_mach_o_x86_64_mkobject): Adjust cpusubtype
index 3de00e1..6756fb1 100644 (file)
@@ -1105,15 +1105,14 @@ _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".  */
-  else if (oldbfd != NULL
-          && ELF_ST_TYPE (sym->st_info) != h->type
-          && (ELF_ST_TYPE (sym->st_info) == STT_TLS || h->type == STT_TLS))
+  /* Check TLS symbols.  We don't check undefined symbols introduced
+     by "ld -u" which have no type (and oldbfd NULL), and we don't
+     check symbols from plugins because they also have no type.  */
+  if (oldbfd != NULL
+      && (oldbfd->flags & BFD_PLUGIN) == 0
+      && (abfd->flags & BFD_PLUGIN) == 0
+      && 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;