[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