aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2020-09-04 13:54:21 +0930
committerAlan Modra <amodra@gmail.com>2020-09-04 14:06:44 +0930
commit1e3b96fd6cf0c7d018083994ad951ccf92aba582 (patch)
tree0e091c1d3f126e5dbed7661c30bb0d5dfe35bb6a
parente062fcc8c2bf4c36386dce68ba7f1d408f22dedc (diff)
downloadbinutils-1e3b96fd6cf0c7d018083994ad951ccf92aba582.zip
binutils-1e3b96fd6cf0c7d018083994ad951ccf92aba582.tar.gz
binutils-1e3b96fd6cf0c7d018083994ad951ccf92aba582.tar.bz2
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.
-rw-r--r--bfd/ChangeLog10
-rw-r--r--bfd/elflink.c12
-rw-r--r--ld/ChangeLog9
-rw-r--r--ld/testsuite/ld-plugin/lto.exp22
-rw-r--r--ld/testsuite/ld-plugin/pr15146.d4
-rw-r--r--ld/testsuite/ld-plugin/pr15146a.c13
-rw-r--r--ld/testsuite/ld-plugin/pr15146b.c1
-rw-r--r--ld/testsuite/ld-plugin/pr15146c.c0
-rw-r--r--ld/testsuite/ld-plugin/pr15146d.c7
9 files changed, 21 insertions, 57 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 1b58f95..a431f8f 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,13 @@
+2020-09-04 Alan Modra <amodra@gmail.com>
+
+ 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 <nickc@redhat.com>
PR 26521
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 5c085b1..1384c1a 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 0fcbf0d..0a11b79 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,12 @@
+2020-09-04 Alan Modra <amodra@gmail.com>
+
+ * 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 <hongjiu.lu@intel.com>
* 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 adad1e4..684d1db 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 48d4b85..0000000
--- 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 a22860a..0000000
--- 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 90eb21e..0000000
--- 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 e69de29..0000000
--- a/ld/testsuite/ld-plugin/pr15146c.c
+++ /dev/null
diff --git a/ld/testsuite/ld-plugin/pr15146d.c b/ld/testsuite/ld-plugin/pr15146d.c
deleted file mode 100644
index ba1e0ab..0000000
--- a/ld/testsuite/ld-plugin/pr15146d.c
+++ /dev/null
@@ -1,7 +0,0 @@
-extern int xxx;
-
-int
-main ()
-{
- return xxx;
-}