[ELF] Expand regions for gaps due to explicit address

If the dot gets moved by an explicit section address, an empty gap between sections could be created. The encompassing region for the section being parsed needs to be expanded to include the gap.

Differential Revision: https://reviews.llvm.org/D65722

Patch by Gabriel Smith!

llvm-svn: 368379
This commit is contained in:
Fangrui Song 2019-08-09 01:25:49 +00:00
parent 84b55e61dd
commit 179dc276eb
2 changed files with 26 additions and 0 deletions

View File

@ -772,6 +772,14 @@ void LinkerScript::assignOffsets(OutputSection *sec) {
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)

View File

@ -0,0 +1,18 @@
# REQUIRES: x86
# RUN: echo '.section .aaa, "a"; .quad 0; .section .bbb, "a"; .quad 0;' \
# RUN: | llvm-mc -filetype=obj -triple=x86_64 - -o %t.o
# RUN: ld.lld %t.o --script %s -o %t
# RUN: llvm-readelf -S %t | FileCheck %s
# CHECK: .aaa PROGBITS 0000000000000000 001000 000008
# CHECK: .bbb PROGBITS 0000000000000014 001014 000008
MEMORY {
REGION (rwx) : ORIGIN = 0x0000, LENGTH = 0x100
}
SECTIONS {
.aaa 0 : { *(.aaa) } > REGION
.bbb 0x14 : { *(.bbb) } > REGION
}