Index: lld/trunk/ELF/Relocations.cpp =================================================================== --- lld/trunk/ELF/Relocations.cpp +++ lld/trunk/ELF/Relocations.cpp @@ -66,6 +66,14 @@ using namespace lld; using namespace lld::elf; +static Optional getLinkerScriptLocation(const Symbol &Sym) { + for (BaseCommand *Base : Script->SectionCommands) + if (auto *Cmd = dyn_cast(Base)) + if (Cmd->Sym == &Sym) + return Cmd->Location; + return None; +} + // Construct a message in the following format. // // >>> defined in /home/alice/src/foo.o @@ -73,8 +81,13 @@ // >>> /home/alice/src/bar.o:(.text+0x1) static std::string getLocation(InputSectionBase &S, const Symbol &Sym, uint64_t Off) { - std::string Msg = - "\n>>> defined in " + toString(Sym.File) + "\n>>> referenced by "; + std::string Msg = "\n>>> defined in "; + if (Sym.File) + Msg += toString(Sym.File); + else if (Optional Loc = getLinkerScriptLocation(Sym)) + Msg += *Loc; + + Msg += "\n>>> referenced by "; std::string Src = S.getSrcMsg(Sym, Off); if (!Src.empty()) Msg += Src + "\n>>> "; Index: lld/trunk/test/ELF/linkerscript/symbol-location.s =================================================================== --- lld/trunk/test/ELF/linkerscript/symbol-location.s +++ lld/trunk/test/ELF/linkerscript/symbol-location.s @@ -0,0 +1,15 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +# RUN: echo "foo = 1;" > %t.script +# RUN: not ld.lld -pie -o %t --script %t.script %t.o 2>&1 | FileCheck %s + +## Here we check that symbol 'foo' location is reported properly. + +# CHECK: error: relocation R_X86_64_PLT32 cannot refer to absolute symbol: foo +# CHECK: >>> defined in {{.*}}.script:1 +# CHECK: >>> referenced by {{.*}}.o:(.text+0x1) + +.text +.globl _start +_start: + call foo@PLT