summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2015-10-01 20:14:45 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2015-10-01 20:14:45 +0000
commit57e40deb8dfcba89d1d1ca748c916108b609e03c (patch)
tree7c01e6c31a315d2ea120a20b486d63391dd1a2d1
parent195b3b0074873946dfcd5514aaa8a996a7d0138e (diff)
downloadbcm5719-llvm-57e40deb8dfcba89d1d1ca748c916108b609e03c.tar.gz
bcm5719-llvm-57e40deb8dfcba89d1d1ca748c916108b609e03c.zip
[ELF2] Implement --no-undefined flag.
llvm-svn: 249064
-rw-r--r--lld/ELF/Config.h1
-rw-r--r--lld/ELF/Driver.cpp1
-rw-r--r--lld/ELF/Options.td3
-rw-r--r--lld/ELF/Writer.cpp2
-rw-r--r--lld/test/elf2/no-undefined.s7
5 files changed, 13 insertions, 1 deletions
diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h
index 03d5c952e40..e774583de44 100644
--- a/lld/ELF/Config.h
+++ b/lld/ELF/Config.h
@@ -31,6 +31,7 @@ struct Configuration {
bool DiscardNone;
bool ExportDynamic;
bool NoInhibitExec;
+ bool NoUndefined;
bool Shared;
bool Static = false;
bool WholeArchive = false;
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index f6a0629f691..7375b74565a 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -126,6 +126,7 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) {
Config->DiscardNone = Args.hasArg(OPT_discard_none);
Config->ExportDynamic = Args.hasArg(OPT_export_dynamic);
Config->NoInhibitExec = Args.hasArg(OPT_noinhibit_exec);
+ Config->NoUndefined = Args.hasArg(OPT_no_undefined);
Config->Shared = Args.hasArg(OPT_shared);
for (auto *Arg : Args) {
diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td
index 3d7be62cbad..f2af8da8800 100644
--- a/lld/ELF/Options.td
+++ b/lld/ELF/Options.td
@@ -43,6 +43,9 @@ def no_whole_archive : Flag<["--"], "no-whole-archive">,
def noinhibit_exec : Flag<["--"], "noinhibit-exec">,
HelpText<"Retain the executable output file whenever it is still usable">;
+def no_undefined : Flag<["--"], "no-undefined">,
+ HelpText<"Report unresolved symbols even if the linker is creating a shared library">;
+
def output : Separate<["-"], "o">, MetaVarName<"<path>">,
HelpText<"Path to file to write output">;
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 450004175e1..72abb200e9a 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -271,7 +271,7 @@ static void reportUndefined(const SymbolTable &S, const SymbolBody &Sym) {
typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym;
typedef typename ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range;
- if (Config->Shared)
+ if (Config->Shared && !Config->NoUndefined)
return;
const Elf_Sym &SymE = cast<ELFSymbolBody<ELFT>>(Sym).Sym;
diff --git a/lld/test/elf2/no-undefined.s b/lld/test/elf2/no-undefined.s
new file mode 100644
index 00000000000..5a74d4546c9
--- /dev/null
+++ b/lld/test/elf2/no-undefined.s
@@ -0,0 +1,7 @@
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
+# RUN: not lld --no-undefined -shared -flavor gnu2 %t -o %t.so
+# RUN: lld -shared -flavor gnu2 %t -o %t1.so
+
+.globl _shared
+_shared:
+ call _unresolved
OpenPOWER on IntegriCloud