This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Fix 16846, LTO mismatched TLS reference


On Wed, Apr 16, 2014 at 08:16:28AM -0700, H.J. Lu wrote:
> On Wed, Apr 16, 2014 at 2:44 AM, Alan Modra <amodra@gmail.com> wrote:
> > I think this is all we need to fix pr16848.  HJ, do you see anything
> > more we should do here?  I'm wondering why we have type_change_ok
> > when oldbfd is the plugin.
> 
> It is because there is no symbol type in plugin.

That is precisely why you should *not* need to set type_change_ok!
If the old symbol is STT_NOTYPE, then it will not cause a warning
that "type of symbol ... changed".  The following seems to be good,
but I wanted to ask you first since this is your code..

	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.

diff --git a/bfd/elflink.c b/bfd/elflink.c
index 3de00e1..6756fb1 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -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;

-- 
Alan Modra
Australia Development Lab, IBM


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]