summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2017-07-26 09:46:59 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2017-07-26 09:46:59 +0000
commit84941ef1585789956156d2067649f27a5b360ae8 (patch)
treeb7b17f45b68a16c7650814a8241aafd426957c50
parentb1fd7849361f16b9059ddd6956c0f3f2eca784b3 (diff)
downloadbcm5719-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.h3
-rw-r--r--lld/ELF/Driver.cpp4
-rw-r--r--lld/ELF/Relocations.cpp26
-rw-r--r--lld/test/ELF/copy-errors.s3
-rw-r--r--lld/test/ELF/x86-64-dyn-rel-error.s2
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
OpenPOWER on IntegriCloud