[lld] r326545 - [ELF] - Report error when memory region is overflowed by data commands.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 2 00:11:59 PST 2018


Author: grimar
Date: Fri Mar  2 00:11:58 2018
New Revision: 326545

URL: http://llvm.org/viewvc/llvm-project?rev=326545&view=rev
Log:
[ELF] - Report error when memory region is overflowed by data commands.

LLD can not catch a memory area overflow when using a data command.
If we have the script below:

.foo : 
{
  *(.foo)
  BYTE(0x1)
} > ram

where BYTE overflows the ram region, we do not report it currently.
Patch fixes that.

Differential revision: https://reviews.llvm.org/D43948

Added:
    lld/trunk/test/ELF/linkerscript/memory-data-commands.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=326545&r1=326544&r2=326545&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Fri Mar  2 00:11:58 2018
@@ -621,6 +621,16 @@ uint64_t LinkerScript::advance(uint64_t
   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 @@ void LinkerScript::output(InputSection *
     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 @@ void LinkerScript::assignOffsets(OutputS
       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;

Added: lld/trunk/test/ELF/linkerscript/memory-data-commands.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/memory-data-commands.test?rev=326545&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/memory-data-commands.test (added)
+++ lld/trunk/test/ELF/linkerscript/memory-data-commands.test Fri Mar  2 00:11:58 2018
@@ -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
+}




More information about the llvm-commits mailing list