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

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 18 05:26:40 PDT 2016


grimar created this revision.
grimar added reviewers: ruiu, rafael.
grimar added subscribers: llvm-commits, davide, grimar, silvas, evgeny777, Wallbraker.

This is alternative solution to fix PR28976.

Problem is that in scanRelocs, we computed relocation offset too early for case when linkerscript was used.
Patch fixes the issue delaying the calculation.

Testcase is provided.

https://reviews.llvm.org/D23655

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

Index: test/ELF/linkerscript/linkerscript-merge-sections-reloc.s
===================================================================
--- test/ELF/linkerscript/linkerscript-merge-sections-reloc.s
+++ 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: test/ELF/linkerscript/Inputs/linkerscript-merge-sections-reloc.s
===================================================================
--- test/ELF/linkerscript/Inputs/linkerscript-merge-sections-reloc.s
+++ test/ELF/linkerscript/Inputs/linkerscript-merge-sections-reloc.s
@@ -0,0 +1,3 @@
+.globl _start
+_start:
+ .quad 0x11223344
Index: ELF/Relocations.cpp
===================================================================
--- ELF/Relocations.cpp
+++ ELF/Relocations.cpp
@@ -558,7 +558,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: ELF/OutputSections.cpp
===================================================================
--- ELF/OutputSections.cpp
+++ ELF/OutputSections.cpp
@@ -1271,7 +1271,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>
Index: ELF/InputSection.cpp
===================================================================
--- ELF/InputSection.cpp
+++ 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;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D23655.68515.patch
Type: text/x-patch
Size: 2507 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160818/a12c1e83/attachment.bin>


More information about the llvm-commits mailing list