From 4c34aff883e4fcc958a2d2c98874a035efc07651 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 17 Apr 2014 13:08:32 +0930 Subject: [PATCH] Fix LTO mismatched TLS reference 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 | 7 +++++++ bfd/elflink.c | 17 ++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index c9af9daca46..bf71f227c89 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2014-04-17 Alan Modra + + 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 * mach-o-x86-64.c (bfd_mach_o_x86_64_mkobject): Adjust cpusubtype diff --git a/bfd/elflink.c b/bfd/elflink.c index 3de00e10eee..6756fb1312c 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; -- 2.30.2