[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