diff --git a/binutils-LTO-restore-wrapper-symbol.patch b/binutils-LTO-restore-wrapper-symbol.patch new file mode 100644 index 0000000..946e114 --- /dev/null +++ b/binutils-LTO-restore-wrapper-symbol.patch @@ -0,0 +1,154 @@ +From 3221c470f0765886a49a1a3d2ec602e4104a377b Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" +Date: Fri, 2 Aug 2024 19:52:00 -0700 +Subject: [PATCH] LTO: Restore the wrapper symbol check for standard function + +Call unwrap_hash_lookup to restore the wrapper symbol check for standard +function since reference to standard function may not show up in LTO +symbol table: + +[hjl@gnu-tgl-3 pr31956-3]$ nm foo.o +00000000 T main + U __real_malloc +00000000 T __wrap_malloc +[hjl@gnu-tgl-3 pr31956-3]$ lto-dump -list foo.o +Type Visibility Size Name +function default 0 malloc +function default 0 __real_malloc +function default 3 main +function default 5 __wrap_malloc +[hjl@gnu-tgl-3 pr31956-3]$ make +gcc -O2 -flto -Wall -c -o foo.o foo.c +gcc -Wl,--wrap=malloc -O2 -flto -Wall -o x foo.o +/usr/local/bin/ld: /tmp/ccsPW0a9.ltrans0.ltrans.o: in function `main': +:(.text.startup+0xa): undefined reference to `__wrap_malloc' +collect2: error: ld returned 1 exit status +make: *** [Makefile:22: x] Error 1 +[hjl@gnu-tgl-3 pr31956-3]$ + +Also add a test to verify that the unused wrapper is removed. + + PR ld/31956 + * plugin.c (get_symbols): Restore the wrapper symbol check for + standard function. + * testsuite/ld-plugin/lto.exp: Run the malloc test and the + unused test. + * testsuite/ld-plugin/pr31956c.c: New file. + * testsuite/ld-plugin/pr31956d.c: New file. + * testsuite/ld-plugin/pr31956d.d: New file. + +Signed-off-by: H.J. Lu +--- + ld/plugin.c | 14 ++++++++++++-- + ld/testsuite/ld-plugin/lto.exp | 16 ++++++++++++++++ + ld/testsuite/ld-plugin/pr31956c.c | 19 +++++++++++++++++++ + ld/testsuite/ld-plugin/pr31956d.c | 7 +++++++ + ld/testsuite/ld-plugin/pr31956d.d | 4 ++++ + 5 files changed, 58 insertions(+), 2 deletions(-) + create mode 100644 ld/testsuite/ld-plugin/pr31956c.c + create mode 100644 ld/testsuite/ld-plugin/pr31956d.c + create mode 100644 ld/testsuite/ld-plugin/pr31956d.d + +diff --git a/ld/plugin.c b/ld/plugin.c +index 03ee9880d10..51c4765cc5b 100644 +--- a/ld/plugin.c ++++ b/ld/plugin.c +@@ -778,8 +778,18 @@ get_symbols (const void *handle, int nsyms, struct ld_plugin_symbol *syms, + { + blhe = h; + /* Check if a symbol is a wrapper symbol. */ +- if (blhe && blhe->wrapper_symbol) +- wrap_status = wrapper; ++ if (blhe) ++ { ++ if (blhe->wrapper_symbol) ++ wrap_status = wrapper; ++ else if (link_info.wrap_hash != NULL) ++ { ++ struct bfd_link_hash_entry *unwrap ++ = unwrap_hash_lookup (&link_info, (bfd *) abfd, blhe); ++ if (unwrap != NULL && unwrap != h) ++ wrap_status = wrapper; ++ } ++ } + } + else + { +diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp +index ad59e2abd61..1a8c3736307 100644 +--- a/ld/testsuite/ld-plugin/lto.exp ++++ b/ld/testsuite/ld-plugin/lto.exp +@@ -546,6 +546,22 @@ set lto_link_elf_tests [list \ + {} \ + "pr31956b" \ + ] \ ++ [list \ ++ "PR ld/31956 (malloc)" \ ++ "-Wl,--wrap=malloc" \ ++ "-O2 -flto" \ ++ {pr31956c.c} \ ++ {} \ ++ "pr31956c" \ ++ ] \ ++ [list \ ++ "PR ld/31956 (unused)" \ ++ "-Wl,--wrap=parse_line" \ ++ "-O2 -flto" \ ++ {pr31956d.c} \ ++ {{"nm" {} "pr31956d.d"}} \ ++ "pr31956d" \ ++ ] \ + [list \ + "Build pr30281.so" \ + "-shared -Wl,--version-script,pr30281.t \ +diff --git a/ld/testsuite/ld-plugin/pr31956c.c b/ld/testsuite/ld-plugin/pr31956c.c +new file mode 100644 +index 00000000000..4a46b2b49a8 +--- /dev/null ++++ b/ld/testsuite/ld-plugin/pr31956c.c +@@ -0,0 +1,19 @@ ++#include ++ ++extern void *__real_malloc (size_t); ++ ++void * ++__wrap_malloc (size_t n) ++{ ++ if (n == 0) ++ return NULL; ++ else ++ return __real_malloc (n); ++}; ++ ++int ++main (void) ++{ ++ void *ptr = malloc (30); ++ return ptr == NULL ? 1 : 0; ++} +diff --git a/ld/testsuite/ld-plugin/pr31956d.c b/ld/testsuite/ld-plugin/pr31956d.c +new file mode 100644 +index 00000000000..cb7f2d50643 +--- /dev/null ++++ b/ld/testsuite/ld-plugin/pr31956d.c +@@ -0,0 +1,7 @@ ++void __wrap_parse_line(void) {}; ++ ++int ++main (void) ++{ ++ return 0; ++} +diff --git a/ld/testsuite/ld-plugin/pr31956d.d b/ld/testsuite/ld-plugin/pr31956d.d +new file mode 100644 +index 00000000000..b579cdc7353 +--- /dev/null ++++ b/ld/testsuite/ld-plugin/pr31956d.d +@@ -0,0 +1,4 @@ ++#failif ++#... ++[0-9a-f]+ T .*parse_line ++#... +-- +2.45.2 +