From c2fbf57864a2da2ceda81706a54d125ef3fce0a7 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 16 Apr 2024 15:48:21 -0700 Subject: elf: Skip the archive if the symbol isn't referenced Also skip the archive if the symbol isn't referenced by a regular object. bfd/ PR ld/31644 * elflink.c (elf_link_add_archive_symbols): Also skip the archive if the symbol isn't referenced by a regular object. ld/ PR ld/31644 * testsuite/ld-plugin/lto.exp: Run PR ld/31644 tests. * testsuite/ld-plugin/pr31644a.c: New test. * testsuite/ld-plugin/pr31644b.c: Likewise. * testsuite/ld-plugin/pr31644c.c: Likewise. --- bfd/elflink.c | 8 +++++--- ld/testsuite/ld-plugin/lto.exp | 24 ++++++++++++++++++++++++ ld/testsuite/ld-plugin/pr31644a.c | 13 +++++++++++++ ld/testsuite/ld-plugin/pr31644b.c | 7 +++++++ ld/testsuite/ld-plugin/pr31644c.c | 5 +++++ 5 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 ld/testsuite/ld-plugin/pr31644a.c create mode 100644 ld/testsuite/ld-plugin/pr31644b.c create mode 100644 ld/testsuite/ld-plugin/pr31644c.c diff --git a/bfd/elflink.c b/bfd/elflink.c index 321e3d5..9c53bfc 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -6261,9 +6261,11 @@ elf_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info) if (!is_elf_hash_table (info->hash)) continue; - /* Ignore the archive if the symbol isn't defined in a - shared object. */ - if (!((struct elf_link_hash_entry *) h)->def_dynamic) + struct elf_link_hash_entry *eh + = (struct elf_link_hash_entry *) h; + /* Ignore the archive if the symbol isn't referenced by a + regular object or isn't defined in a shared object. */ + if (!eh->ref_regular || !eh->def_dynamic) continue; /* Ignore the dynamic definition if symbol is first defined in this archive. */ diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp index 35ce387..7b4b349 100644 --- a/ld/testsuite/ld-plugin/lto.exp +++ b/ld/testsuite/ld-plugin/lto.exp @@ -579,6 +579,22 @@ set lto_link_elf_tests [list \ "" \ "pr31615d.so" \ ] \ + [list \ + "Build pr31644b.a" \ + "" \ + "" \ + {pr31644b.c} \ + "" \ + "pr31644b.a" \ + ] \ + [list \ + "Build pr31644c.so" \ + "-shared" \ + "-fPIC" \ + {pr31644c.c} \ + "" \ + "pr31644c.so" \ + ] \ ] # PR 14918 checks that libgcc is not spuriously included in a shared link of @@ -788,6 +804,14 @@ set lto_run_elf_shared_tests [list \ {pr31615a.c} {pr31615b.exe} {pass.out} {-O3 -flto} {c} {} \ {-Wl,--as-needed tmpdir/pr31615c.so -Wl,--no-as-needed \ tmpdir/pr31615d.so}] \ + [list {pr31644a} \ + {-Wl,-R,tmpdir} {} \ + {pr31644a.c} {pr31644a.exe} {pass.out} {-flto} {c} {} \ + {-Wl,--no-as-needed tmpdir/pr31644b.a tmpdir/pr31644c.so}] \ + [list {pr31644b} \ + {-Wl,-R,tmpdir} {} \ + {pr31644a.c} {pr31644b.exe} {pass.out} {-flto} {c} {} \ + {-Wl,--as-needed tmpdir/pr31644b.a tmpdir/pr31644c.so}] \ ] # LTO run-time tests for ELF diff --git a/ld/testsuite/ld-plugin/pr31644a.c b/ld/testsuite/ld-plugin/pr31644a.c new file mode 100644 index 0000000..1c03a95 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr31644a.c @@ -0,0 +1,13 @@ +#include + +void +bar (void) +{ +} + +int +main() +{ + printf ("PASS\n"); + return 0; +} diff --git a/ld/testsuite/ld-plugin/pr31644b.c b/ld/testsuite/ld-plugin/pr31644b.c new file mode 100644 index 0000000..8b23ec8 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr31644b.c @@ -0,0 +1,7 @@ +extern void bar (void); + +void +foo (void) +{ + bar (); +} diff --git a/ld/testsuite/ld-plugin/pr31644c.c b/ld/testsuite/ld-plugin/pr31644c.c new file mode 100644 index 0000000..3d54205 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr31644c.c @@ -0,0 +1,5 @@ +__attribute__ ((weak)) +void +foo (void) +{ +} -- cgit v1.1