[RFC, V3 3/5] ld: aarch64: make EH Frame parsing aware of augmentation char 'G'
Richard Earnshaw (lists)
Richard.Earnshaw@arm.com
Wed Jul 9 09:22:11 GMT 2025
On 05/06/2025 00:25, Indu Bhagat via Binutils wrote:
> 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;
Similarly to the change required for binutils/dwarf.c this should really check that the bfd is an aarch64 flavour (case 'B' above should also be fixed). I think in this case, it's possible to do that as a run-time check, taking the same path as the default case if not aarch64.
> 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]+
> +#...
R.
More information about the Binutils
mailing list