[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