[PATCH] D23655: [ELF] - Fix for PR28976 - Corrupted section contents when using linker scripts

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 19 08:54:36 PDT 2016


This revision was automatically updated to reflect the committed changes.
Closed by commit rL279264: [ELF] - Fix for PR28976 - Corrupted section contents when using linker scripts (authored by grimar).

Changed prior to commit:
  https://reviews.llvm.org/D23655?vs=68515&id=68699#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D23655

Files:
  lld/trunk/ELF/InputSection.cpp
  lld/trunk/ELF/OutputSections.cpp
  lld/trunk/ELF/Relocations.cpp
  lld/trunk/test/ELF/linkerscript/Inputs/linkerscript-merge-sections-reloc.s
  lld/trunk/test/ELF/linkerscript/linkerscript-merge-sections-reloc.s

Index: lld/trunk/test/ELF/linkerscript/linkerscript-merge-sections-reloc.s
===================================================================
--- lld/trunk/test/ELF/linkerscript/linkerscript-merge-sections-reloc.s
+++ lld/trunk/test/ELF/linkerscript/linkerscript-merge-sections-reloc.s
@@ -0,0 +1,16 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/linkerscript-merge-sections-reloc.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t2.o
+# RUN: echo "SECTIONS {}" > %t.script
+# RUN: ld.lld -o %t --script %t.script %t1.o %t2.o
+# RUN: llvm-objdump -s %t | FileCheck %s
+
+## Check that sections content is not corrupted.
+# CHECK:      Contents of section .text:
+# CHECK-NEXT:  44332211 00000000 44332211 00000000
+# CHECK-NEXT:  f0ffffff ffffffff
+
+.globl _start
+_foo:
+ .quad 0x11223344
+ .quad _start - .
Index: lld/trunk/test/ELF/linkerscript/Inputs/linkerscript-merge-sections-reloc.s
===================================================================
--- lld/trunk/test/ELF/linkerscript/Inputs/linkerscript-merge-sections-reloc.s
+++ lld/trunk/test/ELF/linkerscript/Inputs/linkerscript-merge-sections-reloc.s
@@ -0,0 +1,3 @@
+.globl _start
+_start:
+ .quad 0x11223344
Index: lld/trunk/ELF/InputSection.cpp
===================================================================
--- lld/trunk/ELF/InputSection.cpp
+++ lld/trunk/ELF/InputSection.cpp
@@ -351,7 +351,7 @@
 
   const unsigned Bits = sizeof(uintX_t) * 8;
   for (const Relocation<ELFT> &Rel : Relocations) {
-    uintX_t Offset = Rel.Offset;
+    uintX_t Offset = getOffset(Rel.Offset);
     uint8_t *BufLoc = Buf + Offset;
     uint32_t Type = Rel.Type;
     uintX_t A = Rel.Addend;
Index: lld/trunk/ELF/Relocations.cpp
===================================================================
--- lld/trunk/ELF/Relocations.cpp
+++ lld/trunk/ELF/Relocations.cpp
@@ -566,7 +566,7 @@
         continue;
       Offset = PieceI->OutputOff + RI.r_offset - PieceI->InputOff;
     } else {
-      Offset = C.getOffset(RI.r_offset);
+      Offset = RI.r_offset;
     }
 
     // This relocation does not require got entry, but it is relative to got and
Index: lld/trunk/ELF/OutputSections.cpp
===================================================================
--- lld/trunk/ELF/OutputSections.cpp
+++ lld/trunk/ELF/OutputSections.cpp
@@ -1274,7 +1274,7 @@
 typename ELFT::uint DynamicReloc<ELFT>::getOffset() const {
   if (OutputSec)
     return OutputSec->getVA() + OffsetInSec;
-  return InputSec->OutSec->getVA() + OffsetInSec;
+  return InputSec->OutSec->getVA() + InputSec->getOffset(OffsetInSec);
 }
 
 template <class ELFT>


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D23655.68699.patch
Type: text/x-patch
Size: 2657 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160819/7e8767cd/attachment.bin>


More information about the llvm-commits mailing list