Index: ELF/LinkerScript.cpp =================================================================== --- ELF/LinkerScript.cpp +++ ELF/LinkerScript.cpp @@ -53,7 +53,10 @@ StringSaver Saver; std::vector Tokens; size_t Pos = 0; + size_t IncludeLevel = 0; }; + +StringRef EndInclude = "_end_include"; } void LinkerScript::run() { @@ -61,6 +64,10 @@ StringRef Tok = next(); if (Tok == ";") continue; + if (Tok.begin() == EndInclude.begin()) { + --IncludeLevel; + continue; + } if (Tok == "ENTRY") { readEntry(); } else if (Tok == "GROUP" || Tok == "INPUT") { @@ -196,12 +203,17 @@ } void LinkerScript::readInclude() { + ++IncludeLevel; + if (IncludeLevel > 10) { + error("includes nested too deeply"); + } StringRef Tok = next(); auto MBOrErr = MemoryBuffer::getFile(Tok); error(MBOrErr, "cannot open " + Tok); std::unique_ptr &MB = *MBOrErr; StringRef S = Saver.save(MB->getMemBufferRef().getBuffer()); std::vector V = tokenize(S); + V.push_back(EndInclude); Tokens.insert(Tokens.begin() + Pos, V.begin(), V.end()); } Index: test/elf2/linkerscript.s =================================================================== --- test/elf2/linkerscript.s +++ test/elf2/linkerscript.s @@ -92,9 +92,13 @@ # RUN: echo "FOO(BAR)" > %t.script # RUN: not ld.lld2 -o foo %t.script > %t.log 2>&1 # RUN: FileCheck -check-prefix=ERR1 %s < %t.log - # ERR1: unknown directive: FOO +# RUN: echo "INCLUDE " %t.script > %t.script +# RUN: not ld.lld2 -o %t2 %t.script > %t.log 2>&1 +# RUN: FileCheck -check-prefix=ERR2 %s < %t.log +# ERR2: includes nested too deeply + .globl _start, _label; _start: mov $60, %rax