forked from OSchip/llvm-project
[ELF] - Fixed handling relocations against zero sized .eh_frame section.
The file crtbeginT.o has relocations pointing to the start of an empty .eh_frame that is known to be the first in the link. It does that to identify the start of the output .eh_frame. Handle this special case. Differential revision: http://reviews.llvm.org/D15610 llvm-svn: 256414
This commit is contained in:
parent
11234ed7d3
commit
6ab275c0c8
|
@ -268,6 +268,11 @@ bool EHInputSection<ELFT>::classof(const InputSectionBase<ELFT> *S) {
|
|||
template <class ELFT>
|
||||
typename EHInputSection<ELFT>::uintX_t
|
||||
EHInputSection<ELFT>::getOffset(uintX_t Offset) {
|
||||
// The file crtbeginT.o has relocations pointing to the start of an empty
|
||||
// .eh_frame that is known to be the first in the link. It does that to
|
||||
// identify the start of the output .eh_frame. Handle this special case.
|
||||
if (this->getSectionHdr()->sh_size == 0)
|
||||
return Offset;
|
||||
std::pair<uintX_t, uintX_t> *I = this->getRangeAndSize(Offset).first;
|
||||
uintX_t Base = I->second;
|
||||
if (Base == uintX_t(-1))
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
// REQUIRES: x86
|
||||
// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
|
||||
// RUN: ld.lld %t.o -o %t
|
||||
// RUN: llvm-readobj -s %t | FileCheck %s
|
||||
// RUN: llvm-objdump -d %t | FileCheck --check-prefix=DISASM %s
|
||||
|
||||
// CHECK: Name: .eh_frame
|
||||
// CHECK-NEXT: Type: SHT_X86_64_UNWIND
|
||||
// CHECK-NEXT: Flags [
|
||||
// CHECK-NEXT: SHF_ALLOC
|
||||
// CHECK-NEXT: ]
|
||||
// CHECK-NEXT: Address: 0x10120
|
||||
// CHECK-NEXT: Offset:
|
||||
// CHECK-NEXT: Size: 0
|
||||
|
||||
// 0x10120 = 65824
|
||||
// 0x10120 + 5 = 65829
|
||||
// DISASM: Disassembly of section .text:
|
||||
// DISASM-NEXT: _start:
|
||||
// DISASM-NEXT: 11000: {{.*}} movq 65824, %rax
|
||||
// DISASM-NEXT: 11008: {{.*}} movq 65829, %rax
|
||||
|
||||
.section .eh_frame,"ax",@unwind
|
||||
|
||||
.section .text
|
||||
.globl _start
|
||||
_start:
|
||||
movq .eh_frame, %rax
|
||||
movq .eh_frame + 5, %rax
|
Loading…
Reference in New Issue