forked from OSchip/llvm-project
[ELF] - Change way how we handle --noinhibit-exec
Previously we handled this option implicitly, only for infering unresolved symbols handling policy. ld man says: "--noinhibit-exec Retain the executable output file whenever it is still usable", and we may want to handle other cases too. Differential revision: https://reviews.llvm.org/D35793 llvm-svn: 309091
This commit is contained in:
parent
b1fd784936
commit
84941ef158
|
@ -44,7 +44,7 @@ enum class DiscardPolicy { Default, All, Locals, None };
|
|||
enum class StripPolicy { None, All, Debug };
|
||||
|
||||
// For --unresolved-symbols.
|
||||
enum class UnresolvedPolicy { ReportError, Warn, WarnAll, Ignore, IgnoreAll };
|
||||
enum class UnresolvedPolicy { ReportError, Warn, Ignore, IgnoreAll };
|
||||
|
||||
// For --sort-section and linkerscript sorting rules.
|
||||
enum class SortSectionPolicy { Default, None, Alignment, Name, Priority };
|
||||
|
@ -128,6 +128,7 @@ struct Configuration {
|
|||
bool ICF;
|
||||
bool MipsN32Abi = false;
|
||||
bool NoGnuUnique;
|
||||
bool NoinhibitExec;
|
||||
bool NoUndefinedVersion;
|
||||
bool Nostdlib;
|
||||
bool OFormatBinary;
|
||||
|
|
|
@ -418,9 +418,6 @@ static std::string getRpath(opt::InputArgList &Args) {
|
|||
// Determines what we should do if there are remaining unresolved
|
||||
// symbols after the name resolution.
|
||||
static UnresolvedPolicy getUnresolvedSymbolPolicy(opt::InputArgList &Args) {
|
||||
// -noinhibit-exec or -r imply some default values.
|
||||
if (Args.hasArg(OPT_noinhibit_exec))
|
||||
return UnresolvedPolicy::WarnAll;
|
||||
if (Args.hasArg(OPT_relocatable))
|
||||
return UnresolvedPolicy::IgnoreAll;
|
||||
|
||||
|
@ -648,6 +645,7 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) {
|
|||
Config->MapFile = Args.getLastArgValue(OPT_Map);
|
||||
Config->NoGnuUnique = Args.hasArg(OPT_no_gnu_unique);
|
||||
Config->NoUndefinedVersion = Args.hasArg(OPT_no_undefined_version);
|
||||
Config->NoinhibitExec = Args.hasArg(OPT_noinhibit_exec);
|
||||
Config->Nostdlib = Args.hasArg(OPT_nostdlib);
|
||||
Config->OFormatBinary = isOutputFormatBinary(Args);
|
||||
Config->Omagic = Args.hasArg(OPT_omagic);
|
||||
|
|
|
@ -535,6 +535,13 @@ template <class ELFT> static void addCopyRelSymbol(SharedSymbol *SS) {
|
|||
In<ELFT>::RelaDyn->addReloc({Target->CopyRel, Sec, Off, false, SS, 0});
|
||||
}
|
||||
|
||||
static void errorOrWarn(const Twine &Msg) {
|
||||
if (!Config->NoinhibitExec)
|
||||
error(Msg);
|
||||
else
|
||||
warn(Msg);
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
static RelExpr adjustExpr(SymbolBody &Body, RelExpr Expr, uint32_t Type,
|
||||
const uint8_t *Data, InputSectionBase &S,
|
||||
|
@ -609,8 +616,8 @@ static RelExpr adjustExpr(SymbolBody &Body, RelExpr Expr, uint32_t Type,
|
|||
return toPlt(Expr);
|
||||
}
|
||||
|
||||
error("symbol '" + toString(Body) + "' defined in " + toString(Body.File) +
|
||||
" has no type");
|
||||
errorOrWarn("symbol '" + toString(Body) + "' defined in " +
|
||||
toString(Body.File) + " has no type");
|
||||
return Expr;
|
||||
}
|
||||
|
||||
|
@ -691,12 +698,10 @@ static void reportUndefined(SymbolBody &Sym, InputSectionBase &S,
|
|||
Msg += Src + "\n>>> ";
|
||||
Msg += S.getObjMsg<ELFT>(Offset);
|
||||
|
||||
if (Config->UnresolvedSymbols == UnresolvedPolicy::WarnAll ||
|
||||
(Config->UnresolvedSymbols == UnresolvedPolicy::Warn && CanBeExternal)) {
|
||||
if (Config->UnresolvedSymbols == UnresolvedPolicy::Warn && CanBeExternal)
|
||||
warn(Msg);
|
||||
} else {
|
||||
error(Msg);
|
||||
}
|
||||
else
|
||||
errorOrWarn(Msg);
|
||||
}
|
||||
|
||||
template <class RelTy>
|
||||
|
@ -905,9 +910,10 @@ static void scanRelocs(InputSectionBase &Sec, ArrayRef<RelTy> Rels) {
|
|||
// We don't know anything about the finaly symbol. Just ask the dynamic
|
||||
// linker to handle the relocation for us.
|
||||
if (!Target->isPicRel(Type))
|
||||
error("relocation " + toString(Type) +
|
||||
" cannot be used against shared object; recompile with -fPIC" +
|
||||
getLocation<ELFT>(Sec, Body, Offset));
|
||||
errorOrWarn(
|
||||
"relocation " + toString(Type) +
|
||||
" cannot be used against shared object; recompile with -fPIC" +
|
||||
getLocation<ELFT>(Sec, Body, Offset));
|
||||
|
||||
In<ELFT>::RelaDyn->addReloc(
|
||||
{Target->getDynRel(Type), &Sec, Offset, false, &Body, Addend});
|
||||
|
|
|
@ -9,6 +9,9 @@
|
|||
// CHECK: >>> referenced by {{.*}}.o:(.text+0x1)
|
||||
// CHECK: symbol 'zed' defined in {{.*}}.so has no type
|
||||
|
||||
// RUN: not ld.lld --noinhibit-exec %t.o %t2.so -o %t 2>&1 | FileCheck %s --check-prefix=NOINHIBIT
|
||||
// NOINHIBIT: warning: symbol 'zed' defined in {{.*}}.so has no type
|
||||
|
||||
.global _start
|
||||
_start:
|
||||
call bar
|
||||
|
|
|
@ -10,3 +10,5 @@ _start:
|
|||
.long bar
|
||||
|
||||
// CHECK: relocation R_X86_64_32 cannot be used against shared object; recompile with -fPIC
|
||||
|
||||
// RUN: ld.lld --noinhibit-exec %t.o %t2.so -o %t 2>&1 | FileCheck %s
|
||||
|
|
Loading…
Reference in New Issue