[binutils-gdb] gas: sframe: Error on open CFI at EOF; missing .cfi_endproc
Jens Remus via Binutils-cvs <[email protected]>
| Newsgroups | gmane.comp.gnu.binutils.cvs |
|---|---|
| Message-ID | <[email protected]> |
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=bc145a24033381e93bae0ee24add664386c66433 commit bc145a24033381e93bae0ee24add664386c66433 Author: Jens Remus <[email protected]> Date: Thu Apr 30 12:18:05 2026 +0200 gas: sframe: Error on open CFI at EOF; missing .cfi_endproc Open CFI at end of file (i.e. .cfi_startproc without matching .cfi_endproc) caused generation of SFrame strack trace information to segfault. Handle an open DWARF FDE in .sframe generation like it is handled in .eh_frame and .debug_frame generation (see cfi_finish() in gas/dw2gencfi.c). Report the following error and set the DWARF FDE end address to its start address: open CFI at the end of file; missing .cfi_endproc directive gas/ PR/gas 34026 * gen-sframe.c (create_sframe_all): Error on open CFI. gas/testsuite/ PR/gas 34026 * gas/cfi-sframe/cfi-sframe.exp: Run new test. * gas/cfi-sframe/cfi-sframe-common-pr34026.d: New test. * gas/cfi-sframe/cfi-sframe-common-pr34026.s: Likewise. Signed-off-by: Jens Remus <[email protected]> Diff: --- gas/gen-sframe.c | 8 ++++++++ gas/testsuite/gas/cfi-sframe/cfi-sframe-common-pr34026.d | 3 +++ gas/testsuite/gas/cfi-sframe/cfi-sframe-common-pr34026.s | 1 + gas/testsuite/gas/cfi-sframe/cfi-sframe.exp | 1 + 4 files changed, 13 insertions(+) diff --git a/gas/gen-sframe.c b/gas/gen-sframe.c index 7c1b7be93bb..b5c8f649bea 100644 --- a/gas/gen-sframe.c +++ b/gas/gen-sframe.c @@ -2478,6 +2478,14 @@ create_sframe_all (void) /* Initialize the translation context with information anew. */ sframe_xlate_ctx_init (xlate_ctx); + /* Report and fix open CFI. */ + if (dw_fde->end_address == NULL) + { + as_bad (_("open CFI at the end of file; " + "missing .cfi_endproc directive")); + dw_fde->end_address = dw_fde->start_address; + } + /* Process and link SFrame FDEs if no error. */ int err = sframe_do_fde (xlate_ctx, dw_fde); if (err && get_dw_fde_signal_p (dw_fde)) diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-pr34026.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-pr34026.d new file mode 100644 index 00000000000..a944e074404 --- /dev/null +++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-pr34026.d @@ -0,0 +1,3 @@ +#as: --gsframe +#error: open CFI at the end of file; missing \.cfi_endproc directive +#name: Open CFI at end of file (PR 34026) diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-pr34026.s b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-pr34026.s new file mode 100644 index 00000000000..df692dbcd98 --- /dev/null +++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-pr34026.s @@ -0,0 +1 @@ + .cfi_startproc diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe.exp b/gas/testsuite/gas/cfi-sframe/cfi-sframe.exp index a73e5c84033..ba6cbc13f72 100644 --- a/gas/testsuite/gas/cfi-sframe/cfi-sframe.exp +++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe.exp @@ -55,6 +55,7 @@ if { ([istarget "x86_64-*-*"] || [istarget "aarch64*-*-*"] run_dump_test "common-empty-3" run_dump_test "cfi-sframe-common-pr33810" + run_dump_test "cfi-sframe-common-pr34026" } # x86-64 specific tests