[PATCH] x86-64: Remove sframe relocs against discarded sections
Sam James
sam@gentoo.org
Tue Jul 15 05:51:43 GMT 2025
From: "H.J. Lu" <hjl.tools@gmail.com>
Since unlike eh_frame editing code, sframe editing code keeps
R_X86_64_NONE reloc as is, its r_offset is wrong, we must not
generate R_X86_64_NONE reloc in sframe section against discarded
sections for "ld -r".
bfd/
PR ld/33156
* elf64-x86-64.c (elf_x86_64_relocate_section): Also remove
sframe relocations against discarded sections for "ld -r".
ld/
PR ld/33156
* testsuite/ld-elf/eh-group.exp (as_gsframe): New.
Assemble eh-group.o with $as_gsframe.
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
---
Sent on H.J.'s behalf. OK?
bfd/elf64-x86-64.c | 10 +++++++---
ld/testsuite/ld-elf/eh-group.exp | 7 ++++++-
2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index c40a0c5488a..ebd2eb4299f 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -3268,10 +3268,14 @@ elf_x86_64_relocate_section (bfd *output_bfd,
wrel->r_addend = 0;
/* For ld -r, remove relocations in debug sections against
- sections defined in discarded sections. Not done for
- eh_frame editing code expects to be present. */
+ sections defined in discarded sections, including sframe
+ sections. Not done for eh_frame editing code expects to
+ be present. NB: Since sframe code keeps R_X86_64_NONE
+ reloc as is, its r_offset is wrong, we must not generate
+ R_X86_64_NONE reloc in sframe section. */
if (bfd_link_relocatable (info)
- && (input_section->flags & SEC_DEBUGGING))
+ && ((input_section->flags & SEC_DEBUGGING) != 0
+ || elf_section_type (input_section) == SHT_GNU_SFRAME))
wrel--;
continue;
diff --git a/ld/testsuite/ld-elf/eh-group.exp b/ld/testsuite/ld-elf/eh-group.exp
index 1656c2ee651..c1571414e0c 100644
--- a/ld/testsuite/ld-elf/eh-group.exp
+++ b/ld/testsuite/ld-elf/eh-group.exp
@@ -40,6 +40,11 @@ if ![is_elf_format] {
return
}
+set as_gsframe ""
+if { [gas_sframe_check] } {
+ set as_gsframe "--gsframe"
+}
+
# alpha-linux-gnu does not support 64-bit relocations:
# relocation truncated to fit: REFLONG against `.gcc_except_table'
# arm-eabi does not support 64-bit relocations:
@@ -58,7 +63,7 @@ if [is_elf64 "tmpdir/eh-group1size.o"] {
set build_tests_ld [list \
[list "Build eh-group1.o" \
- "-r" "" "$as_options" \
+ "-r" "" "$as_options $as_gsframe" \
{eh-group1.s eh-group2.s} {} "eh-group.o"] \
]
--
2.50.1
More information about the Binutils
mailing list