return elf::getHeaderSize<ELFT>();
}
-template <class ELFT> uint64_t LinkerScript<ELFT>::getSymbolValue(StringRef S) {
+template <class ELFT>
+uint64_t LinkerScript<ELFT>::getSymbolValue(const Twine &Loc, StringRef S) {
if (SymbolBody *B = Symtab<ELFT>::X->find(S))
return B->getVA<ELFT>();
- error("symbol not found: " + S);
+ error(Loc + ": symbol not found: " + S);
return 0;
}
return Cmd;
}
-static uint64_t getSymbolValue(StringRef S, uint64_t Dot) {
+static uint64_t getSymbolValue(const Twine &Loc, StringRef S, uint64_t Dot) {
if (S == ".")
return Dot;
- return ScriptBase->getSymbolValue(S);
+ return ScriptBase->getSymbolValue(Loc, S);
}
static bool isAbsolute(StringRef S) {
} else {
E = readExpr();
}
- if (Op == "+=")
- E = [=](uint64_t Dot) { return getSymbolValue(Name, Dot) + E(Dot); };
+ if (Op == "+=") {
+ std::string Loc = getCurrentLocation();
+ E = [=](uint64_t Dot) {
+ return getSymbolValue(Loc, Name, Dot) + E(Dot);
+ };
+ }
return new SymbolAssignment(Name, E);
}
// Tok is a symbol name.
if (Tok != "." && !isValidCIdentifier(Tok))
setError("malformed number: " + Tok);
- return {[=](uint64_t Dot) { return getSymbolValue(Tok, Dot); },
+ return {[=](uint64_t Dot) { return getSymbolValue(Location, Tok, Dot); },
[=] { return isAbsolute(Tok); },
[=] { return ScriptBase->getSymbolSection(Tok); }};
}
public:
virtual uint64_t getHeaderSize() = 0;
- virtual uint64_t getSymbolValue(StringRef S) = 0;
+ virtual uint64_t getSymbolValue(const Twine &Loc, StringRef S) = 0;
virtual bool isDefined(StringRef S) = 0;
virtual bool isAbsolute(StringRef S) = 0;
virtual const OutputSectionBase *getSymbolSection(StringRef S) = 0;
void assignAddresses(std::vector<PhdrEntry> &Phdrs);
bool hasPhdrsCommands();
uint64_t getHeaderSize() override;
- uint64_t getSymbolValue(StringRef S) override;
+ uint64_t getSymbolValue(const Twine &Loc, StringRef S) override;
bool isDefined(StringRef S) override;
bool isAbsolute(StringRef S) override;
const OutputSectionBase *getSymbolSection(StringRef S) override;