From 5f9bf0cf711a153a0a20d6ff88181e9a6775bdba Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sun, 13 Jul 2025 04:56:16 +0800 Subject: [PATCH] sframe: Allow input R_*_NONE relocations "ld -r" generates R_*_NONE relocations in sframe section if input relocations in sframe section are against discarded section. Allow input R_*_NONE relocations if there are more relocation entries than SFrame entries, instead of assuming number of SFrame entries == number of relocation entries. bfd/ PR ld/33127 * elf-sframe.c (sframe_decoder_init_func_bfdinfo): Allow input R_*_NONE relocations if there are more relocation entries than SFrame entries. ld/ PR ld/33127 * testsuite/ld-x86-64/sframe-reloc-2a.s: New file. * testsuite/ld-x86-64/sframe-reloc-2b.s: Likewise. * testsuite/ld-x86-64/x86-64.exp: Run PR ld/33127 tests. Signed-off-by: H.J. Lu --- bfd/elf-sframe.c | 9 ++++++- ld/testsuite/ld-x86-64/sframe-reloc-2a.s | 7 ++++++ ld/testsuite/ld-x86-64/sframe-reloc-2b.s | 31 ++++++++++++++++++++++++ ld/testsuite/ld-x86-64/x86-64.exp | 21 ++++++++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 ld/testsuite/ld-x86-64/sframe-reloc-2a.s create mode 100644 ld/testsuite/ld-x86-64/sframe-reloc-2b.s diff --git a/bfd/elf-sframe.c b/bfd/elf-sframe.c index b709e590a2d..2cb732c3016 100644 --- a/bfd/elf-sframe.c +++ b/bfd/elf-sframe.c @@ -120,7 +120,6 @@ sframe_decoder_init_func_bfdinfo (bfd *abfd, if ((sec->flags & SEC_LINKER_CREATED) && cookie->rels == NULL) return true; - BFD_ASSERT (cookie->rels + fde_count == cookie->relend); rel = cookie->rels; for (i = 0; i < fde_count; i++) { @@ -132,6 +131,14 @@ sframe_decoder_init_func_bfdinfo (bfd *abfd, rel++; } + /* If there are more relocation entries, they must be R_*_NONE which + may be generated from relocations against discarded sections by + ld -r. */ + for (; rel < cookie->relend; rel++) + if (rel->r_info != 0) + break; + BFD_ASSERT (rel == cookie->relend); + return true; } diff --git a/ld/testsuite/ld-x86-64/sframe-reloc-2a.s b/ld/testsuite/ld-x86-64/sframe-reloc-2a.s new file mode 100644 index 00000000000..8cd8694123e --- /dev/null +++ b/ld/testsuite/ld-x86-64/sframe-reloc-2a.s @@ -0,0 +1,7 @@ + .section sect, "axG", @progbits, sectgroup, comdat + .global _start +_start: + .cfi_startproc + call foo + .cfi_endproc + .section .note.GNU-stack,"",@progbits diff --git a/ld/testsuite/ld-x86-64/sframe-reloc-2b.s b/ld/testsuite/ld-x86-64/sframe-reloc-2b.s new file mode 100644 index 00000000000..9484636144d --- /dev/null +++ b/ld/testsuite/ld-x86-64/sframe-reloc-2b.s @@ -0,0 +1,31 @@ + .section sect, "axG", @progbits, sectgroup, comdat + .cfi_startproc +# Test intention is that LSDA must be provided by the discarded FDE. +# DW_EH_PE_udata8 = 4 +# DW_EH_PE_udata4 = 3 + .ifdef ELF64 + .cfi_lsda 4, lsda + .else + .cfi_lsda 3, lsda + .endif + .skip 16 + .cfi_endproc + + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + popq %rbp + .cfi_def_cfa 7, 8 + ret + .cfi_endproc + + .section .gcc_except_table, "a", @progbits +lsda: + .section .note.GNU-stack,"",@progbits diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index a682b1374fa..3d873a79b78 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -572,6 +572,27 @@ if { ![skip_sframe_tests] } { run_dump_test "sframe-ibt-plt-1" run_dump_test "sframe-pltgot-1" run_dump_test "sframe-pltgot-2" + + run_ld_link_tests [list \ + [list \ + "Build sframe-reloc-2.o" \ + "-m elf_x86_64 -r" \ + "" \ + "--64 --gsframe" \ + {sframe-reloc-2a.s sframe-reloc-2b.s} \ + "" \ + "sframe-reloc-2.o" \ + ] \ + [list \ + "Build sframe-reloc-2" \ + "-m elf_x86_64 tmpdir/sframe-reloc-2.o" \ + "" \ + "--64 --gsframe" \ + {dummy.s} \ + "" \ + "sframe-reloc-2" \ + ] \ + ] } if ![istarget "x86_64-*-linux*"] { -- 2.47.2