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

H.J. Lu hjl.tools@gmail.com
Thu Apr 10 17:28:42 GMT 2025


On Thu, Apr 10, 2025 at 9:05 AM Sam James <sam@gentoo.org> wrote:
>
> "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.

I am checking it in.

Thanks.

> >
> >> >
> >> > 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)
> >> > +{
> >> > +}



-- 
H.J.


More information about the Binutils mailing list