diff options
author | George Rimar <grimar@accesssoftek.com> | 2015-10-01 20:14:45 +0000 |
---|---|---|
committer | George Rimar <grimar@accesssoftek.com> | 2015-10-01 20:14:45 +0000 |
commit | 57e40deb8dfcba89d1d1ca748c916108b609e03c (patch) | |
tree | 7c01e6c31a315d2ea120a20b486d63391dd1a2d1 | |
parent | 195b3b0074873946dfcd5514aaa8a996a7d0138e (diff) | |
download | bcm5719-llvm-57e40deb8dfcba89d1d1ca748c916108b609e03c.tar.gz bcm5719-llvm-57e40deb8dfcba89d1d1ca748c916108b609e03c.zip |
[ELF2] Implement --no-undefined flag.
llvm-svn: 249064
-rw-r--r-- | lld/ELF/Config.h | 1 | ||||
-rw-r--r-- | lld/ELF/Driver.cpp | 1 | ||||
-rw-r--r-- | lld/ELF/Options.td | 3 | ||||
-rw-r--r-- | lld/ELF/Writer.cpp | 2 | ||||
-rw-r--r-- | lld/test/elf2/no-undefined.s | 7 |
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 |