Skip to content

Commit

Permalink
[ELF] - Do not crash when move location counter backward.
Browse files Browse the repository at this point in the history
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

llvm-svn: 289782
  • Loading branch information
George Rimar committed Dec 15, 2016
1 parent 7dfa626 commit 14460e0
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 1 deletion.
6 changes: 5 additions & 1 deletion lld/ELF/LinkerScript.cpp
Expand Up @@ -464,7 +464,11 @@ template <class ELFT> void LinkerScript<ELFT>::process(BaseCommand &Base) {
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;
}
Expand Down
9 changes: 9 additions & 0 deletions lld/test/ELF/linkerscript/locationcountererr.s
@@ -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

0 comments on commit 14460e0

Please sign in to comment.