[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