[lld] r256414 - [ELF] - Fixed handling relocations against zero sized .eh_frame section.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 25 01:51:43 PST 2015


Author: grimar
Date: Fri Dec 25 03:51:42 2015
New Revision: 256414

URL: http://llvm.org/viewvc/llvm-project?rev=256414&view=rev
Log:
[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

Added:
    lld/trunk/test/ELF/ehframe-relocation.s
Modified:
    lld/trunk/ELF/InputSection.cpp

Modified: lld/trunk/ELF/InputSection.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.cpp?rev=256414&r1=256413&r2=256414&view=diff
==============================================================================
--- lld/trunk/ELF/InputSection.cpp (original)
+++ lld/trunk/ELF/InputSection.cpp Fri Dec 25 03:51:42 2015
@@ -268,6 +268,11 @@ bool EHInputSection<ELFT>::classof(const
 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))

Added: lld/trunk/test/ELF/ehframe-relocation.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/ehframe-relocation.s?rev=256414&view=auto
==============================================================================
--- lld/trunk/test/ELF/ehframe-relocation.s (added)
+++ lld/trunk/test/ELF/ehframe-relocation.s Fri Dec 25 03:51:42 2015
@@ -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", at unwind
+
+.section .text
+.globl _start
+_start:
+ movq .eh_frame, %rax
+ movq .eh_frame + 5, %rax




More information about the llvm-commits mailing list