[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