mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-26 09:08:59 +00:00
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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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} {
|
||||
|
||||
6
ld/testsuite/ld-plugin/pr32846a.c
Normal file
6
ld/testsuite/ld-plugin/pr32846a.c
Normal file
@@ -0,0 +1,6 @@
|
||||
extern void mkdir_p (void);
|
||||
void
|
||||
mkdir_parents (void)
|
||||
{
|
||||
mkdir_p ();
|
||||
}
|
||||
4
ld/testsuite/ld-plugin/pr32846b.c
Normal file
4
ld/testsuite/ld-plugin/pr32846b.c
Normal file
@@ -0,0 +1,4 @@
|
||||
void
|
||||
hash_new (void)
|
||||
{
|
||||
}
|
||||
6
ld/testsuite/ld-plugin/pr32846c.c
Normal file
6
ld/testsuite/ld-plugin/pr32846c.c
Normal file
@@ -0,0 +1,6 @@
|
||||
extern void hash_new (void);
|
||||
void
|
||||
kmod_new (void)
|
||||
{
|
||||
hash_new();
|
||||
}
|
||||
12
ld/testsuite/ld-plugin/pr32846d.c
Normal file
12
ld/testsuite/ld-plugin/pr32846d.c
Normal 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();
|
||||
}
|
||||
4
ld/testsuite/ld-plugin/pr32846e.c
Normal file
4
ld/testsuite/ld-plugin/pr32846e.c
Normal file
@@ -0,0 +1,4 @@
|
||||
void
|
||||
mkdir_p (void)
|
||||
{
|
||||
}
|
||||
Reference in New Issue
Block a user