summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2018-01-19 10:53:36 -0800
committerH.J. Lu <hjl.tools@gmail.com>2018-01-19 10:53:36 -0800
commit63da41ed7594a879bb32648f63a402f293f64fb2 (patch)
tree17a42ef7b23d0a7575d969358363bba50401a04a
parenta0aad53764f45a634462288befe4c2eaecbf302d (diff)
downloadbinutils-gdb-users/hjl/pr22721.tar.gz
x86: Check the versioned __tls_get_addr symbolusers/hjl/pr22721
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.
-rw-r--r--bfd/elfxx-x86.c11
-rw-r--r--ld/testsuite/ld-plugin/lto.exp12
-rw-r--r--ld/testsuite/ld-plugin/pr22721.t7
-rw-r--r--ld/testsuite/ld-plugin/pr22721a.s8
-rw-r--r--ld/testsuite/ld-plugin/pr22721b.c7
5 files changed, 44 insertions, 1 deletions
diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
index a9ee4ba387b..a7db5d9dfe1 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 93f964921a2..2d9dd3b9b3d 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 00000000000..92695296ba0
--- /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 00000000000..e06079ee9b7
--- /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 00000000000..ec42cdc3bd5
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr22721b.c
@@ -0,0 +1,7 @@
+__thread int foo_var = 1;
+
+int
+_start (void)
+{
+ return foo_var;
+}