Index: lld/trunk/ELF/LinkerScript.h =================================================================== --- lld/trunk/ELF/LinkerScript.h +++ lld/trunk/ELF/LinkerScript.h @@ -124,6 +124,7 @@ std::vector Phdrs; uint32_t Filler = 0; ConstraintKind Constraint = ConstraintKind::NoConstraint; + std::string Location; }; // This struct represents one section match pattern in SECTIONS() command. @@ -268,7 +269,7 @@ ScriptConfiguration &Opt = *ScriptConfig; std::vector getPhdrIndices(StringRef SectionName); - size_t getPhdrIndex(StringRef PhdrName); + size_t getPhdrIndex(const Twine &Loc, StringRef PhdrName); uintX_t Dot; uintX_t LMAOffset = 0; Index: lld/trunk/ELF/LinkerScript.cpp =================================================================== --- lld/trunk/ELF/LinkerScript.cpp +++ lld/trunk/ELF/LinkerScript.cpp @@ -972,21 +972,21 @@ std::vector Ret; for (StringRef PhdrName : Cmd->Phdrs) - Ret.push_back(getPhdrIndex(PhdrName)); + Ret.push_back(getPhdrIndex(Cmd->Location, PhdrName)); return Ret; } return {}; } template -size_t LinkerScript::getPhdrIndex(StringRef PhdrName) { +size_t LinkerScript::getPhdrIndex(const Twine &Loc, StringRef PhdrName) { size_t I = 0; for (PhdrsCommand &Cmd : Opt.PhdrsCommands) { if (Cmd.Name == PhdrName) return I; ++I; } - error("section header '" + PhdrName + "' is not listed in PHDRS"); + error(Loc + ": section header '" + PhdrName + "' is not listed in PHDRS"); return 0; } @@ -1441,6 +1441,7 @@ OutputSectionCommand * ScriptParser::readOutputSectionDescription(StringRef OutSec) { OutputSectionCommand *Cmd = new OutputSectionCommand(OutSec); + Cmd->Location = getCurrentLocation(); // Read an address expression. // https://sourceware.org/binutils/docs/ld/Output-Section-Address.html#Output-Section-Address Index: lld/trunk/test/ELF/linkerscript/phdrs.s =================================================================== --- lld/trunk/test/ELF/linkerscript/phdrs.s +++ lld/trunk/test/ELF/linkerscript/phdrs.s @@ -39,6 +39,14 @@ # RUN: ld.lld -o %t1 --script %t.script %t # RUN: llvm-readobj -program-headers %t1 | FileCheck --check-prefix=DEFHDR %s +## Check that error is reported when trying to use phdr which is not listed +## inside PHDRS {} block +## TODO: If script doesn't contain PHDRS {} block then default phdr is always +## created and error is not reported. +# RUN: echo "PHDRS { all PT_LOAD; } \ +# RUN: SECTIONS { .baz : {*(.foo.*)} :bar }" > %t.script +# RUN: not ld.lld -o %t1 --script %t.script %t 2>&1 | FileCheck --check-prefix=BADHDR %s + # CHECK: ProgramHeaders [ # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) @@ -120,6 +128,8 @@ # DEFHDR-NEXT: PF_X (0x1) # DEFHDR-NEXT: ] +# BADHDR: {{.*}}.script:1: section header 'bar' is not listed in PHDRS + .global _start _start: nop