From 1e3b96fd6cf0c7d018083994ad951ccf92aba582 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 4 Sep 2020 13:54:21 +0930 Subject: [PATCH] Allow plugin syms to mark as-needed shared libs needed We must tell LTO about symbols in all shared libraries loaded. That means we can't load extra shared libraries after LTO recompilation, at least, not those that affect the set of symbols that LTO cares about, the IR symbols. This change will likely result in complaints about --as-needed libraries being loaded unnecessarily, but being correct is more important than being optimal. One of the PR15146 tests regresses, and while that could be hidden by disabling the missing dso message by making it conditional on h->root.non_ir_ref_regular, that would just be sweeping a problem under the rug. bfd/ PR 15146 PR 26314 PR 26530 * elflink.c (elf_link_add_object_symbols): Do set def_regular and ref_regular for IR symbols. Don't clear dynsym, allowing IR symbols to load --as-needed shared libraries, but prevent IR symbols from becoming dynamic. ld/ * testsuite/ld-plugin/lto.exp: Don't run pr15146 tests. * testsuite/ld-plugin/pr15146.d: Delete. * testsuite/ld-plugin/pr15146a.c: Delete. * testsuite/ld-plugin/pr15146b.c: Delete. * testsuite/ld-plugin/pr15146c.c: Delete. * testsuite/ld-plugin/pr15146d.c: Delete. --- bfd/ChangeLog | 10 ++++++++++ bfd/elflink.c | 12 ++---------- ld/ChangeLog | 9 +++++++++ ld/testsuite/ld-plugin/lto.exp | 22 ---------------------- ld/testsuite/ld-plugin/pr15146.d | 4 ---- ld/testsuite/ld-plugin/pr15146a.c | 13 ------------- ld/testsuite/ld-plugin/pr15146b.c | 1 - ld/testsuite/ld-plugin/pr15146c.c | 0 ld/testsuite/ld-plugin/pr15146d.c | 7 ------- 9 files changed, 21 insertions(+), 57 deletions(-) delete mode 100644 ld/testsuite/ld-plugin/pr15146.d delete mode 100644 ld/testsuite/ld-plugin/pr15146a.c delete mode 100644 ld/testsuite/ld-plugin/pr15146b.c delete mode 100644 ld/testsuite/ld-plugin/pr15146c.c delete mode 100644 ld/testsuite/ld-plugin/pr15146d.c diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 1b58f9517ce..a431f8f14db 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2020-09-04 Alan Modra + + PR 15146 + PR 26314 + PR 26530 + * elflink.c (elf_link_add_object_symbols): Do set def_regular + and ref_regular for IR symbols. Don't clear dynsym, allowing + IR symbols to load --as-needed shared libraries, but prevent + IR symbols from becoming dynamic. + 2020-09-03 Nick Clifton PR 26521 diff --git a/bfd/elflink.c b/bfd/elflink.c index 5c085b14b79..1384c1a46b8 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -4977,11 +4977,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) object and a shared object. */ bfd_boolean dynsym = FALSE; - /* Plugin symbols aren't normal. Don't set def_regular or - ref_regular for them, or make them dynamic. */ - if ((abfd->flags & BFD_PLUGIN) != 0) - ; - else if (! dynamic) + if (! dynamic) { if (! definition) { @@ -5162,10 +5158,6 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) && !bfd_link_relocatable (info)) dynsym = FALSE; - /* Nor should we make plugin symbols dynamic. */ - if ((abfd->flags & BFD_PLUGIN) != 0) - dynsym = FALSE; - if (definition) { h->target_internal = isym->st_target_internal; @@ -5192,7 +5184,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) } } - if (dynsym && h->dynindx == -1) + if (dynsym && (abfd->flags & BFD_PLUGIN) == 0 && h->dynindx == -1) { if (! bfd_elf_link_record_dynamic_symbol (info, h)) goto error_free_vers; diff --git a/ld/ChangeLog b/ld/ChangeLog index 0fcbf0d6c21..0a11b79c674 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,12 @@ +2020-09-04 Alan Modra + + * testsuite/ld-plugin/lto.exp: Don't run pr15146 tests. + * testsuite/ld-plugin/pr15146.d: Delete. + * testsuite/ld-plugin/pr15146a.c: Delete. + * testsuite/ld-plugin/pr15146b.c: Delete. + * testsuite/ld-plugin/pr15146c.c: Delete. + * testsuite/ld-plugin/pr15146d.c: Delete. + 2020-09-03 H.J. Lu * testsuite/config/default.exp: Change NOSANTIZE_CFLAGS to diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp index adad1e4895c..684d1db314a 100644 --- a/ld/testsuite/ld-plugin/lto.exp +++ b/ld/testsuite/ld-plugin/lto.exp @@ -320,21 +320,6 @@ set lto_link_elf_tests [list \ [list "PR ld/13244" \ "-shared -O2 -fPIC -flto -fuse-linker-plugin -nostdlib" "-O2 -fno-early-inlining -flto" \ {pr13244.c} {{"readelf" {-s --wide} "pr13244.d"}} "pr13244.so" "c"] \ - [list "Build libpr15146a.a" \ - "$plug_opt" "-flto -O2" \ - {pr15146a.c} {} "lib15146a.a"] \ - [list "Build pr15146b.so" \ - "-shared" "-O2 -fpic" \ - {pr15146b.c} {} "pr15146b.so" "c"] \ - [list "Build pr15146c.so" \ - "-shared -Wl,--no-as-needed tmpdir/pr15146b.so" "-O2 -fpic $no_lto" \ - {pr15146c.c} {} "pr15146c.so" "c"] \ - [list "PR ld/15146 (1)" \ - "-O2 -flto -fuse-linker-plugin -Wl,-rpath-link,. -Wl,--no-copy-dt-needed-entries -Wl,--no-as-needed tmpdir/pr15146a.o tmpdir/pr15146c.so" "" \ - {dummy.c} {{"readelf" {-d} "pr15146.d"}} "pr15146a.exe"] \ - [list "Build libpr15146d.a" \ - "$plug_opt" "-flto -O2" \ - {pr15146d.c} {} "lib15146d.a"] \ [list "Build libpr16746a.a" \ "" "" \ {pr16746a.c pr16746b.c} {} "lib15146a.a"] \ @@ -605,13 +590,6 @@ run_cc_link_tests $lto_compile_elf_tests # Restrict these to ELF targets that support shared libs and PIC. if { [is_elf_format] && [check_lto_shared_available] } { run_cc_link_tests $lto_link_elf_tests - set testname "PR ld/15146 (2)" - set exec_output [run_host_cmd "$CC" "-O2 -flto -fuse-linker-plugin -Wl,-rpath-link,. -Wl,--no-copy-dt-needed-entries -Wl,--no-as-needed tmpdir/pr15146d.o tmpdir/pr15146c.so"] - if { [ regexp "undefined reference to symbol '\\.?xxx'" $exec_output ] } { - pass $testname - } { - fail $testname - } set testname "PR ld/16746 (3)" set exec_output [run_host_cmd "$CC" "-O2 -flto -fuse-linker-plugin tmpdir/pr16746b.o tmpdir/pr16746d.o"] if { [ regexp "warning: \\.?foobar" $exec_output ] && ![ regexp "symbol from plugin" $exec_output ] } { diff --git a/ld/testsuite/ld-plugin/pr15146.d b/ld/testsuite/ld-plugin/pr15146.d deleted file mode 100644 index 48d4b854466..00000000000 --- a/ld/testsuite/ld-plugin/pr15146.d +++ /dev/null @@ -1,4 +0,0 @@ -#failif -#... - +0x[0-9a-f]+ +\(NEEDED\) +Shared library: +\[.*pr15146b.so\] -#... diff --git a/ld/testsuite/ld-plugin/pr15146a.c b/ld/testsuite/ld-plugin/pr15146a.c deleted file mode 100644 index a22860af5b8..00000000000 --- a/ld/testsuite/ld-plugin/pr15146a.c +++ /dev/null @@ -1,13 +0,0 @@ -extern int xxx; - -int -bar (void) -{ - return xxx; -} - -int -main () -{ - return 0; -} diff --git a/ld/testsuite/ld-plugin/pr15146b.c b/ld/testsuite/ld-plugin/pr15146b.c deleted file mode 100644 index 90eb21ea556..00000000000 --- a/ld/testsuite/ld-plugin/pr15146b.c +++ /dev/null @@ -1 +0,0 @@ -int xxx = 3; diff --git a/ld/testsuite/ld-plugin/pr15146c.c b/ld/testsuite/ld-plugin/pr15146c.c deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/ld/testsuite/ld-plugin/pr15146d.c b/ld/testsuite/ld-plugin/pr15146d.c deleted file mode 100644 index ba1e0abfa6e..00000000000 --- a/ld/testsuite/ld-plugin/pr15146d.c +++ /dev/null @@ -1,7 +0,0 @@ -extern int xxx; - -int -main () -{ - return xxx; -}