[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:
George Rimar 2015-12-25 09:51:42 +00:00
parent 11234ed7d3
commit 6ab275c0c8
2 changed files with 34 additions and 0 deletions

View File

@ -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))

View File

@ -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