From: H.J. Lu Date: Tue, 16 Apr 2024 22:48:21 +0000 (-0700) Subject: elf: Skip the archive if the symbol isn't referenced X-Git-Tag: gdb-15-branchpoint~378 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c2fbf57864a2da2ceda81706a54d125ef3fce0a7;p=thirdparty%2Fbinutils-gdb.git 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. --- diff --git a/bfd/elflink.c b/bfd/elflink.c index 321e3d5e2ff..9c53bfcf7d4 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 35ce38731d0..7b4b3492a2f 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 00000000000..1c03a955c37 --- /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 00000000000..8b23ec8f2b7 --- /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 00000000000..3d54205ea4d --- /dev/null +++ b/ld/testsuite/ld-plugin/pr31644c.c @@ -0,0 +1,5 @@ +__attribute__ ((weak)) +void +foo (void) +{ +}