[binutils-gdb] ld: Change indirect symbol from IR to undefined
H.J. Lu
hjl@sourceware.org
Sat Aug 28 02:47:16 GMT 2021
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=7de7786bb7db5159fc8a7bfa3df72381ff16a38c
commit 7de7786bb7db5159fc8a7bfa3df72381ff16a38c
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Thu Aug 26 07:43:23 2021 -0700
ld: Change indirect symbol from IR to undefined
bfd/
PR ld/28264
* elflink.c (_bfd_elf_merge_symbol): Change indirect symbol from
IR to undefined.
ld/
PR ld/28264
* testsuite/ld-plugin/lto.exp: Run PR ld/28264 test.
* testsuite/ld-plugin/pr28264-1.d: New file.
* testsuite/ld-plugin/pr28264-2.d: Likewise.
* testsuite/ld-plugin/pr28264-3.d: Likewise.
* testsuite/ld-plugin/pr28264-4.d: Likewise.
* testsuite/ld-plugin/pr28264.c: Likewise.
* testsuite/ld-plugin/pr28264.ver: Likewise.
Diff:
---
bfd/elflink.c | 23 +++++++++++++++++------
ld/testsuite/ld-plugin/lto.exp | 9 +++++++++
ld/testsuite/ld-plugin/pr28264-1.d | 5 +++++
ld/testsuite/ld-plugin/pr28264-2.d | 5 +++++
ld/testsuite/ld-plugin/pr28264-3.d | 4 ++++
ld/testsuite/ld-plugin/pr28264-4.d | 4 ++++
ld/testsuite/ld-plugin/pr28264.c | 11 +++++++++++
ld/testsuite/ld-plugin/pr28264.ver | 8 ++++++++
8 files changed, 63 insertions(+), 6 deletions(-)
diff --git a/bfd/elflink.c b/bfd/elflink.c
index c9d5da2dab4..6fe90412b28 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -1272,14 +1272,25 @@ _bfd_elf_merge_symbol (bfd *abfd,
olddyn = (oldsec->symbol->flags & BSF_DYNAMIC) != 0;
}
- /* Handle a case where plugin_notice won't be called and thus won't
- set the non_ir_ref flags on the first pass over symbols. */
if (oldbfd != NULL
- && (oldbfd->flags & BFD_PLUGIN) != (abfd->flags & BFD_PLUGIN)
- && newdyn != olddyn)
+ && (oldbfd->flags & BFD_PLUGIN) != (abfd->flags & BFD_PLUGIN))
{
- h->root.non_ir_ref_dynamic = true;
- hi->root.non_ir_ref_dynamic = true;
+ if (newdyn != olddyn)
+ {
+ /* Handle a case where plugin_notice won't be called and thus
+ won't set the non_ir_ref flags on the first pass over
+ symbols. */
+ h->root.non_ir_ref_dynamic = true;
+ hi->root.non_ir_ref_dynamic = true;
+ }
+
+ if ((oldbfd->flags & BFD_PLUGIN) != 0
+ && hi->root.type == bfd_link_hash_indirect)
+ {
+ /* Change indirect symbol from IR to undefined. */
+ hi->root.type = bfd_link_hash_undefined;
+ hi->root.u.undef.abfd = oldbfd;
+ }
}
/* NEWDEF and OLDDEF indicate whether the new or old symbol,
diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp
index 68d2db1caeb..c343132c460 100644
--- a/ld/testsuite/ld-plugin/lto.exp
+++ b/ld/testsuite/ld-plugin/lto.exp
@@ -238,6 +238,15 @@ if { [at_least_gcc_version 10 0] } {
"-flto -fno-common $lto_no_fat" \
{pr25355.c} \
[list [list "nm" "$plug_opt" "pr25355.d"]]] \
+ [list "pr28264.so" \
+ "-shared -Wl,--version-script=pr28264.ver" \
+ "-flto $lto_no_fat -fPIC" \
+ {pr28264.c} \
+ {{readelf {--dyn-syms --wide} pr28264-1.d} \
+ {readelf {--dyn-syms --wide} pr28264-2.d} \
+ {readelf {--dyn-syms --wide} pr28264-3.d} \
+ {readelf {--dyn-syms --wide} pr28264-4.d}} \
+ {pr28264.so}] \
]]
}
diff --git a/ld/testsuite/ld-plugin/pr28264-1.d b/ld/testsuite/ld-plugin/pr28264-1.d
new file mode 100644
index 00000000000..5ff89694c98
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr28264-1.d
@@ -0,0 +1,5 @@
+Symbol table '\.dynsym' contains [0-9]+ entries:
+ +Num: +Value +Size Type +Bind +Vis +Ndx Name
+#...
+ +[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +FUNC +GLOBAL +DEFAULT .*[0-9]+ _?foo@VERSION.1
+#pass
diff --git a/ld/testsuite/ld-plugin/pr28264-2.d b/ld/testsuite/ld-plugin/pr28264-2.d
new file mode 100644
index 00000000000..f2f629d4a32
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr28264-2.d
@@ -0,0 +1,5 @@
+Symbol table '\.dynsym' contains [0-9]+ entries:
+ +Num: +Value +Size Type +Bind +Vis +Ndx Name
+#...
+ +[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +FUNC +GLOBAL +DEFAULT .*[0-9]+ _?bar@@VERSION.1
+#pass
diff --git a/ld/testsuite/ld-plugin/pr28264-3.d b/ld/testsuite/ld-plugin/pr28264-3.d
new file mode 100644
index 00000000000..b6a8f1f7848
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr28264-3.d
@@ -0,0 +1,4 @@
+#failif
+#...
+ +[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +FUNC +GLOBAL +DEFAULT .*[0-9]+ _?foo
+#...
diff --git a/ld/testsuite/ld-plugin/pr28264-4.d b/ld/testsuite/ld-plugin/pr28264-4.d
new file mode 100644
index 00000000000..408b853831c
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr28264-4.d
@@ -0,0 +1,4 @@
+#failif
+#...
+ +[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +FUNC +GLOBAL +DEFAULT .*[0-9]+ _?bar
+#...
diff --git a/ld/testsuite/ld-plugin/pr28264.c b/ld/testsuite/ld-plugin/pr28264.c
new file mode 100644
index 00000000000..4efa934fd3e
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr28264.c
@@ -0,0 +1,11 @@
+void
+__attribute__ ((symver ("foo@VERSION.1")))
+foo (void)
+{
+}
+
+void
+__attribute__ ((symver ("bar@@VERSION.1")))
+bar1 (void)
+{
+}
diff --git a/ld/testsuite/ld-plugin/pr28264.ver b/ld/testsuite/ld-plugin/pr28264.ver
new file mode 100644
index 00000000000..1608fcae92d
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr28264.ver
@@ -0,0 +1,8 @@
+VERSION.1
+{
+ global:
+ foo;
+ bar;
+ local:
+ *;
+};
More information about the Binutils-cvs
mailing list