]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
x86-64: Remove sframe relocs against discarded sections
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 15 Jul 2025 02:41:25 +0000 (10:41 +0800)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 16 Jul 2025 05:23:30 +0000 (22:23 -0700)
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>
bfd/elf64-x86-64.c
ld/testsuite/ld-elf/eh-group.exp

index c40a0c5488a00b75dec5829f63be11a1e5421b1b..ebd2eb4299fec975f11f84cf4fdcc9f63fbfcc0d 100644 (file)
@@ -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;
index 1656c2ee65112106b7357a312a314f7355df15c6..c1571414e0c6d4b6a70a08e02b63a727ddc0b1fb 100644 (file)
@@ -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"]  \
 ]