[PATCH] D43948: [ELF] - Report error when memory region is overflowed by data commands.
George Rimar via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 2 00:14:20 PST 2018
This revision was automatically updated to reflect the committed changes.
Closed by commit rL326545: [ELF] - Report error when memory region is overflowed by data commands. (authored by grimar, committed by ).
Changed prior to commit:
https://reviews.llvm.org/D43948?vs=136549&id=136685#toc
Repository:
rL LLVM
https://reviews.llvm.org/D43948
Files:
lld/trunk/ELF/LinkerScript.cpp
lld/trunk/test/ELF/linkerscript/memory-data-commands.test
Index: lld/trunk/test/ELF/linkerscript/memory-data-commands.test
===================================================================
--- lld/trunk/test/ELF/linkerscript/memory-data-commands.test
+++ lld/trunk/test/ELF/linkerscript/memory-data-commands.test
@@ -0,0 +1,22 @@
+# REQUIRES: x86
+
+# RUN: echo ".section .foo,\"a\"" > %t.s
+# RUN: echo ".quad 1" >> %t.s
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %t.s -o %t.o
+
+# RUN: not ld.lld -o %t %t.o --script %s 2>&1 | FileCheck %s
+
+# Check we are able to catch 'ram' overflow caused by BYTE command.
+# CHECK: error: section '.foo' will not fit in region 'ram': overflowed by 1 bytes
+
+MEMORY {
+ text (rwx): org = 0x0, len = 0x1000
+ ram (rwx): org = 0x1000, len = 8
+}
+SECTIONS {
+ .text : { *(.text) } > text
+ .foo : {
+ *(.foo)
+ BYTE(0x1)
+ } > ram
+}
Index: lld/trunk/ELF/LinkerScript.cpp
===================================================================
--- lld/trunk/ELF/LinkerScript.cpp
+++ lld/trunk/ELF/LinkerScript.cpp
@@ -621,6 +621,16 @@
return End;
}
+// Expands the memory region by the specified size.
+static void expandMemoryRegion(MemoryRegion *MemRegion, uint64_t Size,
+ StringRef RegionName, StringRef SecName) {
+ MemRegion->CurPos += Size;
+ uint64_t NewSize = MemRegion->CurPos - MemRegion->Origin;
+ if (NewSize > MemRegion->Length)
+ error("section '" + SecName + "' will not fit in region '" + RegionName +
+ "': overflowed by " + Twine(NewSize - MemRegion->Length) + " bytes");
+}
+
void LinkerScript::output(InputSection *S) {
uint64_t Before = advance(0, 1);
uint64_t Pos = advance(S->getSize(), S->Alignment);
@@ -637,17 +647,9 @@
Ctx->LMARegion->CurPos += Pos - Before;
// FIXME: should we also produce overflow errors for LMARegion?
- if (Ctx->MemRegion) {
- uint64_t &CurOffset = Ctx->MemRegion->CurPos;
- CurOffset += Pos - Before;
- uint64_t CurSize = CurOffset - Ctx->MemRegion->Origin;
- if (CurSize > Ctx->MemRegion->Length) {
- uint64_t OverflowAmt = CurSize - Ctx->MemRegion->Length;
- error("section '" + Ctx->OutSec->Name + "' will not fit in region '" +
- Ctx->MemRegion->Name + "': overflowed by " + Twine(OverflowAmt) +
- " bytes");
- }
- }
+ if (Ctx->MemRegion)
+ expandMemoryRegion(Ctx->MemRegion, Pos - Before, Ctx->MemRegion->Name,
+ Ctx->OutSec->Name);
}
void LinkerScript::switchTo(OutputSection *Sec) {
@@ -738,7 +740,8 @@
Cmd->Offset = Dot - Ctx->OutSec->Addr;
Dot += Cmd->Size;
if (Ctx->MemRegion)
- Ctx->MemRegion->CurPos += Cmd->Size;
+ expandMemoryRegion(Ctx->MemRegion, Cmd->Size, Ctx->MemRegion->Name,
+ Ctx->OutSec->Name);
if (Ctx->LMARegion)
Ctx->LMARegion->CurPos += Cmd->Size;
Ctx->OutSec->Size = Dot - Ctx->OutSec->Addr;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D43948.136685.patch
Type: text/x-patch
Size: 2908 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180302/eab45e26/attachment.bin>
More information about the llvm-commits
mailing list