[lld] r273998 - [ELF] - Implemented --no-undefined-version flag

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 28 01:07:27 PDT 2016


Author: grimar
Date: Tue Jun 28 03:07:26 2016
New Revision: 273998

URL: http://llvm.org/viewvc/llvm-project?rev=273998&view=rev
Log:
[ELF] - Implemented --no-undefined-version flag

Option checks for cases where a version script explicitly lists
a symbol, but the symbol is not defined and errors out such
cases if any.

Differential revision: http://reviews.llvm.org/D21745

Added:
    lld/trunk/test/ELF/version-script-noundef.s
Modified:
    lld/trunk/ELF/Config.h
    lld/trunk/ELF/Driver.cpp
    lld/trunk/ELF/Options.td
    lld/trunk/ELF/SymbolTable.cpp

Modified: lld/trunk/ELF/Config.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=273998&r1=273997&r2=273998&view=diff
==============================================================================
--- lld/trunk/ELF/Config.h (original)
+++ lld/trunk/ELF/Config.h Tue Jun 28 03:07:26 2016
@@ -86,6 +86,7 @@ struct Configuration {
   bool Mips64EL = false;
   bool NoGnuUnique;
   bool NoUndefined;
+  bool NoUndefinedVersion;
   bool NoinhibitExec;
   bool Pic;
   bool Pie;

Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=273998&r1=273997&r2=273998&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Tue Jun 28 03:07:26 2016
@@ -331,6 +331,7 @@ void LinkerDriver::readConfigs(opt::Inpu
   Config->ICF = Args.hasArg(OPT_icf);
   Config->NoGnuUnique = Args.hasArg(OPT_no_gnu_unique);
   Config->NoUndefined = Args.hasArg(OPT_no_undefined);
+  Config->NoUndefinedVersion = Args.hasArg(OPT_no_undefined_version);
   Config->NoinhibitExec = Args.hasArg(OPT_noinhibit_exec);
   Config->Pie = Args.hasArg(OPT_pie);
   Config->PrintGcSections = Args.hasArg(OPT_print_gc_sections);

Modified: lld/trunk/ELF/Options.td
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Options.td?rev=273998&r1=273997&r2=273998&view=diff
==============================================================================
--- lld/trunk/ELF/Options.td (original)
+++ lld/trunk/ELF/Options.td Tue Jun 28 03:07:26 2016
@@ -108,6 +108,9 @@ def noinhibit_exec: F<"noinhibit-exec">,
 def no_undefined: F<"no-undefined">,
   HelpText<"Report unresolved symbols even if the linker is creating a shared library">;
 
+def no_undefined_version: F<"no-undefined-version">,
+  HelpText<"Report version scripts that refer undefined symbols">;
+
 def o: JoinedOrSeparate<["-"], "o">, MetaVarName<"<path>">,
   HelpText<"Path to file to write output">;
 
@@ -234,7 +237,6 @@ def no_copy_dt_needed_entries: F<"no-cop
 def no_dynamic_linker: F<"no-dynamic-linker">;
 def no_fatal_warnings: F<"no-fatal-warnings">;
 def no_mmap_output_file: F<"no-mmap-output-file">;
-def no_undefined_version: F<"no-undefined-version">;
 def no_warn_common: F<"no-warn-common">;
 def no_warn_mismatch: F<"no-warn-mismatch">;
 def rpath_link: S<"rpath-link">;

Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=273998&r1=273997&r2=273998&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Tue Jun 28 03:07:26 2016
@@ -530,13 +530,20 @@ template <class ELFT> void SymbolTable<E
   // assign version references for each symbol.
   size_t I = 2;
   for (Version &V : Config->SymbolVersions) {
-    for (StringRef Name : V.Globals)
-      if (SymbolBody *B = find(Name)) {
-        if (B->symbol()->VersionId != VER_NDX_GLOBAL &&
-            B->symbol()->VersionId != VER_NDX_LOCAL)
-          warning("duplicate symbol " + Name + " in version script");
-        B->symbol()->VersionId = I;
+    for (StringRef Name : V.Globals) {
+      SymbolBody *B = find(Name);
+      if (!B || B->isUndefined()) {
+        if (Config->NoUndefinedVersion)
+          error("version script assignment of " + V.Name + " to symbol " +
+                Name + " failed: symbol not defined");
+        continue;
       }
+
+      if (B->symbol()->VersionId != VER_NDX_GLOBAL &&
+          B->symbol()->VersionId != VER_NDX_LOCAL)
+        warning("duplicate symbol " + Name + " in version script");
+      B->symbol()->VersionId = I;
+    }
     ++I;
   }
 }

Added: lld/trunk/test/ELF/version-script-noundef.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/version-script-noundef.s?rev=273998&view=auto
==============================================================================
--- lld/trunk/test/ELF/version-script-noundef.s (added)
+++ lld/trunk/test/ELF/version-script-noundef.s Tue Jun 28 03:07:26 2016
@@ -0,0 +1,22 @@
+# REQUIRES: x86
+
+# RUN: echo "VERSION_1.0{    \
+# RUN:          global: bar; \
+# RUN:       };" > %t.script
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+# RUN: not ld.lld --version-script %t.script -shared --no-undefined-version \
+# RUN:   %t.o -o %t.so 2>&1 | FileCheck -check-prefix=ERR1 %s
+# ERR1: version script assignment of VERSION_1.0 to symbol bar failed: symbol not defined
+
+# RUN: echo "VERSION_1.0{    \
+# RUN:          global: und; \
+# RUN:       };" > %t2.script
+# RUN: not ld.lld --version-script %t2.script -shared --no-undefined-version \
+# RUN:   %t.o -o %t.so 2>&1 | FileCheck -check-prefix=ERR2 %s
+# ERR2: version script assignment of VERSION_1.0 to symbol und failed: symbol not defined
+
+.text
+.globl foo
+.type foo, at function
+foo:
+callq und at PLT




More information about the llvm-commits mailing list