[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