[PATCH] LTO: Don't wrap IR symbol reference
H.J. Lu
hjl.tools@gmail.com
Fri Jul 5 08:28:22 GMT 2024
Don't wrap IR symbol reference since LTO knows nothing about symbol wrap.
Symbol wrap is handled by linker only.
bfd/
PR ld/31956
* linker.c (bfd_wrapped_link_hash_lookup): Don't wrap IR symbol
reference.
ld/
PR ld/31956
* testsuite/ld-plugin/lto.exp: Run PR ld/31956 test.
* testsuite/ld-plugin/pr31956a.c: New file.
* testsuite/ld-plugin/pr31956b.c: Likewise.
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
---
bfd/linker.c | 5 ++++-
ld/testsuite/ld-plugin/lto.exp | 8 ++++++++
ld/testsuite/ld-plugin/pr31956a.c | 3 +++
ld/testsuite/ld-plugin/pr31956b.c | 23 +++++++++++++++++++++++
4 files changed, 38 insertions(+), 1 deletion(-)
create mode 100644 ld/testsuite/ld-plugin/pr31956a.c
create mode 100644 ld/testsuite/ld-plugin/pr31956b.c
diff --git a/bfd/linker.c b/bfd/linker.c
index 111deecf55d..37378ff4b5a 100644
--- a/bfd/linker.c
+++ b/bfd/linker.c
@@ -555,7 +555,10 @@ bfd_wrapped_link_hash_lookup (bfd *abfd,
#undef WRAP
#define WRAP "__wrap_"
- if (bfd_hash_lookup (info->wrap_hash, l, false, false) != NULL)
+ /* Don't wrap IR symbol reference since LTO knows nothing about
+ symbol wrap. */
+ if ((abfd->flags & BFD_PLUGIN) == 0
+ && bfd_hash_lookup (info->wrap_hash, l, false, false) != NULL)
{
char *n;
struct bfd_link_hash_entry *h;
diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp
index 7b4b3492a2f..911cb495393 100644
--- a/ld/testsuite/ld-plugin/lto.exp
+++ b/ld/testsuite/ld-plugin/lto.exp
@@ -530,6 +530,14 @@ set lto_link_elf_tests [list \
{} \
"pr29086" \
] \
+ [list \
+ "PR ld/31956" \
+ "-Wl,--wrap=parse_line" \
+ "-O2 -flto" \
+ {pr31956a.c pr31956b.c} \
+ {} \
+ "pr31956" \
+ ] \
[list \
"Build pr30281.so" \
"-shared -Wl,--version-script,pr30281.t \
diff --git a/ld/testsuite/ld-plugin/pr31956a.c b/ld/testsuite/ld-plugin/pr31956a.c
new file mode 100644
index 00000000000..48df8c537fb
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr31956a.c
@@ -0,0 +1,3 @@
+extern void parse_line(void);
+void _cmocka_run_group_tests(void *) {}
+void argv_parse_cmd(void) { parse_line(); }
diff --git a/ld/testsuite/ld-plugin/pr31956b.c b/ld/testsuite/ld-plugin/pr31956b.c
new file mode 100644
index 00000000000..1b069318257
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr31956b.c
@@ -0,0 +1,23 @@
+struct CMUnitTest {
+ void *test_func;
+};
+
+extern void _cmocka_run_group_tests(void *);
+
+extern void argv_parse_cmd(void);
+void __wrap_parse_line(void) {};
+
+void foo (void) {
+ argv_parse_cmd();
+}
+
+struct CMUnitTest main_tests = {
+ foo
+};
+
+int
+main (void)
+{
+ _cmocka_run_group_tests (&main_tests);
+ return 0;
+}
--
2.45.2
More information about the Binutils
mailing list