[lld] r368379 - [ELF] Expand regions for gaps due to explicit address

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 8 18:25:49 PDT 2019


Author: maskray
Date: Thu Aug  8 18:25:49 2019
New Revision: 368379

URL: http://llvm.org/viewvc/llvm-project?rev=368379&view=rev
Log:
[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!

Added:
    lld/trunk/test/ELF/linkerscript/memory-gap-explicit-expr.test
Modified:
    lld/trunk/ELF/LinkerScript.cpp

Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=368379&r1=368378&r2=368379&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Thu Aug  8 18:25:49 2019
@@ -772,6 +772,14 @@ void LinkerScript::assignOffsets(OutputS
   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)

Added: lld/trunk/test/ELF/linkerscript/memory-gap-explicit-expr.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/memory-gap-explicit-expr.test?rev=368379&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/memory-gap-explicit-expr.test (added)
+++ lld/trunk/test/ELF/linkerscript/memory-gap-explicit-expr.test Thu Aug  8 18:25:49 2019
@@ -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
+}




More information about the llvm-commits mailing list