[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