[binutils-gdb] ld: Skip the LTO archive member only for the earlier DSO

H.J. Lu hjl@sourceware.org
Thu Apr 10 17:34:38 GMT 2025


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=2cec91421e603699aa8f446d1ae44e873c4965f8

commit 2cec91421e603699aa8f446d1ae44e873c4965f8
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Tue Apr 8 13:10:02 2025 -0700

    ld: Skip the LTO archive member only for the earlier DSO
    
    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.
    
    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>

Diff:
---
 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(-)

diff --git a/bfd/elflink.c b/bfd/elflink.c
index 549b7b7dd92..919f2a7fd02 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-cvs mailing list