ld: Skip the LTO archive member only for the earlier DSO

commit 2707d55e53
Author: Michael Matz <matz@suse.de>
Date:   Mon Mar 31 15:57:08 2025 +0200

skipped the LTO archive member even when the earlier item is also an
archive.  Instead, skip the LTO archive member only if the earlier item
is a shared library.

bfd/

	PR ld/32846
	PR ld/32854
	* elflink.c (elf_link_add_archive_symbols): Skip the LTO archive
	member only if the earlier item is a shared library.

ld/

	PR ld/32846
	PR ld/32854
	* testsuite/ld-plugin/lto.exp: Run ld/32846 test.
	* testsuite/ld-plugin/pr32846a.c: New file.
	* testsuite/ld-plugin/pr32846b.c: Likewise.
	* testsuite/ld-plugin/pr32846c.c: Likewise.
	* testsuite/ld-plugin/pr32846d.c: Likewise.
	* testsuite/ld-plugin/pr32846e.c: Likewise.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
This commit is contained in:
H.J. Lu
2025-04-08 13:10:02 -07:00
parent fd152d90be
commit 2cec91421e
7 changed files with 69 additions and 3 deletions

View File

@@ -6290,8 +6290,8 @@ elf_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
continue;
/* In the pre-LTO-plugin pass we must not mistakenly
include this archive member if an earlier BFD
defined this symbol. */
include this archive member if an earlier shared
library defined this symbol. */
struct elf_link_hash_table *htab = elf_hash_table (info);
if (htab->first_hash)
{
@@ -6299,7 +6299,9 @@ elf_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
= ((struct elf_link_first_hash_entry *)
bfd_hash_lookup (htab->first_hash, symdef->name,
false, false));
if (e && e->abfd != abfd)
if (e
&& (e->abfd->flags & DYNAMIC) != 0
&& e->abfd != abfd)
continue;
}
}

View File

@@ -1212,6 +1212,38 @@ if { [is_elf_format] } {
if { [is_elf_format] && [check_lto_shared_available] } {
run_ld_link_exec_tests $lto_run_elf_shared_tests
if { [check_lto_fat_available] } {
run_cc_link_tests [list \
[list \
"Build libpr32846a.a" \
"$plug_opt" "-O2 -flto $lto_no_fat" \
{pr32846a.c pr32846b.c} {} "libpr32846a.a" \
] \
[list \
"Build libpr32846b.a" \
"$plug_opt" "-O2 -flto $lto_no_fat" \
{pr32846a.c pr32846b.c pr32846c.c} {} "libpr32846b.a" \
] \
[list \
"Build pr32846d.o" \
"$plug_opt" "-O2 -flto $lto_no_fat" \
{pr32846d.c} {} \
] \
[list \
"Build pr32846e.o" \
"$plug_opt" "-O2 -flto $lto_no_fat" \
{pr32846e.c} {} \
] \
[list \
"Build pr32846" \
"-shared -fPIC -O2 -flto $lto_no_fat -Wl,--no-undefined \
tmpdir/pr32846d.o tmpdir/libpr32846a.a \
tmpdir/libpr32846b.a tmpdir/pr32846e.o" \
"-O2 -fPIC -flto $lto_no_fat" \
{dummy.c} {} "pr32846" \
] \
] \
}
}
proc pr20103 {cflags libs} {

View File

@@ -0,0 +1,6 @@
extern void mkdir_p (void);
void
mkdir_parents (void)
{
mkdir_p ();
}

View File

@@ -0,0 +1,4 @@
void
hash_new (void)
{
}

View File

@@ -0,0 +1,6 @@
extern void hash_new (void);
void
kmod_new (void)
{
hash_new();
}

View File

@@ -0,0 +1,12 @@
extern void kmod_new (void);
extern void mkdir_parents (void);
void
do_lsmod (void)
{
kmod_new ();
}
void
do_static_nodes (void)
{
mkdir_parents();
}

View File

@@ -0,0 +1,4 @@
void
mkdir_p (void)
{
}