[PATCH v9 19/19] gnu directives: bfd: generic tests for merge of gnu attributes v2

Matthieu Longo matthieu.longo@arm.com
Mon Sep 1 16:56:26 GMT 2025


These tests are a copy-paste of the generic tests for AArch64.

Test cases:
    - only one input object is copied to the output object
    - merge two inputs with optional subsections of both types
      ULEB128 and NTBS, which contains same, additional, and
      missing attributes.
    - mismatch subsection properties.
    - combine matching required subsections.
    - combine non-matching required subsections.
    - prune unknown attributes in known subsections.
    - prune unknown subsections.
---
 ld/testsuite/ld-attributes/ld-attributes.exp  | 41 ++++++++++++++
 .../ld-attributes/oav2-1-all-optional-1.s     | 15 ++++++
 .../ld-attributes/oav2-1-all-optional-2.s     | 15 ++++++
 ...ismatch-subsec-props-with-all-optional-1.d |  8 +++
 ...ismatch-subsec-props-with-all-optional-1.s |  2 +
 ld/testsuite/ld-attributes/oav2-1-one-file.d  | 43 +++++++++++++++
 ...-1-two-files-all-optional-1more-1missing.d | 54 +++++++++++++++++++
 ...nknown-and-known-attr-known-subsection-1.s | 11 ++++
 ...nknown-and-known-attr-known-subsection-2.s | 11 ++++
 ...-unknown-and-known-attr-known-subsection.d | 26 +++++++++
 ...v2-2-mix-unknown-and-known-subsections-1.s | 19 +++++++
 ...v2-2-mix-unknown-and-known-subsections-2.s | 19 +++++++
 ...oav2-2-mix-unknown-and-known-subsections.d | 27 ++++++++++
 .../oav2-2-required-subsec-A-1.s              |  3 ++
 .../oav2-2-required-subsec-A-2.s              |  3 ++
 .../ld-attributes/oav2-2-required-subsec-B.s  |  3 ++
 .../oav2-2-required-subsec-nok.d              |  8 +++
 .../ld-attributes/oav2-2-required-subsec-ok.d | 17 ++++++
 18 files changed, 325 insertions(+)
 create mode 100644 ld/testsuite/ld-attributes/ld-attributes.exp
 create mode 100644 ld/testsuite/ld-attributes/oav2-1-all-optional-1.s
 create mode 100644 ld/testsuite/ld-attributes/oav2-1-all-optional-2.s
 create mode 100644 ld/testsuite/ld-attributes/oav2-1-mismatch-subsec-props-with-all-optional-1.d
 create mode 100644 ld/testsuite/ld-attributes/oav2-1-mismatch-subsec-props-with-all-optional-1.s
 create mode 100644 ld/testsuite/ld-attributes/oav2-1-one-file.d
 create mode 100644 ld/testsuite/ld-attributes/oav2-1-two-files-all-optional-1more-1missing.d
 create mode 100644 ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-attr-known-subsection-1.s
 create mode 100644 ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-attr-known-subsection-2.s
 create mode 100644 ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-attr-known-subsection.d
 create mode 100644 ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-subsections-1.s
 create mode 100644 ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-subsections-2.s
 create mode 100644 ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-subsections.d
 create mode 100644 ld/testsuite/ld-attributes/oav2-2-required-subsec-A-1.s
 create mode 100644 ld/testsuite/ld-attributes/oav2-2-required-subsec-A-2.s
 create mode 100644 ld/testsuite/ld-attributes/oav2-2-required-subsec-B.s
 create mode 100644 ld/testsuite/ld-attributes/oav2-2-required-subsec-nok.d
 create mode 100644 ld/testsuite/ld-attributes/oav2-2-required-subsec-ok.d

diff --git a/ld/testsuite/ld-attributes/ld-attributes.exp b/ld/testsuite/ld-attributes/ld-attributes.exp
new file mode 100644
index 00000000000..39f11499f57
--- /dev/null
+++ b/ld/testsuite/ld-attributes/ld-attributes.exp
@@ -0,0 +1,41 @@
+# Expect script for AARCH64 ELF tests related to GNU properties.
+# Copyright (C) 2025 Free Software Foundation, Inc.
+#
+# This file is part of the GNU Binutils.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+#
+# Generic tests for GNU attributes v2
+#
+
+# Exclude non-ELF targets.
+if { ![is_elf_format] } {
+  return
+}
+
+proc run_dump_test_lp64 { testname } {
+  run_dump_test $testname \
+    [list [list as "-I\$srcdir/\$subdir"]]
+}
+
+set test_list [lsort [glob -nocomplain $srcdir/$subdir/*.d]]
+
+foreach t $test_list {
+  # We need to strip the ".d", but can leave the dirname.
+  run_dump_test [file rootname $t] \
+    [list [list as "-I\$srcdir/\$subdir"]]
+}
diff --git a/ld/testsuite/ld-attributes/oav2-1-all-optional-1.s b/ld/testsuite/ld-attributes/oav2-1-all-optional-1.s
new file mode 100644
index 00000000000..bfe5fd24160
--- /dev/null
+++ b/ld/testsuite/ld-attributes/oav2-1-all-optional-1.s
@@ -0,0 +1,15 @@
+	.gnu_subsection gnu-testing-ba-1-MERGE-AND, optional, uleb128
+	.gnu_attribute  0, 1
+	.gnu_attribute  1, 0
+
+	.gnu_subsection gnu-testing-ba-2-MERGE-AND, optional, uleb128
+	.gnu_attribute  0, 0
+	.gnu_attribute  1, 1
+
+	.gnu_subsection gnu-testing-ba-3-MERGE-ADD, optional, ntbs
+	.gnu_attribute  0, "hello"
+	.gnu_attribute  1, "world"
+
+	.gnu_subsection gnu-testing-ba-5-MERGE-ADD, optional, ntbs
+	.gnu_attribute  0, "hello"
+	.gnu_attribute  1, "world"
diff --git a/ld/testsuite/ld-attributes/oav2-1-all-optional-2.s b/ld/testsuite/ld-attributes/oav2-1-all-optional-2.s
new file mode 100644
index 00000000000..7b2dc5b0c15
--- /dev/null
+++ b/ld/testsuite/ld-attributes/oav2-1-all-optional-2.s
@@ -0,0 +1,15 @@
+	.gnu_subsection gnu-testing-ba-1-MERGE-AND, optional, uleb128
+	.gnu_attribute  0, 1
+	.gnu_attribute  1, 1
+
+	.gnu_subsection gnu-testing-ba-2-MERGE-AND, optional, uleb128
+	.gnu_attribute  0, 1
+	.gnu_attribute  1, 1
+
+	.gnu_subsection gnu-testing-ba-4-MERGE-ADD, optional, ntbs
+	.gnu_attribute  0, "foo"
+	.gnu_attribute  1, "bar"
+
+	.gnu_subsection gnu-testing-ba-5-MERGE-ADD, optional, ntbs
+	.gnu_attribute  0, "foo"
+	.gnu_attribute  1, "bar"
diff --git a/ld/testsuite/ld-attributes/oav2-1-mismatch-subsec-props-with-all-optional-1.d b/ld/testsuite/ld-attributes/oav2-1-mismatch-subsec-props-with-all-optional-1.d
new file mode 100644
index 00000000000..d8900dc183a
--- /dev/null
+++ b/ld/testsuite/ld-attributes/oav2-1-mismatch-subsec-props-with-all-optional-1.d
@@ -0,0 +1,8 @@
+# name: Object Attributes v2: mismatch subsection properties with oav2-1-all-optional-1
+# target: [supports_oa_v2]
+# source: oav2-1-all-optional-1.s
+# source: oav2-1-mismatch-subsec-props-with-all-optional-1.s
+# as:
+# ld: -shared
+#error: \A[^\n]*oav2-1-all-optional-1\.o, [^:]*oav2-1-mismatch-subsec-props-with-all-optional-1\.o: error: parameters of subsection 'gnu-testing-ba-1-MERGE-AND' are mismatching\. \(optional, ULEB128\) VS \(required, ULEB128\)
+#error: \n[^\n]*oav2-1-all-optional-1\.o, [^:]*oav2-1-mismatch-subsec-props-with-all-optional-1\.o: error: parameters of subsection 'gnu-testing-ba-2-MERGE-AND' are mismatching\. \(optional, ULEB128\) VS \(optional, NTBS\)\Z
diff --git a/ld/testsuite/ld-attributes/oav2-1-mismatch-subsec-props-with-all-optional-1.s b/ld/testsuite/ld-attributes/oav2-1-mismatch-subsec-props-with-all-optional-1.s
new file mode 100644
index 00000000000..36789b33bea
--- /dev/null
+++ b/ld/testsuite/ld-attributes/oav2-1-mismatch-subsec-props-with-all-optional-1.s
@@ -0,0 +1,2 @@
+	.gnu_subsection gnu-testing-ba-1-MERGE-AND, required, uleb128
+	.gnu_subsection gnu-testing-ba-2-MERGE-AND, optional, ntbs
diff --git a/ld/testsuite/ld-attributes/oav2-1-one-file.d b/ld/testsuite/ld-attributes/oav2-1-one-file.d
new file mode 100644
index 00000000000..673f9f57922
--- /dev/null
+++ b/ld/testsuite/ld-attributes/oav2-1-one-file.d
@@ -0,0 +1,43 @@
+# name: Object Attributes v2: only one input object is copied to the output object
+# target: [supports_oa_v2]
+# source: oav2-1-all-optional-1.s
+# as:
+# ld: -shared
+# readelf: --arch-specific
+
+Subsections:
+ - Name:	  gnu-testing-ba-1-MERGE-AND
+   Scope:	  private
+   Length:	  37
+   Comprehension: optional
+   Encoding:	  ULEB128
+   Values:
+    Tag_unknown_0:	1 \(0x1\)
+    Tag_unknown_1:	0 \(0x0\)
+
+ - Name:	  gnu-testing-ba-2-MERGE-AND
+   Scope:	  private
+   Length:	  37
+   Comprehension: optional
+   Encoding:	  ULEB128
+   Values:
+    Tag_unknown_0:	0 \(0x0\)
+    Tag_unknown_1:	1 \(0x1\)
+
+ - Name:	  gnu-testing-ba-3-MERGE-ADD
+   Scope:	  private
+   Length:	  47
+   Comprehension: optional
+   Encoding:	  NTBS
+   Values:
+    Tag_unknown_0:	"hello"
+    Tag_unknown_1:	"world"
+
+ - Name:	  gnu-testing-ba-5-MERGE-ADD
+   Scope:	  private
+   Length:	  47
+   Comprehension: optional
+   Encoding:	  NTBS
+   Values:
+    Tag_unknown_0:	"hello"
+    Tag_unknown_1:	"world"
diff --git a/ld/testsuite/ld-attributes/oav2-1-two-files-all-optional-1more-1missing.d b/ld/testsuite/ld-attributes/oav2-1-two-files-all-optional-1more-1missing.d
new file mode 100644
index 00000000000..850fef3d4fa
--- /dev/null
+++ b/ld/testsuite/ld-attributes/oav2-1-two-files-all-optional-1more-1missing.d
@@ -0,0 +1,54 @@
+# name: Object Attributes v2: 2 files, all optional, 1 more, 1 missing
+# target: [supports_oa_v2]
+# source: oav2-1-all-optional-1.s
+# source: oav2-1-all-optional-2.s
+# as:
+# ld: -shared
+# readelf: --arch-specific
+
+Subsections:
+ - Name:	  gnu-testing-ba-1-MERGE-AND
+   Scope:	  private
+   Length:	  37
+   Comprehension: optional
+   Encoding:	  ULEB128
+   Values:
+    Tag_unknown_0:	1 \(0x1\)
+    Tag_unknown_1:	0 \(0x0\)
+
+ - Name:	  gnu-testing-ba-2-MERGE-AND
+   Scope:	  private
+   Length:	  37
+   Comprehension: optional
+   Encoding:	  ULEB128
+   Values:
+    Tag_unknown_0:	0 \(0x0\)
+    Tag_unknown_1:	1 \(0x1\)
+
+ - Name:	  gnu-testing-ba-3-MERGE-ADD
+   Scope:	  private
+   Length:	  47
+   Comprehension: optional
+   Encoding:	  NTBS
+   Values:
+    Tag_unknown_0:	"hello"
+    Tag_unknown_1:	"world"
+
+ - Name:	  gnu-testing-ba-4-MERGE-ADD
+   Scope:	  private
+   Length:	  43
+   Comprehension: optional
+   Encoding:	  NTBS
+   Values:
+    Tag_unknown_0:	"foo"
+    Tag_unknown_1:	"bar"
+
+ - Name:	  gnu-testing-ba-5-MERGE-ADD
+   Scope:	  private
+   Length:	  55
+   Comprehension: optional
+   Encoding:	  NTBS
+   Values:
+    Tag_unknown_0:	"hello\+foo"
+    Tag_unknown_1:	"world\+bar"
+
diff --git a/ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-attr-known-subsection-1.s b/ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-attr-known-subsection-1.s
new file mode 100644
index 00000000000..91a47630298
--- /dev/null
+++ b/ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-attr-known-subsection-1.s
@@ -0,0 +1,11 @@
+	.gnu_subsection gnu-testing-ba-1-MERGE-AND, optional, uleb128
+	.gnu_attribute  0, 1
+	.gnu_attribute  1, 1
+	.gnu_attribute  2, 1 // Unknown tag
+	.gnu_attribute  3, 1 // Unknown tag
+
+	.gnu_subsection gnu-testing-ba-2-MERGE-ADD, optional, ntbs
+	.gnu_attribute  0, "foo"
+	.gnu_attribute  1, "bar"
+	.gnu_attribute  2, "foo2" // Unknown tag
+	.gnu_attribute  3, "foo3" // Unknown tag
diff --git a/ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-attr-known-subsection-2.s b/ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-attr-known-subsection-2.s
new file mode 100644
index 00000000000..b014ac32968
--- /dev/null
+++ b/ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-attr-known-subsection-2.s
@@ -0,0 +1,11 @@
+	.gnu_subsection gnu-testing-ba-1-MERGE-AND, optional, uleb128
+	.gnu_attribute  0, 1
+	.gnu_attribute  1, 1
+	.gnu_attribute  2, 1 // Unknown tag
+	.gnu_attribute  4, 1 // Unknown tag
+
+	.gnu_subsection gnu-testing-ba-2-MERGE-ADD, optional, ntbs
+	.gnu_attribute  0, "foo"
+	.gnu_attribute  1, "bar"
+	.gnu_attribute  2, "foo2" // Unknown tag
+	.gnu_attribute  4, "foo4" // Unknown tag
diff --git a/ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-attr-known-subsection.d b/ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-attr-known-subsection.d
new file mode 100644
index 00000000000..ba98b71b1c2
--- /dev/null
+++ b/ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-attr-known-subsection.d
@@ -0,0 +1,26 @@
+# name: Object Attributes v2: unknown attribute inside known subsection should be removed from the output.
+# target: [supports_oa_v2]
+# source: oav2-2-mix-unknown-and-known-attr-known-subsection-1.s
+# source: oav2-2-mix-unknown-and-known-attr-known-subsection-2.s
+# as:
+# ld: -shared
+# readelf: --arch-specific
+
+Subsections:
+ - Name:	  gnu-testing-ba-1-MERGE-AND
+   Scope:	  private
+   Length:	  37
+   Comprehension: optional
+   Encoding:	  ULEB128
+   Values:
+    Tag_unknown_0:	1 \(0x1\)
+    Tag_unknown_1:	1 \(0x1\)
+
+ - Name:	  gnu-testing-ba-2-MERGE-ADD
+   Scope:	  private
+   Length:	  51
+   Comprehension: optional
+   Encoding:	  NTBS
+   Values:
+    Tag_unknown_0:	"foo\+foo"
+    Tag_unknown_1:	"bar\+bar"
diff --git a/ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-subsections-1.s b/ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-subsections-1.s
new file mode 100644
index 00000000000..74f82b40bc7
--- /dev/null
+++ b/ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-subsections-1.s
@@ -0,0 +1,19 @@
+	.gnu_subsection gnu-testing-ba-1-MERGE-AND, optional, uleb128
+	.gnu_attribute  0, 1
+	.gnu_attribute  1, 0
+
+	.gnu_subsection private-1, optional, uleb128
+	.gnu_attribute  0, 0
+	.gnu_attribute  1, 1
+
+	.gnu_subsection private-2, optional, ntbs
+	.gnu_attribute  0, "hello"
+	.gnu_attribute  1, "world"
+
+	.gnu_subsection private-4, optional, uleb128
+	.gnu_attribute  0, 1
+	.gnu_attribute  1, 1
+
+	.gnu_subsection gnu-testing-ba-2-MERGE-ADD, optional, ntbs
+	.gnu_attribute  0, "hello"
+	.gnu_attribute  1, "world"
diff --git a/ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-subsections-2.s b/ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-subsections-2.s
new file mode 100644
index 00000000000..13957e5bbca
--- /dev/null
+++ b/ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-subsections-2.s
@@ -0,0 +1,19 @@
+	.gnu_subsection gnu-testing-ba-1-MERGE-AND, optional, uleb128
+	.gnu_attribute  0, 1
+	.gnu_attribute  1, 1
+
+	.gnu_subsection private-1, optional, uleb128
+	.gnu_attribute  0, 1
+	.gnu_attribute  1, 1
+
+	.gnu_subsection private-2, optional, ntbs
+	.gnu_attribute  0, "foo"
+	.gnu_attribute  1, "bar"
+
+	.gnu_subsection private-3, optional, uleb128
+	.gnu_attribute  0, 1
+	.gnu_attribute  1, 1
+
+	.gnu_subsection gnu-testing-ba-2-MERGE-ADD, optional, ntbs
+	.gnu_attribute  0, "foo"
+	.gnu_attribute  1, "bar"
diff --git a/ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-subsections.d b/ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-subsections.d
new file mode 100644
index 00000000000..7a416498d41
--- /dev/null
+++ b/ld/testsuite/ld-attributes/oav2-2-mix-unknown-and-known-subsections.d
@@ -0,0 +1,27 @@
+# name: Object Attributes v2: unknown subsections are removed from the output.
+# target: [supports_oa_v2]
+# source: oav2-2-mix-unknown-and-known-subsections-1.s
+# source: oav2-2-mix-unknown-and-known-subsections-2.s
+# as:
+# ld: -shared
+# readelf: --arch-specific
+
+Subsections:
+ - Name:	  gnu-testing-ba-1-MERGE-AND
+   Scope:	  private
+   Length:	  37
+   Comprehension: optional
+   Encoding:	  ULEB128
+   Values:
+    Tag_unknown_0:	1 \(0x1\)
+    Tag_unknown_1:	0 \(0x0\)
+
+ - Name:	  gnu-testing-ba-2-MERGE-ADD
+   Scope:	  private
+   Length:	  55
+   Comprehension: optional
+   Encoding:	  NTBS
+   Values:
+    Tag_unknown_0:	"hello\+foo"
+    Tag_unknown_1:	"world\+bar"
+
diff --git a/ld/testsuite/ld-attributes/oav2-2-required-subsec-A-1.s b/ld/testsuite/ld-attributes/oav2-2-required-subsec-A-1.s
new file mode 100644
index 00000000000..15c2b6044ea
--- /dev/null
+++ b/ld/testsuite/ld-attributes/oav2-2-required-subsec-A-1.s
@@ -0,0 +1,3 @@
+	.gnu_subsection gnu-testing-ba-1-MERGE-AND, required, uleb128
+	.gnu_attribute  0, 1
+	.gnu_attribute  1, 0
diff --git a/ld/testsuite/ld-attributes/oav2-2-required-subsec-A-2.s b/ld/testsuite/ld-attributes/oav2-2-required-subsec-A-2.s
new file mode 100644
index 00000000000..15c2b6044ea
--- /dev/null
+++ b/ld/testsuite/ld-attributes/oav2-2-required-subsec-A-2.s
@@ -0,0 +1,3 @@
+	.gnu_subsection gnu-testing-ba-1-MERGE-AND, required, uleb128
+	.gnu_attribute  0, 1
+	.gnu_attribute  1, 0
diff --git a/ld/testsuite/ld-attributes/oav2-2-required-subsec-B.s b/ld/testsuite/ld-attributes/oav2-2-required-subsec-B.s
new file mode 100644
index 00000000000..2d200b54f33
--- /dev/null
+++ b/ld/testsuite/ld-attributes/oav2-2-required-subsec-B.s
@@ -0,0 +1,3 @@
+	.gnu_subsection gnu-testing-ba-1-MERGE-AND, required, uleb128
+	.gnu_attribute  0, 1
+	.gnu_attribute  1, 1
diff --git a/ld/testsuite/ld-attributes/oav2-2-required-subsec-nok.d b/ld/testsuite/ld-attributes/oav2-2-required-subsec-nok.d
new file mode 100644
index 00000000000..5c25f0b2262
--- /dev/null
+++ b/ld/testsuite/ld-attributes/oav2-2-required-subsec-nok.d
@@ -0,0 +1,8 @@
+# name: Object Attributes v2: combine non-matching required subsections
+# target: [supports_oa_v2]
+# source: oav2-2-required-subsec-A-1.s
+# source: oav2-2-required-subsec-B.s
+# source: oav2-2-required-subsec-A-2.s
+# as:
+# ld: -shared
+#error: \A[^\n]*oav2-2-required-subsec-A-1\.o, [^:]*oav2-2-required-subsec-B\.o: error: mismatching values 0x0 and 0x1 for required object attribute 'GNUTestTag_1' in subsection 'gnu-testing-ba-1-MERGE-AND'\Z
diff --git a/ld/testsuite/ld-attributes/oav2-2-required-subsec-ok.d b/ld/testsuite/ld-attributes/oav2-2-required-subsec-ok.d
new file mode 100644
index 00000000000..adcc913277c
--- /dev/null
+++ b/ld/testsuite/ld-attributes/oav2-2-required-subsec-ok.d
@@ -0,0 +1,17 @@
+# name: Object Attributes v2: combine matching required subsections
+# target: [supports_oa_v2]
+# source: oav2-2-required-subsec-A-1.s
+# source: oav2-2-required-subsec-A-2.s
+# as:
+# ld: -shared
+# readelf: --arch-specific
+
+Subsections:
+ - Name:	  gnu-testing-ba-1-MERGE-AND
+   Scope:	  private
+   Length:	  37
+   Comprehension: required
+   Encoding:	  ULEB128
+   Values:
+    Tag_unknown_0:	1 \(0x1\)
+    Tag_unknown_1:	0 \(0x0\)
-- 
2.51.0



More information about the Binutils mailing list