]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
LD/testsuite: Expand archive verification to `--whole-archive' feature
authorMaciej W. Rozycki <macro@redhat.com>
Mon, 15 Dec 2025 19:04:30 +0000 (19:04 +0000)
committerMaciej W. Rozycki <macro@redhat.com>
Mon, 15 Dec 2025 19:04:30 +0000 (19:04 +0000)
Expand archive verification to cover the `--whole-archive' feature,
adding link map and verbose output matching to verify the correct
archive members are added and the unwanted ones omitted.

Adjust the linker flags accordingly for XCOFF targets, by switching from
the `-bexpall' option to `-unix' (`-bexpfull' would do too, but has some
test coverage already, unlike `-unix', which is a superset of the former
option), so that additional symbols pulled with `--whole-archive' aren't
discarded by linker garbage collection.

This test expansion has revealed the lack of thin archive support in AR
for Alpha/VMS and XCOFF targets, despite apparent presence of relevant
code in the respective BFD backends.  With `ar rcT' invocation a regular
archive is silently produced instead.

Rather than making the relevant tests overly permissive, XFAIL them for
the affected targets, referring PR binutils/33600.

ld/testsuite/ld-archive/abc.vd [new file with mode: 0644]
ld/testsuite/ld-archive/abtc.vd [new file with mode: 0644]
ld/testsuite/ld-archive/abwc.vd [new file with mode: 0644]
ld/testsuite/ld-archive/abwtc.vd [new file with mode: 0644]
ld/testsuite/ld-archive/archive.exp
ld/testsuite/ld-archive/nx.nd [new file with mode: 0644]
ld/testsuite/ld-archive/ny.nd [new file with mode: 0644]
ld/testsuite/ld-archive/x.nd [new file with mode: 0644]
ld/testsuite/ld-archive/y.nd [new file with mode: 0644]

diff --git a/ld/testsuite/ld-archive/abc.vd b/ld/testsuite/ld-archive/abc.vd
new file mode 100644 (file)
index 0000000..ff3183b
--- /dev/null
@@ -0,0 +1,22 @@
+#...
+using ..ternal linker script:.*
+==================================================
+#...
+==================================================
+.*: mode .*
+attempt to open tmpdir/abc\.o succeeded
+tmpdir/abc\.o
+attempt to open tmpdir/ab\.a succeeded
+tmpdir/ab\.a
+Archive member included to satisfy reference by file \(symbol\)
+
+tmpdir/ab\.a\(a\.o(:?bj)?\) +tmpdir/abc\.o \(aa\)
+\(tmpdir/ab\.a\)a\.o(:?bj)?
+tmpdir/ab\.a\(b\.o(:?bj)?\) +tmpdir/abc\.o \(bb\)
+\(tmpdir/ab\.a\)b\.o(:?bj)?
+!(:?\()?tmpdir/.*
+#...
+LOAD tmpdir/abc\.o
+LOAD tmpdir/ab\.a
+!LOAD .*
+#pass
diff --git a/ld/testsuite/ld-archive/abtc.vd b/ld/testsuite/ld-archive/abtc.vd
new file mode 100644 (file)
index 0000000..b2fe394
--- /dev/null
@@ -0,0 +1,22 @@
+#...
+using ..ternal linker script:.*
+==================================================
+#...
+==================================================
+.*: mode .*
+attempt to open tmpdir/abc\.o succeeded
+tmpdir/abc\.o
+attempt to open tmpdir/abt\.a succeeded
+tmpdir/abt\.a
+Archive member included to satisfy reference by file \(symbol\)
+
+tmpdir/a\.o +tmpdir/abc\.o \(aa\)
+tmpdir/a\.o
+tmpdir/b\.o +tmpdir/abc\.o \(bb\)
+tmpdir/b\.o
+!(:?\()?tmpdir/.*
+#...
+LOAD tmpdir/abc\.o
+LOAD tmpdir/abt\.a
+!LOAD .*
+#pass
diff --git a/ld/testsuite/ld-archive/abwc.vd b/ld/testsuite/ld-archive/abwc.vd
new file mode 100644 (file)
index 0000000..bc750a6
--- /dev/null
@@ -0,0 +1,24 @@
+#...
+using ..ternal linker script:.*
+==================================================
+#...
+==================================================
+.*: mode .*
+attempt to open tmpdir/abc\.o succeeded
+tmpdir/abc\.o
+attempt to open tmpdir/ab\.a succeeded
+tmpdir/ab\.a
+Archive member included to satisfy reference by file \(symbol\)
+
+tmpdir/ab\.a\(a\.o(:?bj)?\) +\(--whole-archive\)
+\(tmpdir/ab\.a\)a\.o(:?bj)?
+tmpdir/ab\.a\(b\.o(:?bj)?\) +\(--whole-archive\)
+\(tmpdir/ab\.a\)b\.o(:?bj)?
+tmpdir/ab\.a\(x\.o(:?bj)?\) +\(--whole-archive\)
+\(tmpdir/ab\.a\)x\.o(:?bj)?
+!(:?\()?tmpdir/.*
+#...
+LOAD tmpdir/abc\.o
+LOAD tmpdir/ab\.a
+!LOAD .*
+#pass
diff --git a/ld/testsuite/ld-archive/abwtc.vd b/ld/testsuite/ld-archive/abwtc.vd
new file mode 100644 (file)
index 0000000..5af70f0
--- /dev/null
@@ -0,0 +1,24 @@
+#...
+using ..ternal linker script:.*
+==================================================
+#...
+==================================================
+.*: mode .*
+attempt to open tmpdir/abc\.o succeeded
+tmpdir/abc\.o
+attempt to open tmpdir/abt\.a succeeded
+tmpdir/abt\.a
+Archive member included to satisfy reference by file \(symbol\)
+
+tmpdir/a\.o +\(--whole-archive\)
+tmpdir/a\.o
+tmpdir/b\.o +\(--whole-archive\)
+tmpdir/b\.o
+tmpdir/x\.o +\(--whole-archive\)
+tmpdir/x\.o
+!(:?\()?tmpdir/.*
+#...
+LOAD tmpdir/abc\.o
+LOAD tmpdir/abt\.a
+!LOAD .*
+#pass
index 035b271f775dd15ddc4ed8483f86b2614a033e8b..490db9e7b34becb9842a535b5f178126be5fec1e 100644 (file)
@@ -35,7 +35,7 @@ set old_ldflags $LDFLAGS
 
 # Prevent our otherwise unused data symbols from being GC'd on XCOFF targets.
 if { [is_xcoff_format] } {
-    append LDFLAGS " -bexpall"
+    append LDFLAGS " -unix"
 }
 
 # With Alpha/VMS NM doesn't handle executables and for MS-DOS there's no way
@@ -54,30 +54,70 @@ proc ld_archive_filter_tests { arg } {
     }
 }
 
+# Single archive tests.
 run_ld_link_tests [list \
     [list "Regular archive link" \
-       "-e ff" "tmpdir/ab.a" \
+       "-e ff" "tmpdir/ab.a --verbose --print-map" \
        "" {abc.s} \
-       [ld_archive_filter_tests {{nm "" abc.nd}}] \
+       [ld_archive_filter_tests {{ld abc.vd} \
+                                 {nm "" abc.nd} \
+                                 {nm "" nx.nd}}] \
        "abc" \
     ] \
 ]
 setup_xfail "binutils/33484" "alpha*-*-linux*ecoff*" "alpha*-*-osf*"
 setup_xfail "binutils/33485" "cris-*-*aout*" "i\[3-7\]86-*-bsd*" \
     "i\[3-7\]86-*-msdos*" "ns32k-*-*" "pdp11-*-*"
+setup_xfail "binutils/33600" "alpha*-*-*vms*"
+if { [is_xcoff_format] } {
+    setup_xfail "binutils/33600" "*-*-*"
+}
 run_ld_link_tests [list \
     [list "Thin archive link" \
-       "-e ff" "tmpdir/abt.a" \
+       "-e ff" "tmpdir/abt.a --verbose --print-map" \
        "" {abc.s} \
-       [ld_archive_filter_tests {{nm "" abc.nd}}] \
+       [ld_archive_filter_tests {{ld abtc.vd} \
+                                 {nm "" abc.nd} \
+                                 {nm "" nx.nd}}] \
        "abtc" \
     ] \
 ]
+
+# Single whole archive tests.
+run_ld_link_tests [list \
+    [list "Regular whole archive link" \
+       "-e ff" "--whole-archive tmpdir/ab.a --verbose --print-map" \
+       "" {abc.s} \
+       [ld_archive_filter_tests {{ld abwc.vd} \
+                                 {nm "" abc.nd} \
+                                 {nm "" x.nd}}] \
+       "abwc" \
+    ] \
+]
+setup_xfail "binutils/33484" "alpha*-*-linux*ecoff*" "alpha*-*-osf*"
+setup_xfail "binutils/33600" "alpha*-*-*vms*"
+if { [is_xcoff_format] } {
+    setup_xfail "binutils/33600" "*-*-*"
+}
+run_ld_link_tests [list \
+    [list "Thin whole archive link" \
+       "-e ff" "--whole-archive tmpdir/abt.a --verbose --print-map" \
+       "" {abc.s} \
+       [ld_archive_filter_tests {{ld abwtc.vd} \
+                                 {nm "" abc.nd} \
+                                 {nm "" x.nd}}] \
+       "abwtc" \
+    ] \
+]
+
+# Dual archive tests.
 run_ld_link_tests [list \
     [list "Regular archive plus regular link" \
        "-e ff" "tmpdir/ab.a tmpdir/cd.a" \
        "" {abcde.s} \
-       [ld_archive_filter_tests {{nm "" abcde.nd}}] \
+       [ld_archive_filter_tests {{nm "" abcde.nd} \
+                                 {nm "" nx.nd} \
+                                 {nm "" ny.nd}}] \
        "abcde" \
     ] \
 ]
@@ -88,7 +128,9 @@ run_ld_link_tests [list \
     [list "Regular archive plus thin link" \
        "-e ff" "tmpdir/ab.a tmpdir/cdt.a" \
        "" {abcde.s} \
-       [ld_archive_filter_tests {{nm "" abcde.nd}}] \
+       [ld_archive_filter_tests {{nm "" abcde.nd} \
+                                 {nm "" nx.nd} \
+                                 {nm "" ny.nd}}] \
        "abcdte" \
     ] \
 ]
@@ -99,7 +141,9 @@ run_ld_link_tests [list \
     [list "Thin archive plus regular link" \
        "-e ff" "tmpdir/abt.a tmpdir/cd.a" \
        "" {abcde.s} \
-       [ld_archive_filter_tests {{nm "" abcde.nd}}] \
+       [ld_archive_filter_tests {{nm "" abcde.nd} \
+                                 {nm "" nx.nd} \
+                                 {nm "" ny.nd}}] \
        "abtcde" \
     ] \
 ]
@@ -110,11 +154,36 @@ run_ld_link_tests [list \
     [list "Thin archive plus thin link" \
        "-e ff" "tmpdir/abt.a tmpdir/cdt.a" \
        "" {abcde.s} \
-       [ld_archive_filter_tests {{nm "" abcde.nd}}] \
+       [ld_archive_filter_tests {{nm "" abcde.nd} \
+                                 {nm "" nx.nd} \
+                                 {nm "" ny.nd}}] \
        "abtcdte" \
     ] \
 ]
 
+# Dual whole archive tests.
+run_ld_link_tests [list \
+    [list "Regular archive plus whole regular link" \
+       "-e ff" "tmpdir/ab.a --whole-archive tmpdir/cd.a" \
+       "" {abcde.s} \
+       [ld_archive_filter_tests {{nm "" abcde.nd} \
+                                 {nm "" nx.nd} \
+                                 {nm "" y.nd}}] \
+       "abcdwe" \
+    ] \
+]
+setup_xfail "binutils/33484" "alpha*-*-linux*ecoff*" "alpha*-*-osf*"
+run_ld_link_tests [list \
+    [list "Regular archive plus whole thin link" \
+       "-e ff" "tmpdir/ab.a --whole-archive tmpdir/cdt.a" \
+       "" {abcde.s} \
+       [ld_archive_filter_tests {{nm "" abcde.nd} \
+                                 {nm "" nx.nd} \
+                                 {nm "" y.nd}}] \
+       "abcdwte" \
+    ] \
+]
+
 set LDFLAGS $old_ldflags
 
 # Alpha/VMS archives always have an index and XCOFF targets currently
@@ -123,6 +192,7 @@ if { [istarget "alpha*-*-*vms*"] || [is_xcoff_format] } {
     return
 }
 
+# Single non-index archive tests.
 run_ld_link_tests [list \
     [list "Regular archive w/o index link" \
        "-e ff" "tmpdir/abn.a" \
diff --git a/ld/testsuite/ld-archive/nx.nd b/ld/testsuite/ld-archive/nx.nd
new file mode 100644 (file)
index 0000000..0a127c9
--- /dev/null
@@ -0,0 +1,4 @@
+#failif
+#...
+[0-9a-f]+ D xx
+#pass
diff --git a/ld/testsuite/ld-archive/ny.nd b/ld/testsuite/ld-archive/ny.nd
new file mode 100644 (file)
index 0000000..7c8beeb
--- /dev/null
@@ -0,0 +1,4 @@
+#failif
+#...
+[0-9a-f]+ D yy
+#pass
diff --git a/ld/testsuite/ld-archive/x.nd b/ld/testsuite/ld-archive/x.nd
new file mode 100644 (file)
index 0000000..f279298
--- /dev/null
@@ -0,0 +1,3 @@
+#...
+[0-9a-f]+ D xx
+#pass
diff --git a/ld/testsuite/ld-archive/y.nd b/ld/testsuite/ld-archive/y.nd
new file mode 100644 (file)
index 0000000..8b0fa39
--- /dev/null
@@ -0,0 +1,3 @@
+#...
+[0-9a-f]+ D yy
+#pass