Index: lld/trunk/ELF/Driver.cpp =================================================================== --- lld/trunk/ELF/Driver.cpp +++ lld/trunk/ELF/Driver.cpp @@ -756,8 +756,9 @@ Args.hasFlag(OPT_allow_multiple_definition, OPT_no_allow_multiple_definition, false) || hasZOption(Args, "muldefs"); - Config->AllowShlibUndefined = Args.hasFlag( - OPT_allow_shlib_undefined, OPT_no_allow_shlib_undefined, true); + Config->AllowShlibUndefined = + Args.hasFlag(OPT_allow_shlib_undefined, OPT_no_allow_shlib_undefined, + Args.hasArg(OPT_shared)); Config->AuxiliaryList = args::getStrings(Args, OPT_auxiliary); Config->Bsymbolic = Args.hasArg(OPT_Bsymbolic); Config->BsymbolicFunctions = Args.hasArg(OPT_Bsymbolic_functions); Index: lld/trunk/ELF/Options.td =================================================================== --- lld/trunk/ELF/Options.td +++ lld/trunk/ELF/Options.td @@ -64,8 +64,8 @@ "Do not allow multiple definitions (default)">; defm allow_shlib_undefined: B<"allow-shlib-undefined", - "Allow unresolved references in shared libraries (default)", - "Do not allow unresolved references in shared libraries">; + "Allow unresolved references in shared libraries (default when linking a shared library)", + "Do not allow unresolved references in shared libraries (default when linking an executable)">; defm apply_dynamic_relocs: B<"apply-dynamic-relocs", "Apply link-time values for dynamic relocations", Index: lld/trunk/docs/ld.lld.1 =================================================================== --- lld/trunk/docs/ld.lld.1 +++ lld/trunk/docs/ld.lld.1 @@ -46,6 +46,9 @@ .It Fl -allow-multiple-definition Do not error if a symbol is defined multiple times. The first definition will be used. +.It Fl -allow-shlib-undefined +Allow unresolved references in shared libraries. +This option is enabled by default when linking a shared library. .It Fl -apply-dynamic-relocs Apply link-time values for dynamic relocations. .It Fl -as-needed @@ -242,6 +245,9 @@ .It Fl -Map Ns = Ns Ar file , Fl M Ar file Print a link map to .Ar file . +.It Fl -no-allow-shlib-undefined +Do not allow unresolved references in shared libraries. +This option is enabled by default when linking an executable. .It Fl -no-as-needed Always set .Dv DT_NEEDED Index: lld/trunk/test/ELF/allow-shlib-undefined.s =================================================================== --- lld/trunk/test/ELF/allow-shlib-undefined.s +++ lld/trunk/test/ELF/allow-shlib-undefined.s @@ -6,9 +6,12 @@ # RUN: %p/Inputs/allow-shlib-undefined.s -o %t1.o # RUN: ld.lld -shared %t1.o -o %t.so -# RUN: ld.lld %t.o %t.so -o /dev/null # RUN: ld.lld --allow-shlib-undefined %t.o %t.so -o /dev/null # RUN: not ld.lld --no-allow-shlib-undefined %t.o %t.so -o /dev/null 2>&1 | FileCheck %s +# Executable defaults to --no-allow-shlib-undefined +# RUN: not ld.lld %t.o %t.so -o /dev/null 2>&1 | FileCheck %s +# -shared defaults to --allow-shlib-undefined +# RUN: ld.lld -shared %t.o %t.so -o /dev/null # RUN: echo | llvm-mc -filetype=obj -triple=x86_64-unknown-linux -o %tempty.o # RUN: ld.lld -shared %tempty.o -o %tempty.so Index: lld/trunk/test/ELF/pr34872.s =================================================================== --- lld/trunk/test/ELF/pr34872.s +++ lld/trunk/test/ELF/pr34872.s @@ -3,7 +3,7 @@ # RUN: llvm-mc %p/Inputs/undefined-error.s -filetype=obj \ # RUN: -triple=x86_64-pc-linux -o %t2.o # RUN: ld.lld -shared %t2.o -o %t2.so -# RUN: not ld.lld %t2.so %t.o -o /dev/null 2>&1 | FileCheck %s +# RUN: not ld.lld --allow-shlib-undefined %t2.so %t.o -o /dev/null 2>&1 | FileCheck %s # CHECK: undefined symbol: fmod # Check we're not emitting other diagnostics for this symbol. Index: lld/trunk/test/ELF/unresolved-symbols.s =================================================================== --- lld/trunk/test/ELF/unresolved-symbols.s +++ lld/trunk/test/ELF/unresolved-symbols.s @@ -27,21 +27,21 @@ # ERRUND: >>> referenced by {{.*}}:(.text+0x1) ## Also ignore all should not produce error for symbols from DSOs. -# RUN: ld.lld %t1.o %t.so -o %t1_3 --unresolved-symbols=ignore-all +# RUN: ld.lld %t1.o %t.so -o %t1_3 --allow-shlib-undefined --unresolved-symbols=ignore-all # RUN: llvm-readobj %t1_3 > /dev/null 2>&1 ## Ignoring undefines in objects should not produce error for symbol from object. # RUN: ld.lld %t1.o %t2.o -o %t2 --unresolved-symbols=ignore-in-object-files # RUN: llvm-readobj %t2 > /dev/null 2>&1 ## And still should not should produce for undefines from DSOs. -# RUN: ld.lld %t1.o %t.so -o /dev/null --unresolved-symbols=ignore-in-object-files +# RUN: ld.lld %t1.o %t.so -o /dev/null --allow-shlib-undefined --unresolved-symbols=ignore-in-object-files # RUN: llvm-readobj %t2 > /dev/null 2>&1 ## Ignoring undefines in shared should produce error for symbol from object. # RUN: not ld.lld %t2.o -o /dev/null --unresolved-symbols=ignore-in-shared-libs 2>&1 | \ # RUN: FileCheck -check-prefix=ERRUND %s ## And should not produce errors for symbols from DSO. -# RUN: ld.lld %t1.o %t.so -o %t3_1 --unresolved-symbols=ignore-in-shared-libs +# RUN: ld.lld %t1.o %t.so -o %t3_1 --allow-shlib-undefined --unresolved-symbols=ignore-in-shared-libs # RUN: llvm-readobj %t3_1 > /dev/null 2>&1 ## Ignoring undefines in shared libs should not produce error for symbol from object