It was revealed by D27831.
If we have linkerscript that includes another one that sets OUTPUT for example:
- RUN: echo "INCLUDE \"foo.script\"" > %t.script
- RUN: echo "OUTPUT(\"%t.out\")" > %T/foo.script
then we do:
void ScriptParser::readInclude() { ... std::unique_ptr<MemoryBuffer> &MB = *MBOrErr; tokenize(MB->getMemBufferRef()); OwningMBs.push_back(std::move(MB)); } void ScriptParser::readOutput() { ... Config->OutputFile = unquote(Tok); ... }
Problem is that OwningMBs are destroyed after script parser do its job.
So all Toks are dead and Config->OutputFile points to destroyed data.
Patch suggests to save all included scripts into using string Saver.