[PATCH] D65722: [ELF] Expand regions for gaps due to explicit address
Gabriel Smith via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Aug 4 10:36:12 PDT 2019
yodaldevoid created this revision.
yodaldevoid added reviewers: ruiu, MaskRay.
Herald added subscribers: llvm-commits, arichardson, emaste.
Herald added a reviewer: espindola.
Herald added a project: LLVM.
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.
Repository:
rL LLVM
https://reviews.llvm.org/D65722
Files:
lld/ELF/LinkerScript.cpp
lld/test/ELF/linkerscript/section-gap-explicit-expr.test
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
+}
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)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D65722.213256.patch
Type: text/x-patch
Size: 1608 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190804/352a4c36/attachment.bin>
More information about the llvm-commits
mailing list