[ELF2] Implement --allow-shlib-undefined as default behavior.
We ignore --{no,}allow-shlib-undefined options and always allow undefined
symbols if we are building a DSO.
llvm-svn: 249036
diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td
index b8c81d5..10b0f14 100644
--- a/lld/ELF/Options.td
+++ b/lld/ELF/Options.td
@@ -48,6 +48,12 @@
def sysroot : Joined<["--"], "sysroot=">,
HelpText<"Set the system root">;
+def no_allow_shlib_undefined
+ : Flag<["--"], "no-allow-shlib-undefined">;
+
+def allow_shlib_undefined
+ : Flag<["--"], "allow-shlib-undefined">;
+
// Aliases
def alias_Bdynamic_call_shared: Flag<["-"], "call_shared">, Alias<Bdynamic>;
def alias_Bdynamic_dy: Flag<["-"], "dy">, Alias<Bdynamic>;
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 1d602a0..4500041 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -271,6 +271,9 @@
typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym;
typedef typename ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range;
+ if (Config->Shared)
+ return;
+
const Elf_Sym &SymE = cast<ELFSymbolBody<ELFT>>(Sym).Sym;
ELFFileBase *SymFile = nullptr;
diff --git a/lld/test/elf2/Inputs/allow-shlib-undefined.s b/lld/test/elf2/Inputs/allow-shlib-undefined.s
new file mode 100644
index 0000000..fc9ca32
--- /dev/null
+++ b/lld/test/elf2/Inputs/allow-shlib-undefined.s
@@ -0,0 +1,3 @@
+.globl _shared
+_shared:
+ call _unresolved
diff --git a/lld/test/elf2/allow-shlib-undefined.s b/lld/test/elf2/allow-shlib-undefined.s
new file mode 100644
index 0000000..e3ae4ce
--- /dev/null
+++ b/lld/test/elf2/allow-shlib-undefined.s
@@ -0,0 +1,25 @@
+# --allow-shlib-undefined and --no-allow-shlib-undefined are fully
+# ignored in linker implementation.
+# --allow-shlib-undefined is set by default
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux \
+# RUN: %p/Inputs/allow-shlib-undefined.s -o %t
+# RUN: lld -shared -flavor gnu2 %t -o %t.so
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1
+
+# Executable: should link with DSO containing undefined symbols in any case.
+# RUN: lld -flavor gnu2 %t1 %t.so -o %t2
+# RUN: lld -flavor gnu2 --no-allow-shlib-undefined %t1 %t.so -o %t2
+# RUN: lld -flavor gnu2 --allow-shlib-undefined %t1 %t.so -o %t2
+
+# DSO with undefines:
+# should link with or without any of these options.
+# RUN: lld -shared -flavor gnu2 %t -o %t.so
+# RUN: lld -shared --allow-shlib-undefined -flavor gnu2 %t -o %t.so
+# RUN: lld -shared --no-allow-shlib-undefined -flavor gnu2 %t -o %t.so
+
+# Executable still should not link when have undefines inside.
+# RUN: not lld -flavor gnu2 %t -o %t.so
+
+.globl _start
+_start:
+ call _shared