[lld] r352943 - [ELF] Default to --no-allow-shlib-undefined for executables

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 1 16:34:28 PST 2019


Author: maskray
Date: Fri Feb  1 16:34:28 2019
New Revision: 352943

URL: http://llvm.org/viewvc/llvm-project?rev=352943&view=rev
Log:
[ELF] Default to --no-allow-shlib-undefined for executables

Summary:
This follows the ld.bfd/gold behavior.

The error check is useful as it captures a common type of ld.so undefined symbol errors as link-time errors:

    // a.cc => a.so (not linked with -z defs)
    void f(); // f is undefined
    void g() { f(); }

    // b.cc => executable with a DT_NEEDED entry on a.so
    void g();
    int main() { g(); }

    // ld.so errors when g() is executed (lazy binding) or when the program is started (-z now)
    // symbol lookup error: ... undefined symbol: f

Reviewers: ruiu, grimar, pcc, espindola

Reviewed By: ruiu

Subscribers: llvm-commits, emaste, arichardson

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D57569

Modified:
    lld/trunk/ELF/Driver.cpp
    lld/trunk/ELF/Options.td
    lld/trunk/docs/ld.lld.1
    lld/trunk/test/ELF/allow-shlib-undefined.s
    lld/trunk/test/ELF/pr34872.s
    lld/trunk/test/ELF/unresolved-symbols.s

Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=352943&r1=352942&r2=352943&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Fri Feb  1 16:34:28 2019
@@ -756,8 +756,9 @@ void LinkerDriver::readConfigs(opt::Inpu
       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);

Modified: lld/trunk/ELF/Options.td
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Options.td?rev=352943&r1=352942&r2=352943&view=diff
==============================================================================
--- lld/trunk/ELF/Options.td (original)
+++ lld/trunk/ELF/Options.td Fri Feb  1 16:34:28 2019
@@ -64,8 +64,8 @@ defm allow_multiple_definition: B<"allow
     "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",

Modified: lld/trunk/docs/ld.lld.1
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/docs/ld.lld.1?rev=352943&r1=352942&r2=352943&view=diff
==============================================================================
--- lld/trunk/docs/ld.lld.1 (original)
+++ lld/trunk/docs/ld.lld.1 Fri Feb  1 16:34:28 2019
@@ -46,6 +46,9 @@ as a native linker as well as a cross li
 .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 @@ Set target emulation.
 .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

Modified: lld/trunk/test/ELF/allow-shlib-undefined.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/allow-shlib-undefined.s?rev=352943&r1=352942&r2=352943&view=diff
==============================================================================
--- lld/trunk/test/ELF/allow-shlib-undefined.s (original)
+++ lld/trunk/test/ELF/allow-shlib-undefined.s Fri Feb  1 16:34:28 2019
@@ -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

Modified: lld/trunk/test/ELF/pr34872.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/pr34872.s?rev=352943&r1=352942&r2=352943&view=diff
==============================================================================
--- lld/trunk/test/ELF/pr34872.s (original)
+++ lld/trunk/test/ELF/pr34872.s Fri Feb  1 16:34:28 2019
@@ -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.

Modified: lld/trunk/test/ELF/unresolved-symbols.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/unresolved-symbols.s?rev=352943&r1=352942&r2=352943&view=diff
==============================================================================
--- lld/trunk/test/ELF/unresolved-symbols.s (original)
+++ lld/trunk/test/ELF/unresolved-symbols.s Fri Feb  1 16:34:28 2019
@@ -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




More information about the llvm-commits mailing list