From: Alan Modra Date: Tue, 2 Feb 2021 04:35:14 +0000 (+1030) Subject: PR27311, ld.bfd (symbol from plugin): undefined reference X-Git-Tag: binutils-2_36_1~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d2ea9f3a70a2d44cae20ab43609a71f1e616b43a;p=thirdparty%2Fbinutils-gdb.git PR27311, ld.bfd (symbol from plugin): undefined reference A default versioned symbol definition in a shared library is overridden by an unversioned definition in a regular object file, and thus should not be reason to make an as-needed library needed. bfd/ PR 27311 * elflink.c (elf_link_add_object_symbols): Don't pull in as-needed libraries when H is an indirect symbol after calling _bfd_elf_add_default_symbol. ld/ * testsuite/ld-ifunc/ifunc.exp (libpr16467b.so, libpr16467bn.so): Link with --as-needed. * testsuite/ld-plugin/pr27311.d, * testsuite/ld-plugin/pr27311.ver, * testsuite/ld-plugin/pr27311a.c, * testsuite/ld-plugin/pr27311b.c, * testsuite/ld-plugin/pr27311c.c: New testcase. * testsuite/ld-plugin/lto.exp: Run it. Correct PR14918 and PR12982 entries. (cherry picked from commit 9918bff7cf2a566aaa2036d2242a61c140652dc7) (cherry picked from commit 6955136728a68365bbb5e6e1327dff1654b2a0ca) (cherry picked from commit f01fb44c0621b064996493bb5acd5077646ea84e) --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 08d28999487..e2a34164f69 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2021-02-03 Alan Modra + + PR 27311 + * elflink.c (elf_link_add_object_symbols): Don't pull in as-needed + libraries when H is an indirect symbol after calling + _bfd_elf_add_default_symbol. + 2021-01-28 Alan Modra PR 27259 diff --git a/bfd/elflink.c b/bfd/elflink.c index e7b96f8ca86..da288f3f2ac 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -5274,6 +5274,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) if (!add_needed && matched && definition + && h->root.type != bfd_link_hash_indirect && ((dynsym && h->ref_regular_nonweak) || (old_bfd != NULL diff --git a/ld/ChangeLog b/ld/ChangeLog index ff2ee9668ce..fbb7d5094f2 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,19 @@ +2021-02-03 Alan Modra + + Apply from mainline + 2021-02-03 Alan Modra + * testsuite/ld-ifunc/ifunc.exp (libpr16467b.so, libpr16467bn.so): + Link with --as-needed. + + 2021-02-02 Alan Modra + * testsuite/ld-plugin/pr27311.d, + * testsuite/ld-plugin/pr27311.ver, + * testsuite/ld-plugin/pr27311a.c, + * testsuite/ld-plugin/pr27311b.c, + * testsuite/ld-plugin/pr27311c.c: New testcase. + * testsuite/ld-plugin/lto.exp: Run it. Correct PR14918 and + PR12982 entries. + 2021-01-28 Alan Modra PR 27259 diff --git a/ld/testsuite/ld-ifunc/ifunc.exp b/ld/testsuite/ld-ifunc/ifunc.exp index 9d3ace65216..45b47d7d6a8 100644 --- a/ld/testsuite/ld-ifunc/ifunc.exp +++ b/ld/testsuite/ld-ifunc/ifunc.exp @@ -397,7 +397,7 @@ run_cc_link_tests [list \ ] \ [list \ "Build libpr16467b.so" \ - "-shared tmpdir/pr16467b.o tmpdir/libpr16467a.so \ + "-shared -Wl,--as-needed tmpdir/pr16467b.o tmpdir/libpr16467a.so \ -Wl,--version-script=pr16467b.map" \ "-fPIC" \ { dummy.c } \ @@ -422,7 +422,7 @@ run_cc_link_tests [list \ ] \ [list \ "Build libpr16467bn.so" \ - "-shared tmpdir/pr16467b.o tmpdir/libpr16467an.so \ + "-shared -Wl,--as-needed tmpdir/pr16467b.o tmpdir/libpr16467an.so \ -Wl,--version-script=pr16467b.map" \ "-fPIC" \ { dummy.c } \ diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp index 3c129760498..878d9e776ae 100644 --- a/ld/testsuite/ld-plugin/lto.exp +++ b/ld/testsuite/ld-plugin/lto.exp @@ -415,6 +415,18 @@ set lto_link_elf_tests [list \ [list {pr26806.so} \ {-shared} {-fpic -O2 -flto} \ {pr26806.c} {{nm {-D} pr26806.d}} {pr26806.so}] \ + [list {pr27311a.so} \ + {-shared -Wl,--version-script=pr27311.ver} {-fPIC} \ + {pr27311a.c} {} {pr27311a.so}] \ + [list {pr27311b.so} \ + {-shared -Wl,--no-as-needed tmpdir/pr27311a.so} {-fPIC} \ + {pr27311b.c} {} {pr27311b.so}] \ + [list {pr27311c.o} \ + {} {-flto} \ + {pr27311c.c} {} {} {c}] \ + [list {pr27311} \ + {tmpdir/pr27311c.o -Wl,--no-as-needed,--rpath-link=. tmpdir/pr27311b.so} {} \ + {dummy.c} {{readelf {--dyn-syms --wide} pr27311.d}} {pr27311}] \ ] # PR 14918 checks that libgcc is not spuriously included in a shared link of @@ -423,11 +435,10 @@ set lto_link_elf_tests [list \ # __aeabi_unwind_cpp_pr0@@GCC_3.5 which is provided by libgcc_s.so.1, so the # test fails. Hence this code to skip the test. if { ! [istarget "arm*-*-*"] } { - lappend lto_link_elf_tests [list \ + lappend lto_link_elf_tests \ [list "PR ld/14918" \ "-flto" "-flto" \ - {pr14918.c} {{"readelf" {-d --wide} "pr14918.d"}} "pr14918.exe" "c"] \ - ] + {pr14918.c} {{"readelf" {-d --wide} "pr14918.d"}} "pr14918.exe" "c"] } # PR 12982 checks that an executable stack is not created by default @@ -435,11 +446,10 @@ if { ! [istarget "arm*-*-*"] } { # executable stack for syscall restarts and signal returns, so we # skip this test for that target. if { ! [istarget "hppa*-*-*"] } { - lappend lto_link_elf_tests [list \ + lappend lto_link_elf_tests \ [list "PR ld/12982" \ "-O2 -flto -fuse-linker-plugin" "-O2 -flto" \ - {pr12982.c} {{"readelf" {-l --wide} "pr12982.d"}} "pr12982.exe"] \ - ] + {pr12982.c} {{"readelf" {-l --wide} "pr12982.d"}} "pr12982.exe"] } # Check final symbols in executables. diff --git a/ld/testsuite/ld-plugin/pr27311.d b/ld/testsuite/ld-plugin/pr27311.d new file mode 100644 index 00000000000..debf41cdc7f --- /dev/null +++ b/ld/testsuite/ld-plugin/pr27311.d @@ -0,0 +1,4 @@ +#failif +#... +.* _*inlib1.* +#... diff --git a/ld/testsuite/ld-plugin/pr27311.ver b/ld/testsuite/ld-plugin/pr27311.ver new file mode 100644 index 00000000000..324daf0c5b6 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr27311.ver @@ -0,0 +1,3 @@ +LIBFOO { + *; +}; diff --git a/ld/testsuite/ld-plugin/pr27311a.c b/ld/testsuite/ld-plugin/pr27311a.c new file mode 100644 index 00000000000..314984781db --- /dev/null +++ b/ld/testsuite/ld-plugin/pr27311a.c @@ -0,0 +1 @@ +void inlib1(void) {} diff --git a/ld/testsuite/ld-plugin/pr27311b.c b/ld/testsuite/ld-plugin/pr27311b.c new file mode 100644 index 00000000000..ed9c8a7048e --- /dev/null +++ b/ld/testsuite/ld-plugin/pr27311b.c @@ -0,0 +1 @@ +void inlib2(void) {} diff --git a/ld/testsuite/ld-plugin/pr27311c.c b/ld/testsuite/ld-plugin/pr27311c.c new file mode 100644 index 00000000000..6712499130e --- /dev/null +++ b/ld/testsuite/ld-plugin/pr27311c.c @@ -0,0 +1,5 @@ +void inlib1(void) {} +int main() +{ + return 0; +}