From 8a1b824af786989f879ab1421a4279f60bba141a Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sat, 20 Jan 2018 14:25:24 -0800 Subject: [PATCH] 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. --- 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(-) 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/ChangeLog b/bfd/ChangeLog index 13c2ea64c4f..3d07aac69d0 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2018-01-20 H.J. Lu + + PR ld/22721 + * elfxx-x86.c (_bfd_x86_elf_link_check_relocs): Check the + versioned __tls_get_addr symbol. + 2018-01-19 Nick Clifton * po/fr.po: Updated French translation. 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/ChangeLog b/ld/ChangeLog index 6be1624b91c..b33714bebc9 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,11 @@ +2018-01-20 H.J. Lu + + 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 * 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 93f964921a2..896f453def1 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 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; +}