Index: lld/ELF/LinkerScript.cpp =================================================================== --- lld/ELF/LinkerScript.cpp +++ lld/ELF/LinkerScript.cpp @@ -772,6 +772,15 @@ if ((sec->flags & SHF_ALLOC) && sec->addrExpr) setDot(sec->addrExpr, sec->location, false); + // If the address of the section has been moved forward by an explicit + // expression so that it now starts past the current curPos of the enclosing + // region, we need to expand the current region to account for the space + // between the previous section, if any, and the start of this section. + if (ctx->memRegion && ctx->memRegion->curPos < dot) { + expandMemoryRegion(ctx->memRegion, dot - ctx->memRegion->curPos, + ctx->memRegion->name, sec->name); + } + switchTo(sec); if (sec->lmaExpr) Index: lld/test/ELF/linkerscript/section-gap-explicit-expr.test =================================================================== --- /dev/null +++ lld/test/ELF/linkerscript/section-gap-explicit-expr.test @@ -0,0 +1,25 @@ +# REQUIRES: x86 + +# RUN: echo ".section .aaa, \"a\"; .quad 0; .section .bbb, \"a\"; .quad 0;" \ +# RUN: | llvm-mc -filetype=obj -triple=x86_64-pc-linux - -o %t +# RUN: ld.lld %t --script %s -o %t2 + +# RUN: llvm-objdump -section-headers %t2 | FileCheck %s +# CHECK: .aaa_s 00000008 0000000000000000 DATA +# CHECK: .bbb_s 00000008 0000000000000014 DATA + +MEMORY { + REGION (rwx) : ORIGIN = 0x0000, LENGTH = 0x100 +} + +SECTIONS { + .aaa_s ORIGIN(REGION) : + { + *(.aaa) + } > REGION + + .bbb_s ORIGIN(REGION) + 0x14 : + { + *(.bbb) + } > REGION +}