aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2024-08-02 19:52:00 -0700
committerAlan Modra <amodra@gmail.com>2024-08-05 11:23:45 +0930
commit2fbb863136724cfef2fc2f4c2b7f51be36f132c7 (patch)
tree65a22527a133966b6a499e72862cdfe1745606de
parentb9be3e07d6a613eb4aeb4829d7c8cae3dc753731 (diff)
downloadgdb-2fbb863136724cfef2fc2f4c2b7f51be36f132c7.zip
gdb-2fbb863136724cfef2fc2f4c2b7f51be36f132c7.tar.gz
gdb-2fbb863136724cfef2fc2f4c2b7f51be36f132c7.tar.bz2
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': <artificial>:(.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 <hjl.tools@gmail.com> (cherry picked from commit 3221c470f0765886a49a1a3d2ec602e4104a377b)
-rw-r--r--ld/plugin.c14
-rw-r--r--ld/testsuite/ld-plugin/lto.exp16
-rw-r--r--ld/testsuite/ld-plugin/pr31956c.c19
-rw-r--r--ld/testsuite/ld-plugin/pr31956d.c7
-rw-r--r--ld/testsuite/ld-plugin/pr31956d.d4
5 files changed, 58 insertions, 2 deletions
diff --git a/ld/plugin.c b/ld/plugin.c
index 03ee988..51c4765 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 9476caf..604dc8c 100644
--- a/ld/testsuite/ld-plugin/lto.exp
+++ b/ld/testsuite/ld-plugin/lto.exp
@@ -547,6 +547,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 \
-O2 -fPIC -flto-partition=max -flto=2" \
diff --git a/ld/testsuite/ld-plugin/pr31956c.c b/ld/testsuite/ld-plugin/pr31956c.c
new file mode 100644
index 0000000..4a46b2b
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr31956c.c
@@ -0,0 +1,19 @@
+#include <stdlib.h>
+
+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 0000000..cb7f2d5
--- /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 0000000..b579cdc
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr31956d.d
@@ -0,0 +1,4 @@
+#failif
+#...
+[0-9a-f]+ T .*parse_line
+#...