[PATCH] x86: Check the versioned __tls_get_addr symbol

H.J. Lu hongjiu.lu@intel.com
Fri Jan 19 18:57:00 GMT 2018


We need to check the versioned __tls_get_addr symbol when looking up
"__tls_get_addr".

OK for master and 2.30 branch?

H.J.
---
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.
---
 bfd/elfxx-x86.c                   | 11 ++++++++++-
 ld/testsuite/ld-plugin/lto.exp    | 12 ++++++++++++
 ld/testsuite/ld-plugin/pr22721.t  |  7 +++++++
 ld/testsuite/ld-plugin/pr22721a.s |  8 ++++++++
 ld/testsuite/ld-plugin/pr22721b.c |  7 +++++++
 5 files changed, 44 insertions(+), 1 deletion(-)
 create mode 100644 ld/testsuite/ld-plugin/pr22721.t
 create mode 100644 ld/testsuite/ld-plugin/pr22721a.s
 create mode 100644 ld/testsuite/ld-plugin/pr22721b.c

diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
index a9ee4ba387..a7db5d9dfe 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/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp
index 93f964921a..2d9dd3b9b3 100644
--- a/ld/testsuite/ld-plugin/lto.exp
+++ b/ld/testsuite/ld-plugin/lto.exp
@@ -304,6 +304,18 @@ set lto_link_elf_tests [list \
   [list {Build pr22220main.o} \
    {} {-flto} \
    {pr22220main.cc} {} {} {c++}] \
+  [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"] \
 ]
 
 # PR 14918 checks that libgcc is not spuriously included in a shared link of
diff --git a/ld/testsuite/ld-plugin/pr22721.t b/ld/testsuite/ld-plugin/pr22721.t
new file mode 100644
index 0000000000..92695296ba
--- /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 0000000000..e06079ee9b
--- /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 0000000000..ec42cdc3bd
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr22721b.c
@@ -0,0 +1,7 @@
+__thread int foo_var = 1;
+
+int
+_start (void)
+{
+  return foo_var;
+}
-- 
2.14.3



More information about the Binutils mailing list