[PATCH] D41459: [lld] Fix output section offset and contents when linker script uses memory region and data commands

Owen Shaw via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 20 11:24:24 PST 2017


owenpshaw created this revision.
owenpshaw added a reviewer: lld.
Herald added a subscriber: emaste.

Advance the memory region offset when handling a linker script data command such as BYTE or LONG.  Failure to advance the offset results in corrupted output with overlapping sections.

Update tests to check for this combination of both a) memory regions and b) data commands.

Fixes https://bugs.llvm.org/show_bug.cgi?id=35565


https://reviews.llvm.org/D41459

Files:
  ELF/LinkerScript.cpp
  test/ELF/linkerscript/data-commands.s


Index: test/ELF/linkerscript/data-commands.s
===================================================================
--- test/ELF/linkerscript/data-commands.s
+++ test/ELF/linkerscript/data-commands.s
@@ -44,6 +44,44 @@
 # BE-NEXT:   ff12ff11 22ff1122 3346ff11 22334455
 # BE-NEXT:   667788
 
+# RUN: echo "MEMORY                  \
+# RUN:   {                           \
+# RUN:     rom (rwx) : ORIGIN = 0x00, LENGTH = 2K \
+# RUN:   }                           \
+# RUN:  SECTIONS                     \
+# RUN:  {                            \
+# RUN:    .foo : {                   \
+# RUN:      *(.foo.1)                \
+# RUN:      BYTE(0x11)               \
+# RUN:      *(.foo.2)                \
+# RUN:      SHORT(0x1122)            \
+# RUN:      *(.foo.3)                \
+# RUN:      LONG(0x11223344)         \
+# RUN:      *(.foo.4)                \
+# RUN:      QUAD(0x1122334455667788) \
+# RUN:    } > rom                    \
+# RUN:    .bar : {                   \
+# RUN:      *(.bar.1)                \
+# RUN:      BYTE(a + 1)              \
+# RUN:      *(.bar.2)                \
+# RUN:      SHORT(b)                 \
+# RUN:      *(.bar.3)                \
+# RUN:      LONG(c + 2)              \
+# RUN:      *(.bar.4)                \
+# RUN:      QUAD(d)                  \
+# RUN:    } > rom                    \
+# RUN:  }" > %t-memory.script
+# RUN: ld.lld -o %t-memory %t.o --script %t-memory.script
+# RUN: llvm-objdump -s %t-memory | FileCheck %s --check-prefix=MEM
+
+# MEM:      Contents of section .foo:
+# MEM-NEXT:   0000 ff11ff22 11ff4433 2211ff88 77665544
+# MEM-NEXT:   0010 332211
+
+# MEM:      Contents of section .bar:
+# MEM-NEXT:   0013 ff12ff22 11ff4633 2211ff88 77665544
+# MEM-NEXT:   0023 332211
+
 .global a
 a = 0x11
 
Index: ELF/LinkerScript.cpp
===================================================================
--- ELF/LinkerScript.cpp
+++ ELF/LinkerScript.cpp
@@ -693,6 +693,9 @@
     if (auto *Cmd = dyn_cast<ByteCommand>(Base)) {
       Cmd->Offset = Dot - Ctx->OutSec->Addr;
       Dot += Cmd->Size;
+      if (Ctx->MemRegion){
+        Ctx->MemRegionOffset[Ctx->MemRegion] += Cmd->Size;
+      }
       Ctx->OutSec->Size = Dot - Ctx->OutSec->Addr;
       continue;
     }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D41459.127766.patch
Type: text/x-patch
Size: 2235 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171220/4b9c0c5b/attachment.bin>


More information about the llvm-commits mailing list