[lld] r289782 - [ELF] - Do not crash when move location counter backward.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 14 23:27:28 PST 2016


Author: grimar
Date: Thu Dec 15 01:27:28 2016
New Revision: 289782

URL: http://llvm.org/viewvc/llvm-project?rev=289782&view=rev
Log:
[ELF] - Do not crash when move location counter backward.

PR31335 shows that we do that in next case:
SECTIONS { .text 0x2000 : {. = 0x100 ; *(.text) } }

though documentations says that "If . is used inside a section 
description however, it refers to the byte offset from the start
of that section, not an absolute address. " looks does not work 
as documented in bfd (as mentioned in comments for PR31335).

Until we find out the expected behavior was suggested at least not
to 'crash', what we do after trying to generate huge file.

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

Added:
    lld/trunk/test/ELF/linkerscript/locationcountererr.s
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=289782&r1=289781&r2=289782&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Thu Dec 15 01:27:28 2016
@@ -464,7 +464,11 @@ template <class ELFT> void LinkerScript<
   if (auto *AssignCmd = dyn_cast<SymbolAssignment>(&Base)) {
     if (AssignCmd->Name == ".") {
       // Update to location counter means update to section size.
-      Dot = AssignCmd->Expression(Dot);
+      uintX_t Val = AssignCmd->Expression(Dot);
+      if (Val < Dot)
+        error("unable to move location counter backward for: " +
+              CurOutSec->Name);
+      Dot = Val;
       CurOutSec->Size = Dot - CurOutSec->Addr;
       return;
     }

Added: lld/trunk/test/ELF/linkerscript/locationcountererr.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/locationcountererr.s?rev=289782&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/locationcountererr.s (added)
+++ lld/trunk/test/ELF/linkerscript/locationcountererr.s Thu Dec 15 01:27:28 2016
@@ -0,0 +1,9 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
+# RUN: echo "SECTIONS { .text 0x2000 : {. = 0x10 ; *(.text) } }" > %t.script
+# RUN: not ld.lld %t --script %t.script -o %t1 2>&1 | FileCheck %s
+# CHECK: unable to move location counter backward for: .text
+
+.globl _start
+_start:
+nop




More information about the llvm-commits mailing list