[PATCH v9 17/19] gnu directives: gas/readelf tests for gnu attributes v2
Matthieu Longo
matthieu.longo@arm.com
Mon Sep 1 16:56:24 GMT 2025
These tests are a copy-paste of the generic parsing tests for AArch64.
The added tests cover the parsing of the new assembly directives
(gnu_subsection and gnu_attribute), the serialization of the
Object Attributes v2 (OAv2) data into an object file, and the
dumping of those data via readelf.
The parsing tests focus on the following points:
- the syntax of the new directives.
- the recognition of generic tokens like: NTBS, ULEB128, required,
optional.
The dumping tests focus on:
- the OAv2 population into the correct section assigned by the backend.
- the merge of the subsections and attributes when they are declared
several times inside respectively the same compilation unit, and
subsection.
- the sorting of OAv2 before the serialization.
---
binutils/testsuite/lib/binutils-common.exp | 26 +++++++
.../gas/gnu-attributes/gnu-attributes.exp | 25 ++++++
.../oa-gnu-attribute-directive.d | 6 ++
.../oa-gnu-attribute-directive.s | 1 +
.../oa-gnu-subsection-directive.d | 6 ++
.../oa-gnu-subsection-directive.s | 1 +
.../gas/gnu-attributes/oav2-failures-1.d | 33 ++++++++
.../gas/gnu-attributes/oav2-failures-1.s | 64 ++++++++++++++++
.../oav2-interleaved-subsections.d | 36 +++++++++
.../oav2-interleaved-subsections.s | 32 ++++++++
.../gnu-attributes/oav2-subsection-parsing.d | 76 +++++++++++++++++++
.../gnu-attributes/oav2-subsection-parsing.s | 37 +++++++++
.../gas/gnu-attributes/oav2-success-1.d | 54 +++++++++++++
.../gas/gnu-attributes/oav2-success-1.s | 32 ++++++++
14 files changed, 429 insertions(+)
create mode 100644 gas/testsuite/gas/gnu-attributes/gnu-attributes.exp
create mode 100644 gas/testsuite/gas/gnu-attributes/oa-gnu-attribute-directive.d
create mode 100644 gas/testsuite/gas/gnu-attributes/oa-gnu-attribute-directive.s
create mode 100644 gas/testsuite/gas/gnu-attributes/oa-gnu-subsection-directive.d
create mode 100644 gas/testsuite/gas/gnu-attributes/oa-gnu-subsection-directive.s
create mode 100644 gas/testsuite/gas/gnu-attributes/oav2-failures-1.d
create mode 100644 gas/testsuite/gas/gnu-attributes/oav2-failures-1.s
create mode 100644 gas/testsuite/gas/gnu-attributes/oav2-interleaved-subsections.d
create mode 100644 gas/testsuite/gas/gnu-attributes/oav2-interleaved-subsections.s
create mode 100644 gas/testsuite/gas/gnu-attributes/oav2-subsection-parsing.d
create mode 100644 gas/testsuite/gas/gnu-attributes/oav2-subsection-parsing.s
create mode 100644 gas/testsuite/gas/gnu-attributes/oav2-success-1.d
create mode 100644 gas/testsuite/gas/gnu-attributes/oav2-success-1.s
diff --git a/binutils/testsuite/lib/binutils-common.exp b/binutils/testsuite/lib/binutils-common.exp
index 47fe48a4919..2b2ecb2d0a5 100644
--- a/binutils/testsuite/lib/binutils-common.exp
+++ b/binutils/testsuite/lib/binutils-common.exp
@@ -507,6 +507,32 @@ proc gas_sframe_check {} {
return $check_as_sframe_result
}
+# Whether a target support Object Attributes v1
+proc supports_oa_v1 {} {
+ if { [istarget arc-*-*]
+ || [istarget arm*-*-*]
+ || [istarget csky*-*-*]
+ || [istarget m68*-*-*]
+ || [istarget mips*-*-*]
+ || [istarget msp*-*-*]
+ || [istarget powerpc*-*-*]
+ || [istarget riscv*-*-*]
+ || [istarget s390*-*-*]
+ || [istarget sparc*-*-*]
+ || [istarget tic6x*-*-*] } {
+ return 1
+ }
+ return 0
+}
+
+# Whether a target support Object Attributes v2
+proc supports_oa_v2 {} {
+ if {[istarget aarch64*-*-*]} {
+ return 1
+ }
+ return 0
+}
+
# get_relative_path FROM TO
#
# Return a relative path to TO starting from FROM, which is usually
diff --git a/gas/testsuite/gas/gnu-attributes/gnu-attributes.exp b/gas/testsuite/gas/gnu-attributes/gnu-attributes.exp
new file mode 100644
index 00000000000..5b806394ea8
--- /dev/null
+++ b/gas/testsuite/gas/gnu-attributes/gnu-attributes.exp
@@ -0,0 +1,25 @@
+# Copyright (C) 2025 Free Software Foundation, Inc.
+
+# 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.
+
+# Exclude non-aarch64-ELF targets.
+if { ![is_elf_format] } {
+ return
+}
+
+#
+# Generic tests for GNU attributes v1 and v2
+#
+run_dump_tests [lsort [glob -nocomplain $srcdir/$subdir/*.d]]
diff --git a/gas/testsuite/gas/gnu-attributes/oa-gnu-attribute-directive.d b/gas/testsuite/gas/gnu-attributes/oa-gnu-attribute-directive.d
new file mode 100644
index 00000000000..52b56d593f7
--- /dev/null
+++ b/gas/testsuite/gas/gnu-attributes/oa-gnu-attribute-directive.d
@@ -0,0 +1,6 @@
+# name: GNU attributes v1/v2: no support for directive gnu_attribute
+# notarget: [supports_oa_v1] [supports_oa_v2]
+# source: oa-gnu-attribute-directive.s
+# as:
+#error: \A[^\n]+: Assembler messages:
+#error: \n[^\n]+: Error: unknown pseudo-op: `\.gnu_attribute'\Z
diff --git a/gas/testsuite/gas/gnu-attributes/oa-gnu-attribute-directive.s b/gas/testsuite/gas/gnu-attributes/oa-gnu-attribute-directive.s
new file mode 100644
index 00000000000..a3cdcae37c9
--- /dev/null
+++ b/gas/testsuite/gas/gnu-attributes/oa-gnu-attribute-directive.s
@@ -0,0 +1 @@
+ .gnu_attribute 0, 1
diff --git a/gas/testsuite/gas/gnu-attributes/oa-gnu-subsection-directive.d b/gas/testsuite/gas/gnu-attributes/oa-gnu-subsection-directive.d
new file mode 100644
index 00000000000..af241c17cec
--- /dev/null
+++ b/gas/testsuite/gas/gnu-attributes/oa-gnu-subsection-directive.d
@@ -0,0 +1,6 @@
+# name: GNU attributes v2: no support for directive gnu_subsection
+# notarget: [supports_oa_v2]
+# source: oa-gnu-subsection-directive.s
+# as:
+#error: \A[^\n]+: Assembler messages:
+#error: \n[^\n]+: Error: unknown pseudo-op: `\.gnu_subsection'\Z
diff --git a/gas/testsuite/gas/gnu-attributes/oa-gnu-subsection-directive.s b/gas/testsuite/gas/gnu-attributes/oa-gnu-subsection-directive.s
new file mode 100644
index 00000000000..8b5cc3908bf
--- /dev/null
+++ b/gas/testsuite/gas/gnu-attributes/oa-gnu-subsection-directive.s
@@ -0,0 +1 @@
+ .gnu_subsection gnu_foo_1, optional, ULEB128
diff --git a/gas/testsuite/gas/gnu-attributes/oav2-failures-1.d b/gas/testsuite/gas/gnu-attributes/oav2-failures-1.d
new file mode 100644
index 00000000000..0fede2d24f8
--- /dev/null
+++ b/gas/testsuite/gas/gnu-attributes/oav2-failures-1.d
@@ -0,0 +1,33 @@
+# name: GNU attributes v2: error cases
+# target: [supports_oa_v2]
+# source: oav2-failures-1.s
+# as:
+#error: \A[^\n]+: Assembler messages:
+#error: \n[^\n]+: Error: declaration of an attribute outside the scope of an attribute subsection
+#error: \n[^\n]+: Error: attribute 1 cannot be redefined
+#error: \n[^\n]+: Error: invalid negative value -1, expected an unsigned integer
+#error: \n[^\n]+: Error: could not parse attribute tag
+#error: \n[^\n]+: Error: unknown identifier 'Tag_Unknown'
+#error: \n[^\n]+: Error: could not parse attribute tag
+#error: \n[^\n]+: Error: invalid negative value -1, expected an unsigned integer
+#error: \n[^\n]+: Error: could not parse attribute value
+#error: \n[^\n]+: Error: missing '"', expected a string literal
+#error: \n[^\n]+: Error: could not parse attribute value
+#error: \n[^\n]+: Error: attribute 4 cannot be redefined
+#error: \n[^\n]+: Error: comprehension and encoding of a subsection cannot be omitted on the first declaration
+#error: \n[^\n]+: Error: incompatible redeclaration of subsection vendor_1_subsection_3\. Previous declaration had properties: comprehension=required, encoding=NTBS
+#error: \n[^\n]+: Error: incompatible redeclaration of subsection vendor_1_subsection_3\. Previous declaration had properties: comprehension=required, encoding=NTBS
+#error: \n[^\n]+: Error: incompatible redeclaration of subsection vendor_1_subsection_3\. Previous declaration had properties: comprehension=required, encoding=NTBS
+#error: \n[^\n]+: Error: unknown identifier 'ntbs'
+#error: \n[^\n]+: Error: unknown identifier 'uleb128'
+#error: \n[^\n]+: Error: invalid value '.', expected an identifier
+#error: \n[^\n]+: Error: expected <subsection_name>, <comprehension>, <encoding>
+#error: \n[^\n]+: Error: unknown identifier 'uleb128'
+#error: \n[^\n]+: Error: unknown identifier 'optial'
+#error: \n[^\n]+: Error: unknown identifier 'ul128'
+#error: \n[^\n]+: Error: invalid value 2, expected values for <comprehension> are 0 \(=`required'\) or 1 \(=`optional'\)
+#error: \n[^\n]+: Error: invalid value 2, expected values for <encoding> are 0 \(=`ULEB128'\) or 1 \(=`NTBS'\)
+#error: \n[^\n]+: Error: unexpected comma before parameter 2
+#error: \n[^\n]+: Error: junk at end of line, first unrecognized character is `,'
+#error: \n[^\n]+: Error: unexpected comma before parameter 1
+#error: \n[^\n]+: Error: missing comma after parameter 2\Z
diff --git a/gas/testsuite/gas/gnu-attributes/oav2-failures-1.s b/gas/testsuite/gas/gnu-attributes/oav2-failures-1.s
new file mode 100644
index 00000000000..eeebb76c36e
--- /dev/null
+++ b/gas/testsuite/gas/gnu-attributes/oav2-failures-1.s
@@ -0,0 +1,64 @@
+ .set ATTR_TYPE_uleb128, 0
+ .set ATTR_TYPE_asciz, 1
+
+ /* The definition of an attribute cannot appear before a subsection was
+ declared. */
+ .gnu_attribute 1, 0
+
+ /* gnu_attribute with the same key should have the same value in the
+ same compilation unit. */
+ .gnu_subsection vendor_1_subsection_1, optional, uleb128
+ .gnu_attribute 1, 0
+ .gnu_attribute 1, 1
+
+ /* Only unsigned integer are allowed for attribute keys. */
+ .gnu_attribute -1, 1
+ /* Unknown tag identifier. */
+ .gnu_attribute Tag_Unknown, "plop"
+
+ /* Mismatch between the type expected from the subsection definition,
+ and the type provided to the attribute directive. */
+ .gnu_attribute 2, -1
+ .gnu_attribute 3, "foo"
+ .gnu_subsection vendor_1_subsection_2, optional, ntbs
+ /* Mismatch between type of the value and the one expected by the
+ subsection. */
+ .gnu_attribute 1, 1
+ /* gnu_attribute with the same key should have the same value in the
+ same compilation unit. */
+ .gnu_attribute 4, "ABC"
+ .gnu_attribute 4, "DEF"
+
+ /* The comprehension and encoding cannot be omitted on the first
+ declaration. */
+ .gnu_subsection vendor_1_subsection_3
+
+ /* Subsections with the same name should have the same parameters. */
+ .gnu_subsection vendor_1_subsection_3, required, ntbs
+ .gnu_subsection vendor_1_subsection_3, optional, ntbs
+ .gnu_subsection vendor_1_subsection_3, required, uleb128
+ .gnu_subsection vendor_1_subsection_3, optional, uleb128
+
+ /* Omitted paramaters have to be omitted in the reverse order. */
+ .gnu_subsection vendor_1_subsection_3, ntbs
+ .gnu_subsection vendor_1_subsection_3, uleb128
+
+ /* Invalid subsection name should raise an error. */
+ .gnu_subsection .vendor, optional, uleb128
+
+ /* Swap <optional> and <encoding>. */
+ .gnu_subsection vendor_1_subsection_4, uleb128, optional
+
+ /* Unknown identifier for <optional>, and <encoding>. */
+ .gnu_subsection vendor_1_subsection_4, optial, uleb128
+ .gnu_subsection vendor_1_subsection_4, optional, ul128
+
+ /* Invalid value for optional and format. */
+ .gnu_subsection vendor_1_subsection_4, 2, 1
+ .gnu_subsection vendor_1_subsection_4, 1, 2
+
+ /* Wrong comma. */
+ .gnu_subsection vendor_1_subsection_4, , 1
+ .gnu_subsection vendor_1_subsection_4, 1, 1, 1
+ .gnu_subsection , vendor_1_subsection_4, 1
+ .gnu_subsection vendor_1_subsection_4, 1 1
diff --git a/gas/testsuite/gas/gnu-attributes/oav2-interleaved-subsections.d b/gas/testsuite/gas/gnu-attributes/oav2-interleaved-subsections.d
new file mode 100644
index 00000000000..98411533fcc
--- /dev/null
+++ b/gas/testsuite/gas/gnu-attributes/oav2-interleaved-subsections.d
@@ -0,0 +1,36 @@
+# name: GNU attributes v2: correct context switching between interleaved subsections
+# target: [supports_oa_v2]
+# source: oav2-interleaved-subsections.s
+# as:
+# readelf: -A
+
+Subsections:
+ - Name: foo_1
+ Scope: private
+ Length: 20
+ Comprehension: optional
+ Encoding: ULEB128
+ Values:
+ Tag_unknown_1: 1 \(0x1\)
+ Tag_unknown_2: 0 \(0x0\)
+ Tag_unknown_3: 0 \(0x0\)
+ Tag_unknown_4: 0 \(0x0\)
+
+ - Name: gnu_abi
+ Scope: public
+ Length: 18
+ Comprehension: required
+ Encoding: ULEB128
+ Values:
+ Tag_unknown_1: 1 \(0x1\)
+ Tag_unknown_2: 1 \(0x1\)
+
+ - Name: gnu_feature_and_bits
+ Scope: public
+ Length: 33
+ Comprehension: optional
+ Encoding: ULEB128
+ Values:
+ Tag_unknown_0: 1 \(0x1\)
+ Tag_unknown_1: 0 \(0x0\)
+ Tag_unknown_2: 1 \(0x1\)
diff --git a/gas/testsuite/gas/gnu-attributes/oav2-interleaved-subsections.s b/gas/testsuite/gas/gnu-attributes/oav2-interleaved-subsections.s
new file mode 100644
index 00000000000..196f6e230ed
--- /dev/null
+++ b/gas/testsuite/gas/gnu-attributes/oav2-interleaved-subsections.s
@@ -0,0 +1,32 @@
+ .gnu_subsection gnu_abi, required, uleb128
+
+ .gnu_subsection gnu_feature_and_bits, optional, uleb128
+ .gnu_attribute 0, 1
+
+ .gnu_subsection gnu_feature_and_bits
+
+ .gnu_subsection foo_1, optional, uleb128
+ .gnu_attribute 1, 1
+
+ .gnu_subsection gnu_abi
+ .gnu_attribute 2, 1
+
+ .gnu_subsection gnu_feature_and_bits
+ .gnu_attribute 2, 1
+
+ .gnu_subsection foo_1
+ .gnu_attribute 2, 0
+
+ .gnu_subsection gnu_abi
+ .gnu_attribute 1, 1
+
+ .gnu_subsection gnu_abi
+ .gnu_subsection gnu_feature_and_bits
+ .gnu_attribute 1, 0
+
+ .gnu_subsection foo_1
+ .gnu_attribute 3, 0
+ .gnu_attribute 4, 0
+
+ .gnu_subsection gnu_feature_and_bits
+ .gnu_attribute 1, 0
diff --git a/gas/testsuite/gas/gnu-attributes/oav2-subsection-parsing.d b/gas/testsuite/gas/gnu-attributes/oav2-subsection-parsing.d
new file mode 100644
index 00000000000..e4da1e66da5
--- /dev/null
+++ b/gas/testsuite/gas/gnu-attributes/oav2-subsection-parsing.d
@@ -0,0 +1,76 @@
+# name: GNU attributes v2: parsing of subsections
+# target: [supports_oa_v2]
+# source: oav2-subsection-parsing.s
+# as:
+# readelf: -A
+
+Subsections:
+ - Name: foo_01
+ Scope: private
+ Length: 13
+ Comprehension: required
+ Encoding: ULEB128
+ Values:
+
+ - Name: foo_02
+ Scope: private
+ Length: 13
+ Comprehension: required
+ Encoding: NTBS
+ Values:
+
+ - Name: foo_03
+ Scope: private
+ Length: 13
+ Comprehension: optional
+ Encoding: ULEB128
+ Values:
+
+ - Name: foo_04
+ Scope: private
+ Length: 13
+ Comprehension: optional
+ Encoding: NTBS
+ Values:
+
+ - Name: foo_05
+ Scope: private
+ Length: 13
+ Comprehension: required
+ Encoding: ULEB128
+ Values:
+
+ - Name: foo_06
+ Scope: private
+ Length: 13
+ Comprehension: optional
+ Encoding: ULEB128
+ Values:
+
+ - Name: foo_07
+ Scope: private
+ Length: 13
+ Comprehension: optional
+ Encoding: NTBS
+ Values:
+
+ - Name: foo_08
+ Scope: private
+ Length: 13
+ Comprehension: required
+ Encoding: NTBS
+ Values:
+
+ - Name: foo_09
+ Scope: private
+ Length: 13
+ Comprehension: required
+ Encoding: ULEB128
+ Values:
+
+ - Name: foo_10
+ Scope: private
+ Length: 13
+ Comprehension: optional
+ Encoding: NTBS
+ Values:
diff --git a/gas/testsuite/gas/gnu-attributes/oav2-subsection-parsing.s b/gas/testsuite/gas/gnu-attributes/oav2-subsection-parsing.s
new file mode 100644
index 00000000000..79ad53dcefe
--- /dev/null
+++ b/gas/testsuite/gas/gnu-attributes/oav2-subsection-parsing.s
@@ -0,0 +1,37 @@
+ .set ATTR_TYPE_uleb128, 0
+ .set ATTR_TYPE_asciz, 1
+
+ .set SUBSEC_required, 0
+ .set SUBSEC_optional, 1
+
+ /* Integer literals. */
+ .gnu_subsection foo_01, 0, 0
+ .gnu_subsection foo_02, 0, 1
+ .gnu_subsection foo_03, 1, 0
+ .gnu_subsection foo_04, 1, 1
+
+ /* Known identifiers. */
+ .gnu_subsection foo_05, required, uleb128
+ .gnu_subsection foo_06, optional, ULEB128
+ .gnu_subsection foo_07, optional, ntbs
+ .gnu_subsection foo_08, required, NTBS
+
+ /* Symbol look-up. */
+ .gnu_subsection foo_09, SUBSEC_required, ATTR_TYPE_uleb128
+ .gnu_subsection foo_10, SUBSEC_optional, ATTR_TYPE_asciz
+
+ /* Switch back to the section without specifying the comprehension and
+ encoding. */
+ .gnu_subsection foo_01
+ .gnu_subsection foo_03
+
+ /* Switch back to the section without specifying the encoding. */
+ .gnu_subsection foo_01, required
+ .gnu_subsection foo_03, optional
+
+ /* Switch back to the section while specifying the comprehension and
+ encoding. */
+ .gnu_subsection foo_01, 0, 0
+ .gnu_subsection foo_02, 0, 1
+ .gnu_subsection foo_01, required, uleb128
+ .gnu_subsection foo_02, required, ntbs
diff --git a/gas/testsuite/gas/gnu-attributes/oav2-success-1.d b/gas/testsuite/gas/gnu-attributes/oav2-success-1.d
new file mode 100644
index 00000000000..a0e62e24ad7
--- /dev/null
+++ b/gas/testsuite/gas/gnu-attributes/oav2-success-1.d
@@ -0,0 +1,54 @@
+# name: GNU attributes v2: dump subsections content from attributes vendor section.
+# target: [supports_oa_v2]
+# source: oav2-success-1.s
+# as:
+# readelf: -A
+
+Subsections:
+ - Name: foo_1
+ Scope: private
+ Length: 22
+ Comprehension: optional
+ Encoding: ULEB128
+ Values:
+ Tag_unknown_0: 1 \(0x1\)
+ Tag_unknown_1: 1 \(0x1\)
+ Tag_unknown_2: 1 \(0x1\)
+ Tag_unknown_3: 1 \(0x1\)
+ Tag_unknown_10: 2 \(0x2\)
+
+ - Name: gnu-testing_foo-MERGE-AND
+ Scope: private
+ Length: 38
+ Comprehension: optional
+ Encoding: ULEB128
+ Values:
+ Tag_unknown_0: 0 \(0x0\)
+ Tag_unknown_1: 1 \(0x1\)
+ Tag_unknown_2: 1 \(0x1\)
+
+ - Name: gnu_foo_1
+ Scope: public
+ Length: 20
+ Comprehension: optional
+ Encoding: ULEB128
+ Values:
+ Tag_unknown_2: 65 \(0x41\)
+ Tag_unknown_3: 1 \(0x1\)
+
+ - Name: gnu_foo_2
+ Scope: public
+ Length: 25
+ Comprehension: required
+ Encoding: NTBS
+ Values:
+ Tag_unknown_2: "TEST2"
+ Tag_unknown_4: ""
+
+ - Name: gnu_foo_3
+ Scope: public
+ Length: 22
+ Comprehension: required
+ Encoding: NTBS
+ Values:
+ Tag_unknown_4: "TEST"
diff --git a/gas/testsuite/gas/gnu-attributes/oav2-success-1.s b/gas/testsuite/gas/gnu-attributes/oav2-success-1.s
new file mode 100644
index 00000000000..b9da8cfd3e6
--- /dev/null
+++ b/gas/testsuite/gas/gnu-attributes/oav2-success-1.s
@@ -0,0 +1,32 @@
+ .set ATTR_TYPE_uleb128, 0
+ .set ATTR_TYPE_asciz, 1
+
+ .set SUBSEC_required, 0
+ .set SUBSEC_optional, 1
+
+ .gnu_subsection foo_1, 1, ATTR_TYPE_uleb128
+
+ .set Tag_Feature_foo, 2
+ .set Tag_Feature_bar, 3
+
+ .gnu_attribute Tag_Feature_bar, 1
+ .gnu_attribute 0, 1
+ .gnu_attribute 1, 1
+ .gnu_attribute Tag_Feature_foo, 1
+ .gnu_attribute 0xa, (0xff + ~0xfc) // 255 - 253 = 2
+
+ .gnu_subsection gnu_foo_1, 1, ATTR_TYPE_uleb128
+ .gnu_attribute Tag_Feature_bar, 1
+ .gnu_attribute Tag_Feature_foo, 'A'
+
+ .gnu_subsection gnu_foo_2, 0, ATTR_TYPE_asciz
+ .gnu_attribute 4, ""
+ .gnu_attribute 2, "TEST2"
+
+ .gnu_subsection gnu_foo_3, required, ntbs
+ .gnu_attribute 4, "TEST"
+
+ .gnu_subsection gnu-testing_foo-MERGE-AND, optional, ULEB128
+ .gnu_attribute GNUTestTag_0, 0
+ .gnu_attribute GNUTestTag_1, 1
+ .gnu_attribute 2, 1
--
2.51.0
More information about the Binutils
mailing list