diff options
Diffstat (limited to 'lld/ELF/Driver.cpp')
-rw-r--r-- | lld/ELF/Driver.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 4dbdad7c2bd..a85f30fe7a3 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -256,6 +256,17 @@ static bool hasZOption(opt::InputArgList &Args, StringRef Key) { return false; } +static Optional<StringRef> +getZOptionValue(opt::InputArgList &Args, StringRef Key) { + for (auto *Arg : Args.filtered(OPT_z)) { + StringRef Value = Arg->getValue(); + size_t Pos = Value.find("="); + if (Pos != StringRef::npos && Key == Value.substr(0, Pos)) + return Value.substr(Pos + 1); + } + return None; +} + void LinkerDriver::main(ArrayRef<const char *> ArgsArr) { ELFOptTable Parser; opt::InputArgList Args = Parser.parse(ArgsArr.slice(1)); @@ -395,6 +406,10 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { Config->ZOrigin = hasZOption(Args, "origin"); Config->ZRelro = !hasZOption(Args, "norelro"); + if (Optional<StringRef> Value = getZOptionValue(Args, "stack-size")) + if (Value->getAsInteger(0, Config->ZStackSize)) + error("invalid stack size: " + *Value); + if (Config->Relocatable) Config->StripAll = false; |