[PATCH] D15610: [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:55:14 PST 2015


This revision was automatically updated to reflect the committed changes.
Closed by commit rL256414: [ELF] - Fixed handling relocations against zero sized .eh_frame section. (authored by grimar).

Changed prior to commit:
  http://reviews.llvm.org/D15610?vs=43136&id=43623#toc

Repository:
  rL LLVM

http://reviews.llvm.org/D15610

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

Index: lld/trunk/test/ELF/ehframe-relocation.s
===================================================================
--- lld/trunk/test/ELF/ehframe-relocation.s
+++ lld/trunk/test/ELF/ehframe-relocation.s
@@ -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
Index: lld/trunk/ELF/InputSection.cpp
===================================================================
--- lld/trunk/ELF/InputSection.cpp
+++ lld/trunk/ELF/InputSection.cpp
@@ -268,6 +268,11 @@
 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))


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D15610.43623.patch
Type: text/x-patch
Size: 1744 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151225/384d1824/attachment.bin>


More information about the llvm-commits mailing list