[lld] r249551 - [ELF2] -z now option implemented

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 7 08:00:22 PDT 2015


Author: grimar
Date: Wed Oct  7 10:00:21 2015
New Revision: 249551

URL: http://llvm.org/viewvc/llvm-project?rev=249551&view=rev
Log:
[ELF2] -z now option implemented

When generating an executable or shared library, mark it to tell the dynamic linker to resolve all symbols when the program is started, or when the shared library is linked to using dlopen, instead of deferring function call resolution to the point when the function is first called.

Differential Revision: http://reviews.llvm.org/D13468

Added:
    lld/trunk/test/elf2/now.s
Modified:
    lld/trunk/ELF/Config.h
    lld/trunk/ELF/Driver.cpp
    lld/trunk/ELF/Options.td
    lld/trunk/ELF/OutputSections.cpp

Modified: lld/trunk/ELF/Config.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=249551&r1=249550&r2=249551&view=diff
==============================================================================
--- lld/trunk/ELF/Config.h (original)
+++ lld/trunk/ELF/Config.h Wed Oct  7 10:00:21 2015
@@ -44,6 +44,7 @@ struct Configuration {
   bool ExportDynamic;
   bool NoInhibitExec;
   bool NoUndefined;
+  bool ZNow = false;
   bool Shared;
   bool Static = false;
   bool WholeArchive = false;

Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=249551&r1=249550&r2=249551&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Wed Oct  7 10:00:21 2015
@@ -186,6 +186,11 @@ void LinkerDriver::link(ArrayRef<const c
   Config->NoUndefined = Args.hasArg(OPT_no_undefined);
   Config->Shared = Args.hasArg(OPT_shared);
 
+  for (auto *Arg : Args.filtered(OPT_z)) {
+    if (Arg->getValue() == StringRef("now"))
+      Config->ZNow = true;
+  }
+
   for (auto *Arg : Args) {
     switch (Arg->getOption().getID()) {
     case OPT_l:

Modified: lld/trunk/ELF/Options.td
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Options.td?rev=249551&r1=249550&r2=249551&view=diff
==============================================================================
--- lld/trunk/ELF/Options.td (original)
+++ lld/trunk/ELF/Options.td Wed Oct  7 10:00:21 2015
@@ -82,6 +82,9 @@ def undefined : Joined<["--"], "undefine
 def whole_archive : Flag<["--"], "whole-archive">,
   HelpText<"Force load of all members in a static library">;
 
+def z : JoinedOrSeparate<["-"], "z">, MetaVarName<"<option>">,
+  HelpText<"Linker option extensions">;
+
 // Aliases
 def alias_Bdynamic_call_shared: Flag<["-"], "call_shared">, Alias<Bdynamic>;
 def alias_Bdynamic_dy: Flag<["-"], "dy">, Alias<Bdynamic>;
@@ -114,4 +117,3 @@ def no_fatal_warnings : Flag<["--"], "no
 def start_group : Flag<["--"], "start-group">;
 def strip_all : Flag<["--"], "strip-all">;
 def version_script : Separate<["--"], "version-script">;
-def z : Separate<["-"], "z">;

Modified: lld/trunk/ELF/OutputSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=249551&r1=249550&r2=249551&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.cpp (original)
+++ lld/trunk/ELF/OutputSections.cpp Wed Oct  7 10:00:21 2015
@@ -269,6 +269,8 @@ template <class ELFT> void DynamicSectio
     ++NumEntries; // DT_INIT
   if (FiniSym)
     ++NumEntries; // DT_FINI
+  if (Config->ZNow)
+    ++NumEntries; // DT_FLAGS_1
 
   ++NumEntries; // DT_NULL
 
@@ -341,6 +343,9 @@ template <class ELFT> void DynamicSectio
   if (FiniSym)
     WritePtr(DT_FINI, getSymVA(*FiniSym, BssSec));
 
+  if (Config->ZNow)
+    WriteVal(DT_FLAGS_1, DF_1_NOW);
+
   WriteVal(DT_NULL, 0);
 }
 

Added: lld/trunk/test/elf2/now.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/now.s?rev=249551&view=auto
==============================================================================
--- lld/trunk/test/elf2/now.s (added)
+++ lld/trunk/test/elf2/now.s Wed Oct  7 10:00:21 2015
@@ -0,0 +1,19 @@
+# REQUIRES: x86
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
+# RUN: lld -flavor gnu2 -shared %t -o %t.so
+# RUN: lld -flavor gnu2 -z now %t %t.so -o %t1
+# RUN: lld -flavor gnu2 %t %t.so -o %t2
+# RUN: llvm-readobj -dynamic-table %t1 | FileCheck -check-prefix=NOW %s
+# RUN: llvm-readobj -dynamic-table %t2 | FileCheck %s
+
+# NOW: DynamicSection [
+# NOW:   0x000000006FFFFFFB FLAGS_1 NOW
+# NOW: ]
+
+# CHECK: DynamicSection [
+# CHECK-NOT:   0x000000006FFFFFFB FLAGS_1 NOW
+# CHECK: ]
+
+.globl _start
+_start:




More information about the llvm-commits mailing list