[lld] r321418 - Fix output section offset and contents when linker script uses memory region and data commands.
Rafael Espindola via llvm-commits
llvm-commits at lists.llvm.org
Sat Dec 23 19:46:35 PST 2017
Author: rafael
Date: Sat Dec 23 19:46:35 2017
New Revision: 321418
URL: http://llvm.org/viewvc/llvm-project?rev=321418&view=rev
Log:
Fix output section offset and contents when linker script uses memory region and data commands.
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
Patch by Owen Shaw!
Modified:
lld/trunk/ELF/LinkerScript.cpp
lld/trunk/test/ELF/linkerscript/data-commands.s
Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=321418&r1=321417&r2=321418&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Sat Dec 23 19:46:35 2017
@@ -693,6 +693,8 @@ void LinkerScript::assignOffsets(OutputS
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;
}
Modified: lld/trunk/test/ELF/linkerscript/data-commands.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/data-commands.s?rev=321418&r1=321417&r2=321418&view=diff
==============================================================================
--- lld/trunk/test/ELF/linkerscript/data-commands.s (original)
+++ lld/trunk/test/ELF/linkerscript/data-commands.s Sat Dec 23 19:46:35 2017
@@ -44,6 +44,42 @@
# BE-NEXT: ff12ff11 22ff1122 3346ff11 22334455
# BE-NEXT: 667788
+# RUN: echo "MEMORY { \
+# RUN: rom (rwx) : ORIGIN = 0x00, LENGTH = 2K \
+# RUN: } \
+# RUN: SECTIONS { \
+# 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
More information about the llvm-commits
mailing list