[PATCH] ld: Skip the LTO archive member only for the earlier DSO

Sam James sam@gentoo.org
Thu Apr 10 16:05:34 GMT 2025


"H.J. Lu" <hjl.tools@gmail.com> writes:

> On Tue, Apr 8, 2025 at 9:52 PM Sam James <sam@gentoo.org> wrote:
>>
>> "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.
>
> Any update on testing?

I think it looks good. No problems.

>
>> >
>> > 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