This is the mail archive of the binutils-cvs@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]

[binutils-gdb] x86: Check the versioned __tls_get_addr symbol


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=8a1b824af786989f879ab1421a4279f60bba141a

commit 8a1b824af786989f879ab1421a4279f60bba141a
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Sat Jan 20 14:25:24 2018 -0800

    x86: Check the versioned __tls_get_addr symbol
    
    We need to check the versioned __tls_get_addr symbol when looking up
    "__tls_get_addr".
    
    bfd/
    
    	PR ld/22721
    	* elfxx-x86.c (_bfd_x86_elf_link_check_relocs): Check the
    	versioned __tls_get_addr symbol.
    
    ld/
    
    	PR ld/22721
    	* testsuite/ld-plugin/lto.exp: Run PR ld/22721 tests.
    	* testsuite/ld-plugin/pr22721.t: New file.
    	* testsuite/ld-plugin/pr22721a.s: Likewise.
    	* testsuite/ld-plugin/pr22721b.c: Likewise.

Diff:
---
 bfd/ChangeLog                     |  6 ++++++
 bfd/elfxx-x86.c                   | 11 ++++++++++-
 ld/ChangeLog                      |  8 ++++++++
 ld/testsuite/ld-plugin/lto.exp    | 26 ++++++++++++++++++++++++++
 ld/testsuite/ld-plugin/pr22721.t  |  7 +++++++
 ld/testsuite/ld-plugin/pr22721a.s |  8 ++++++++
 ld/testsuite/ld-plugin/pr22721b.c |  7 +++++++
 7 files changed, 72 insertions(+), 1 deletion(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 13c2ea6..3d07aac 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2018-01-20  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR ld/22721
+	* elfxx-x86.c (_bfd_x86_elf_link_check_relocs): Check the
+	versioned __tls_get_addr symbol.
+
 2018-01-19  Nick Clifton  <nickc@redhat.com>
 
 	* po/fr.po: Updated French translation.
diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
index a9ee4ba..a7db5d9 100644
--- a/bfd/elfxx-x86.c
+++ b/bfd/elfxx-x86.c
@@ -856,7 +856,16 @@ _bfd_x86_elf_link_check_relocs (bfd *abfd, struct bfd_link_info *info)
 				    htab->tls_get_addr,
 				    FALSE, FALSE, FALSE);
 	  if (h != NULL)
-	    elf_x86_hash_entry (h)->tls_get_addr = 1;
+	    {
+	      elf_x86_hash_entry (h)->tls_get_addr = 1;
+
+	      /* Check the versioned __tls_get_addr symbol.  */
+	      while (h->root.type == bfd_link_hash_indirect)
+		{
+		  h = (struct elf_link_hash_entry *) h->root.u.i.link;
+		  elf_x86_hash_entry (h)->tls_get_addr = 1;
+		}
+	    }
 
 	  /* "__ehdr_start" will be defined by linker as a hidden symbol
 	     later if it is referenced and not defined.  */
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 6be1624..b33714b 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,11 @@
+2018-01-20  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR ld/22721
+	* testsuite/ld-plugin/lto.exp: Run PR ld/22721 tests.
+	* testsuite/ld-plugin/pr22721.t: New file.
+	* testsuite/ld-plugin/pr22721a.s: Likewise.
+	* testsuite/ld-plugin/pr22721b.c: Likewise.
+
 2018-01-18  H.J. Lu  <hongjiu.lu@intel.com>
 
 	* testsuite/ld-elf/group1.d: Also xfail Solaris.
diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp
index 93f9649..896f453 100644
--- a/ld/testsuite/ld-plugin/lto.exp
+++ b/ld/testsuite/ld-plugin/lto.exp
@@ -510,6 +510,32 @@ if { [at_least_gcc_version 4 7] } {
 	} {
 	    fail $testname
 	}
+
+	run_cc_link_tests [list \
+	    [list \
+		"Build pr22721a.so" \
+		"-shared -nostdlib -nostartfiles -Wl,-version-script,pr22721.t" \
+		"" \
+		{pr22721a.s} \
+		{} \
+		"pr22721a.so" \
+	    ] \
+	    [list \
+		"Build pr22721b.o" \
+		"$plug_opt" \
+		"-O2 -fPIC -flto $lto_no_fat" \
+		{pr22721b.c} \
+	    ] \
+	    [list \
+		"Build PR ld/pr22721" \
+		"-O2 -flto -fuse-linker-plugin -nostdlib -nostartfiles \
+		-Wl,-e,_start tmpdir/pr22721b.o tmpdir/pr22721a.so" \
+		"" \
+		{dummy.c} \
+		{} \
+		"pr22721.exe"
+	    ] \
+	]
     }
     set testname "PR ld/12942 (3)"
     set exec_output [run_host_cmd "$CXX" "-O2 -flto -fuse-linker-plugin tmpdir/pr12942b.o tmpdir/pr12942a.o"]
diff --git a/ld/testsuite/ld-plugin/pr22721.t b/ld/testsuite/ld-plugin/pr22721.t
new file mode 100644
index 0000000..9269529
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr22721.t
@@ -0,0 +1,7 @@
+SUNWprivate_1.1 {
+global:
+  __tls_get_addr;
+  ___tls_get_addr;
+local:
+  *;
+};
diff --git a/ld/testsuite/ld-plugin/pr22721a.s b/ld/testsuite/ld-plugin/pr22721a.s
new file mode 100644
index 0000000..e06079e
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr22721a.s
@@ -0,0 +1,8 @@
+	.text
+	.globl __tls_get_addr
+	.globl ___tls_get_addr
+	.type	__tls_get_addr,%function
+	.set ___tls_get_addr, __tls_get_addr
+__tls_get_addr:
+	.byte 0
+	.size	__tls_get_addr, .-__tls_get_addr
diff --git a/ld/testsuite/ld-plugin/pr22721b.c b/ld/testsuite/ld-plugin/pr22721b.c
new file mode 100644
index 0000000..ec42cdc
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr22721b.c
@@ -0,0 +1,7 @@
+__thread int foo_var = 1;
+
+int
+_start (void)
+{
+  return foo_var;
+}


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