mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-25 08:47:28 +00:00
x86-64: Remove sframe relocs against discarded sections
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>
This commit is contained in:
@@ -3268,10 +3268,14 @@ elf_x86_64_relocate_section (bfd *output_bfd,
|
|||||||
wrel->r_addend = 0;
|
wrel->r_addend = 0;
|
||||||
|
|
||||||
/* For ld -r, remove relocations in debug sections against
|
/* For ld -r, remove relocations in debug sections against
|
||||||
sections defined in discarded sections. Not done for
|
sections defined in discarded sections, including sframe
|
||||||
eh_frame editing code expects to be present. */
|
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)
|
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--;
|
wrel--;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -40,6 +40,11 @@ if ![is_elf_format] {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set as_gsframe ""
|
||||||
|
if { [gas_sframe_check] } {
|
||||||
|
set as_gsframe "--gsframe"
|
||||||
|
}
|
||||||
|
|
||||||
# alpha-linux-gnu does not support 64-bit relocations:
|
# alpha-linux-gnu does not support 64-bit relocations:
|
||||||
# relocation truncated to fit: REFLONG against `.gcc_except_table'
|
# relocation truncated to fit: REFLONG against `.gcc_except_table'
|
||||||
# arm-eabi does not support 64-bit relocations:
|
# arm-eabi does not support 64-bit relocations:
|
||||||
@@ -58,7 +63,7 @@ if [is_elf64 "tmpdir/eh-group1size.o"] {
|
|||||||
|
|
||||||
set build_tests_ld [list \
|
set build_tests_ld [list \
|
||||||
[list "Build eh-group1.o" \
|
[list "Build eh-group1.o" \
|
||||||
"-r" "" "$as_options" \
|
"-r" "" "$as_options $as_gsframe" \
|
||||||
{eh-group1.s eh-group2.s} {} "eh-group.o"] \
|
{eh-group1.s eh-group2.s} {} "eh-group.o"] \
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user