diff options
| author | George Rimar <grimar@accesssoftek.com> | 2017-07-26 09:46:59 +0000 |
|---|---|---|
| committer | George Rimar <grimar@accesssoftek.com> | 2017-07-26 09:46:59 +0000 |
| commit | 84941ef1585789956156d2067649f27a5b360ae8 (patch) | |
| tree | b7b17f45b68a16c7650814a8241aafd426957c50 | |
| parent | b1fd7849361f16b9059ddd6956c0f3f2eca784b3 (diff) | |
| download | bcm5719-llvm-84941ef1585789956156d2067649f27a5b360ae8.tar.gz bcm5719-llvm-84941ef1585789956156d2067649f27a5b360ae8.zip | |
[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
| -rw-r--r-- | lld/ELF/Config.h | 3 | ||||
| -rw-r--r-- | lld/ELF/Driver.cpp | 4 | ||||
| -rw-r--r-- | lld/ELF/Relocations.cpp | 26 | ||||
| -rw-r--r-- | lld/test/ELF/copy-errors.s | 3 | ||||
| -rw-r--r-- | lld/test/ELF/x86-64-dyn-rel-error.s | 2 |
5 files changed, 24 insertions, 14 deletions
diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index bc9567c6516..83645db71c4 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -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; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 1dcd69b3b9e..b77e867eab2 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -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); diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp index e5fcb2dcc58..77f429aee06 100644 --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -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}); diff --git a/lld/test/ELF/copy-errors.s b/lld/test/ELF/copy-errors.s index d0d6abdf68d..0af4638120d 100644 --- a/lld/test/ELF/copy-errors.s +++ b/lld/test/ELF/copy-errors.s @@ -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 diff --git a/lld/test/ELF/x86-64-dyn-rel-error.s b/lld/test/ELF/x86-64-dyn-rel-error.s index ee39e2cb83f..f479eca2e77 100644 --- a/lld/test/ELF/x86-64-dyn-rel-error.s +++ b/lld/test/ELF/x86-64-dyn-rel-error.s @@ -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 |

