llvm-project/lld/test/ELF/eh-frame-nonzero-offset-x86.s
simpal01 3cde1d8000
[ELF] Handle relocations in synthetic .eh_frame with a non-zero offset within the output section (#65966)
When the .eh_frame section is placed at a non-zero
offset within its output section, the relocation
value within .eh_frame are computed incorrectly.

We had similar issue in .ARM.exidx section and it has been
fixed already in https://reviews.llvm.org/D148033.

While applying the relocation using S+A-P,  the value
 of P (the location of the relocation) is getting wrong. 
P is:
  P = SecAddr + rel.offset, But SecAddr points to the
starting address of the outputsection rather than the
starting address of the eh frame section within that
output section.

This issue affects all targets which generates .eh_frame 
section. Hence fixing in all the corresponding targets it affecting.
2023-10-03 10:20:14 +01:00

56 lines
1.6 KiB
ArmAsm

// REQUIRES: x86
// RUN: rm -rf %t && split-file %s %t && cd %t
// RUN: llvm-mc -filetype=obj -triple=x86_64 a.s -o a.o
// RUN: ld.lld a.o -T eh-frame-non-zero-offset.t -o non-zero
// RUN: llvm-readelf --program-headers --unwind --symbols -x .eh_frame non-zero | FileCheck --check-prefix=NONZERO %s
// RUN: ld.lld a.o -T eh-frame-zero-offset.t -o zero
// RUN: llvm-readelf --program-headers --unwind --symbols -x .eh_frame zero | FileCheck --check-prefix=ZERO %s
// NONZERO: {{[0-9]+}}: 0000000000000088 {{.*}} __eh_frame_start
// NONZERO-NEXT: {{[0-9]+}}: 00000000000000bc {{.*}} __eh_frame_end
// NONZERO: 0x00000088 14000000 00000000 017a5200 01781001
// NONZERO-NEXT: 0x00000098 1b0c0708 90010000 14000000 1c000000
// NONZERO-NEXT: 0x000000a8 58ffffff 04000000 00000000 00000000
// NONZERO-NEXT: 0x000000b8 00000000
// ZERO: {{[0-9]+}}: 0000000000000008 {{.*}} __eh_frame_start
// ZERO-NEXT: {{[0-9]+}}: 000000000000003c {{.*}} __eh_frame_end
// ZERO: 0x00000008 14000000 00000000 017a5200 01781001
// ZERO-NEXT: 0x00000018 1b0c0708 90010000 14000000 1c000000
// ZERO-NEXT: 0x00000028 d8ffffff 04000000 00000000 00000000
// ZERO-NEXT: 0x00000038 00000000
//--- eh-frame-non-zero-offset.t
SECTIONS {
.text : { *(.text .text.*) }
.eh_frame : {
/* Padding within .eh_frame */
. += 128;
__eh_frame_start = .;
*(.eh_frame) ;
__eh_frame_end = .;
}
}
//--- eh-frame-zero-offset.t
SECTIONS {
.text : { *(.text .text.*) }
.eh_frame : {
__eh_frame_start = .;
*(.eh_frame) ;
__eh_frame_end = .;
}
}
//--- a.s
.section .text.01, "ax",%progbits
.global f1
.type f1, %function
f1:
.cfi_startproc
.space 4
.cfi_endproc