Index: ELF/LinkerScript.cpp =================================================================== --- ELF/LinkerScript.cpp +++ ELF/LinkerScript.cpp @@ -550,6 +550,7 @@ } void LinkerScript::output(InputSection *S) { + uint64_t Before = advance(0, 1); uint64_t Pos = advance(S->getSize(), S->Alignment); S->OutSecOff = Pos - S->getSize() - CurAddressState->OutSec->Addr; @@ -563,7 +564,7 @@ if (CurAddressState->MemRegion) { uint64_t &CurOffset = CurAddressState->MemRegionOffset[CurAddressState->MemRegion]; - CurOffset += CurAddressState->OutSec->Size; + CurOffset += Pos - Before; uint64_t CurSize = CurOffset - CurAddressState->MemRegion->Origin; if (CurSize > CurAddressState->MemRegion->Length) { uint64_t OverflowAmt = CurSize - CurAddressState->MemRegion->Length; Index: test/ELF/linkerscript/memory2.s =================================================================== --- test/ELF/linkerscript/memory2.s +++ test/ELF/linkerscript/memory2.s @@ -0,0 +1,14 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t +# RUN: echo "MEMORY { ram (rwx) : ORIGIN = 0, LENGTH = 2K } \ +# RUN: SECTIONS { .text : { *(.text*) } > ram }" > %t.script +# RUN: ld.lld -o %t2 --script %t.script %t + +.text +.global _start +_start: + .zero 1024 + +.section .text.foo,"ax",%progbits +foo: + nop