Index: ELF/InputSection.cpp =================================================================== --- ELF/InputSection.cpp +++ ELF/InputSection.cpp @@ -351,7 +351,7 @@ const unsigned Bits = sizeof(uintX_t) * 8; for (const Relocation &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: ELF/OutputSections.cpp =================================================================== --- ELF/OutputSections.cpp +++ ELF/OutputSections.cpp @@ -1271,7 +1271,7 @@ typename ELFT::uint DynamicReloc::getOffset() const { if (OutputSec) return OutputSec->getVA() + OffsetInSec; - return InputSec->OutSec->getVA() + OffsetInSec; + return InputSec->OutSec->getVA() + InputSec->getOffset(OffsetInSec); } template 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: 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: 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 - .