[PATCH] ld: Skip the LTO archive member only for the earlier DSO
Sam James
sam@gentoo.org
Wed Apr 9 04:52:02 GMT 2025
"H.J. Lu" <hjl.tools@gmail.com> writes:
> commit 2707d55e539ef323dd14a1293e762bf3d9739ee7
> 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.
Thanks. kmod now works, I'll test others for the next day or so.
>
> 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>
> ---
> bfd/elflink.c | 8 +++++---
> ld/testsuite/ld-plugin/lto.exp | 32 +++++++++++++++++++++++++++++++
> ld/testsuite/ld-plugin/pr32846a.c | 6 ++++++
> ld/testsuite/ld-plugin/pr32846b.c | 4 ++++
> ld/testsuite/ld-plugin/pr32846c.c | 6 ++++++
> ld/testsuite/ld-plugin/pr32846d.c | 12 ++++++++++++
> ld/testsuite/ld-plugin/pr32846e.c | 4 ++++
> 7 files changed, 69 insertions(+), 3 deletions(-)
> create mode 100644 ld/testsuite/ld-plugin/pr32846a.c
> create mode 100644 ld/testsuite/ld-plugin/pr32846b.c
> create mode 100644 ld/testsuite/ld-plugin/pr32846c.c
> create mode 100644 ld/testsuite/ld-plugin/pr32846d.c
> create mode 100644 ld/testsuite/ld-plugin/pr32846e.c
>
> diff --git a/bfd/elflink.c b/bfd/elflink.c
> index a76e8e38da7..2ac12144990 100644
> --- a/bfd/elflink.c
> +++ b/bfd/elflink.c
> @@ -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;
> }
> }
> diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp
> index 93491902674..726dd933329 100644
> --- a/ld/testsuite/ld-plugin/lto.exp
> +++ b/ld/testsuite/ld-plugin/lto.exp
> @@ -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} {
> diff --git a/ld/testsuite/ld-plugin/pr32846a.c b/ld/testsuite/ld-plugin/pr32846a.c
> new file mode 100644
> index 00000000000..8c161711bd9
> --- /dev/null
> +++ b/ld/testsuite/ld-plugin/pr32846a.c
> @@ -0,0 +1,6 @@
> +extern void mkdir_p (void);
> +void
> +mkdir_parents (void)
> +{
> + mkdir_p ();
> +}
> diff --git a/ld/testsuite/ld-plugin/pr32846b.c b/ld/testsuite/ld-plugin/pr32846b.c
> new file mode 100644
> index 00000000000..9776a372d7a
> --- /dev/null
> +++ b/ld/testsuite/ld-plugin/pr32846b.c
> @@ -0,0 +1,4 @@
> +void
> +hash_new (void)
> +{
> +}
> diff --git a/ld/testsuite/ld-plugin/pr32846c.c b/ld/testsuite/ld-plugin/pr32846c.c
> new file mode 100644
> index 00000000000..f87cffb8865
> --- /dev/null
> +++ b/ld/testsuite/ld-plugin/pr32846c.c
> @@ -0,0 +1,6 @@
> +extern void hash_new (void);
> +void
> +kmod_new (void)
> +{
> + hash_new();
> +}
> diff --git a/ld/testsuite/ld-plugin/pr32846d.c b/ld/testsuite/ld-plugin/pr32846d.c
> new file mode 100644
> index 00000000000..c6f41021adf
> --- /dev/null
> +++ b/ld/testsuite/ld-plugin/pr32846d.c
> @@ -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();
> +}
> diff --git a/ld/testsuite/ld-plugin/pr32846e.c b/ld/testsuite/ld-plugin/pr32846e.c
> new file mode 100644
> index 00000000000..c4e5e56f4f6
> --- /dev/null
> +++ b/ld/testsuite/ld-plugin/pr32846e.c
> @@ -0,0 +1,4 @@
> +void
> +mkdir_p (void)
> +{
> +}
More information about the Binutils
mailing list