[RFC, V3 3/5] ld: aarch64: make EH Frame parsing aware of augmentation char 'G'

Indu Bhagat indu.bhagat@oracle.com
Wed Jun 4 23:25:53 GMT 2025


As per the DWARF for the Arm 64-bit Architecture (AArch64)
specification, the augmentation char 'G' indicates that associated
frames may modify MTE tags on the stack space they use.

Add knowledge of the 'G' augmentation char to the EH Frame parsing code.

ChangeLog:

        * bfd/elf-eh-frame.c (_bfd_elf_parse_eh_frame): Accommodate
	augmentation char 'G'.
        * ld/testsuite/ld-aarch64/aarch64-elf.exp: New test.
        * ld/testsuite/ld-aarch64/mte-tagged-frame-bar.s: New test.
        * ld/testsuite/ld-aarch64/mte-tagged-frame-foo.s: New test.
        * ld/testsuite/ld-aarch64/mte-tagged-frame.d: New test.
---
[Changes in V3]
  - The newly added test mte-tagged-frame.d showed failure on
    aarch64-nto, due to a different placement of functions.  Adapt the
    test to only check for presence of two CIEs (with one FDE each) - one
    CIE with 'G' and another without 'G'.  Checking the involved PCs is
    not strictly meaningful to the test.
[End of changes in V3]
---
 bfd/elf-eh-frame.c                            |  2 ++
 ld/testsuite/ld-aarch64/aarch64-elf.exp       |  2 ++
 .../ld-aarch64/mte-tagged-frame-bar.s         | 17 +++++++++
 .../ld-aarch64/mte-tagged-frame-foo.s         | 16 +++++++++
 ld/testsuite/ld-aarch64/mte-tagged-frame.d    | 35 +++++++++++++++++++
 5 files changed, 72 insertions(+)
 create mode 100644 ld/testsuite/ld-aarch64/mte-tagged-frame-bar.s
 create mode 100644 ld/testsuite/ld-aarch64/mte-tagged-frame-foo.s
 create mode 100644 ld/testsuite/ld-aarch64/mte-tagged-frame.d

diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c
index 0250a8f8d11..ac05448b4aa 100644
--- a/bfd/elf-eh-frame.c
+++ b/bfd/elf-eh-frame.c
@@ -843,6 +843,8 @@ _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
 		      REQUIRE (skip_bytes (&buf, end, per_width));
 		    }
 		    break;
+		  case 'G':
+		    break;
 		  default:
 		    /* Unrecognized augmentation. Better bail out.  */
 		    goto free_no_table;
diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp
index 4de498fc381..2d444e7d1e2 100644
--- a/ld/testsuite/ld-aarch64/aarch64-elf.exp
+++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp
@@ -376,6 +376,8 @@ run_dump_test_lp64 "variant_pcs-r"
 run_dump_test_lp64 "variant_pcs-shared"
 run_dump_test_lp64 "variant_pcs-now"
 
+run_dump_test_lp64 "mte-tagged-frame"
+
 set aarch64elflinktests {
   {"ld-aarch64/so with global symbol" "-shared" "" "" {copy-reloc-so.s}
     {} "copy-reloc-so.so"}
diff --git a/ld/testsuite/ld-aarch64/mte-tagged-frame-bar.s b/ld/testsuite/ld-aarch64/mte-tagged-frame-bar.s
new file mode 100644
index 00000000000..0bd56191912
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/mte-tagged-frame-bar.s
@@ -0,0 +1,17 @@
+	.text
+	.global bar
+	.type bar, %function
+bar:
+	.cfi_startproc
+	.cfi_mte_tagged_frame
+        stp     x19, x20, [sp, -144]!
+        .cfi_def_cfa_offset 144
+        .cfi_offset 19, -144
+        .cfi_offset 20, -136
+        ldp     x19, x20, [sp], 144
+        .cfi_restore 20
+        .cfi_restore 19
+        .cfi_def_cfa_offset 0
+        ret
+	.cfi_endproc
+	.size bar, .-bar
diff --git a/ld/testsuite/ld-aarch64/mte-tagged-frame-foo.s b/ld/testsuite/ld-aarch64/mte-tagged-frame-foo.s
new file mode 100644
index 00000000000..af5a8c42f95
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/mte-tagged-frame-foo.s
@@ -0,0 +1,16 @@
+	.text
+	.global foo
+	.type foo, %function
+foo:
+	.cfi_startproc
+        stp     x19, x20, [sp, -32]!
+        .cfi_def_cfa_offset 32
+        .cfi_offset 19, -32
+        .cfi_offset 20, -16
+        ldp     x19, x20, [sp], 32
+        .cfi_restore 20
+        .cfi_restore 19
+        .cfi_def_cfa_offset 0
+        ret
+	.cfi_endproc
+	.size foo, .-foo
diff --git a/ld/testsuite/ld-aarch64/mte-tagged-frame.d b/ld/testsuite/ld-aarch64/mte-tagged-frame.d
new file mode 100644
index 00000000000..dd667fe5ca7
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/mte-tagged-frame.d
@@ -0,0 +1,35 @@
+#source: mte-tagged-frame-foo.s
+#source: mte-tagged-frame-bar.s
+#ld: -shared
+#objdump: -Wf
+#name: MTE tagged EH Frame FDE
+
+#...
+Contents of the .eh_frame section:
+
+00000000 0000000000000010 00000000 CIE
+  Version:               1
+  Augmentation:          "zR"
+  Code alignment factor: 4
+  Data alignment factor: -8
+  Return address column: 30
+  Augmentation data:     1b
+  DW_CFA_def_cfa: r31 \(sp\) ofs 0
+
+00000014 0000000000000020 00000018 FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
+#...
+
+00000038 0000000000000014 00000000 CIE
+  Version:               1
+  Augmentation:          "zRG"
+  Code alignment factor: 4
+  Data alignment factor: -8
+  Return address column: 30
+  Augmentation data:     1b
+  DW_CFA_def_cfa: r31 \(sp\) ofs 0
+  DW_CFA_nop
+  DW_CFA_nop
+  DW_CFA_nop
+
+00000050 000000000000001c 0000001c FDE cie=00000038 pc=[a-f0-9]+\.\.[a-f0-9]+
+#...
-- 
2.43.0



More information about the Binutils mailing list