elfcpp/
authorDavid S. Miller <davem@redhat.com>
Wed, 16 Apr 2008 23:21:01 +0000 (23:21 +0000)
committerDavid S. Miller <davem@redhat.com>
Wed, 16 Apr 2008 23:21:01 +0000 (23:21 +0000)
* elfcpp.h (DF_1_NOW, DF_1_GLOBAL, DF_1_GROUP,
DF_1_NODELETE, DF_1_LOADFLTR, DF_1_INITFIRST,
DF_1_NOOPEN, DF_1_ORIGIN, DF_1_DIRECT, DF_1_TRANS,
DF_1_INTERPOSE, DF_1_NODEFLIB, DF_1_NODUMP,
DF_1_CONLFAT): New enum constants.

gold/

* options.h (DEFINE_enable): New macro.
(new_dtags): New enable option.
(initfirst, interpose, loadfltr, nodefaultlib,
nodelete, nodlopen, nodump): New -z options.
* layout.cc (Layout:finish_dynamic_section): If new
dtags enabled, emit DT_RUNPATH.  Also, emit a
DT_FLAGS_1 containing any specified -z flags.

elfcpp/ChangeLog
elfcpp/elfcpp.h
gold/ChangeLog
gold/layout.cc
gold/options.h

index 588620c2436134ae34838532954679e3d302e0ce..c543d830a14b47286b106374cc78fcc85a701a79 100644 (file)
@@ -1,3 +1,11 @@
+2008-04-16  David S. Miller  <davem@davemloft.net>
+
+       * elfcpp.h (DF_1_NOW, DF_1_GLOBAL, DF_1_GROUP,
+       DF_1_NODELETE, DF_1_LOADFLTR, DF_1_INITFIRST,
+       DF_1_NOOPEN, DF_1_ORIGIN, DF_1_DIRECT, DF_1_TRANS,
+       DF_1_INTERPOSE, DF_1_NODEFLIB, DF_1_NODUMP,
+       DF_1_CONLFAT): New enum constants.
+
 2008-04-15  David S. Miller  <davem@davemloft.net>
 
        * sparc.h (EF_SPARC_EXT_MASK, EF_SPARC_32PLUS_MASK,
index b2ccbf569c0b6ca1e363e3f77858b3fd7f8d3884..a2a72521f685cbf05dca1a32fef61ae7d5c005c6 100644 (file)
@@ -688,6 +688,26 @@ enum DF
   DF_STATIC_TLS = 0x10
 };
 
+// Flags found in the DT_FLAGS_1 dynamic element.
+
+enum DF_1
+{
+  DF_1_NOW = 0x1,
+  DF_1_GLOBAL = 0x2,
+  DF_1_GROUP = 0x4,
+  DF_1_NODELETE = 0x8,
+  DF_1_LOADFLTR = 0x10,
+  DF_1_INITFIRST = 0x20,
+  DF_1_NOOPEN = 0x40,
+  DF_1_ORIGIN = 0x80,
+  DF_1_DIRECT = 0x100,
+  DF_1_TRANS = 0x200,
+  DF_1_INTERPOSE = 0x400,
+  DF_1_NODEFLIB = 0x800,
+  DF_1_NODUMP = 0x1000,
+  DF_1_CONLFAT = 0x2000,
+};
+
 // Version numbers which appear in the vd_version field of a Verdef
 // structure.
 
index 4d1a2505d5a108c48bfb1191dacb0151d18e9b56..7a34ffe5d7fa731673e8044a94eec25d1b548825 100644 (file)
@@ -1,3 +1,13 @@
+2008-04-16  David S. Miller  <davem@davemloft.net>
+
+       * options.h (DEFINE_enable): New macro.
+       (new_dtags): New enable option.
+       (initfirst, interpose, loadfltr, nodefaultlib,
+       nodelete, nodlopen, nodump): New -z options.
+       * layout.cc (Layout:finish_dynamic_section): If new
+       dtags enabled, emit DT_RUNPATH.  Also, emit a
+       DT_FLAGS_1 containing any specified -z flags.
+
 2008-04-16  Ian Lance Taylor  <iant@google.com>
 
        * copy-relocs.cc: New file.
index 76b6b2be8d109d544c84212e6ab3c0312a1749c0..fa0d4c8598300fe77c9d853cb2bee556e749055f 100644 (file)
@@ -2459,6 +2459,8 @@ Layout::finish_dynamic_section(const Input_objects* input_objects,
         }
 
       odyn->add_string(elfcpp::DT_RPATH, rpath_val);
+      if (parameters->options().enable_new_dtags())
+       odyn->add_string(elfcpp::DT_RUNPATH, rpath_val);
     }
 
   // Look for text segments that have dynamic relocations.
@@ -2509,6 +2511,28 @@ Layout::finish_dynamic_section(const Input_objects* input_objects,
   if (parameters->options().shared() && this->has_static_tls())
     flags |= elfcpp::DF_STATIC_TLS;
   odyn->add_constant(elfcpp::DT_FLAGS, flags);
+
+  flags = 0;
+  if (parameters->options().initfirst())
+    flags |= elfcpp::DF_1_INITFIRST;
+  if (parameters->options().interpose())
+    flags |= elfcpp::DF_1_INTERPOSE;
+  if (parameters->options().loadfltr())
+    flags |= elfcpp::DF_1_LOADFLTR;
+  if (parameters->options().nodefaultlib())
+    flags |= elfcpp::DF_1_NODEFLIB;
+  if (parameters->options().nodelete())
+    flags |= elfcpp::DF_1_NODELETE;
+  if (parameters->options().nodlopen())
+    flags |= elfcpp::DF_1_NOOPEN;
+  if (parameters->options().nodump())
+    flags |= elfcpp::DF_1_NODUMP;
+  if (!parameters->options().shared())
+    flags &= ~(elfcpp::DF_1_INITFIRST
+              | elfcpp::DF_1_NODELETE
+              | elfcpp::DF_1_NOOPEN);
+  if (flags)
+    odyn->add_constant(elfcpp::DT_FLAGS_1, flags);
 }
 
 // The mapping of .gnu.linkonce section names to real section names.
index e17c40f83204cb21e4d3c0add8edd6031450ffb9..2c71fae936ad623b17b170653e571b514afb8726 100644 (file)
@@ -286,6 +286,28 @@ struct Struct_special : public Struct_var
   };                                                                     \
   Struct_no_##varname__ no_##varname__##_initializer_
 
+#define DEFINE_enable(varname__, dashes__, shortname__, default_value__, \
+                      helpstring__, no_helpstring__)                     \
+  DEFINE_var(enable_##varname__, dashes__, shortname__, default_value__, \
+             default_value__ ? "true" : "false", helpstring__, NULL,     \
+             false, bool, bool, options::parse_bool)                    \
+  struct Struct_disable_##varname__ : public options::Struct_var         \
+  {                                                                      \
+    Struct_disable_##varname__() : option("disable-" #varname__,         \
+                                     dashes__, '\0',                     \
+                                     default_value__ ? "false" : "true", \
+                                     no_helpstring__, NULL, false, this) \
+    { }                                                                  \
+                                                                         \
+    void                                                                 \
+    parse_to_value(const char*, const char*,                             \
+                   Command_line*, General_options* options)              \
+    { options->set_enable_##varname__(false); }                          \
+                                                                         \
+    options::One_option option;                                          \
+  };                                                                     \
+  Struct_disable_##varname__ disable_##varname__##_initializer_
+
 #define DEFINE_uint(varname__, dashes__, shortname__, default_value__,  \
                    helpstring__, helparg__)                             \
   DEFINE_var(varname__, dashes__, shortname__, default_value__,         \
@@ -538,6 +560,10 @@ class General_options
   DEFINE_string(m, options::EXACTLY_ONE_DASH, 'm', "",
                 N_("Ignored for compatibility"), N_("EMULATION"));
 
+  DEFINE_enable(new_dtags, options::EXACTLY_TWO_DASHES, '\0', false,
+               N_("Enable use of DT_RUNPATH and DT_FLAGS"),
+               N_("Disable use of DT_RUNPATH and DT_FLAGS"));
+
   DEFINE_bool(noinhibit_exec, options::TWO_DASHES, '\0', false,
              N_("Create an output file even if errors occur"), NULL);
 
@@ -653,6 +679,27 @@ class General_options
                 N_("Set maximum page size to SIZE"), N_("SIZE"));
   DEFINE_bool(noexecstack, options::DASH_Z, '\0', false,
               N_("Mark output as not requiring executable stack"), NULL);
+  DEFINE_bool(initfirst, options::DASH_Z, '\0', false,
+             N_("Mark DSO to be initialized first at runtime"),
+             NULL);
+  DEFINE_bool(interpose, options::DASH_Z, '\0', false,
+             N_("Mark object to interpose all DSOs but executable"),
+             NULL);
+  DEFINE_bool(loadfltr, options::DASH_Z, '\0', false,
+             N_("Mark object requiring immediate process"),
+             NULL);
+  DEFINE_bool(nodefaultlib, options::DASH_Z, '\0', false,
+             N_("Mark object not to use default search paths"),
+             NULL);
+  DEFINE_bool(nodelete, options::DASH_Z, '\0', false,
+             N_("Mark DSO non-deletable at runtime"),
+             NULL);
+  DEFINE_bool(nodlopen, options::DASH_Z, '\0', false,
+             N_("Mark DSO not available to dlopen"),
+             NULL);
+  DEFINE_bool(nodump, options::DASH_Z, '\0', false,
+             N_("Mark DSO not available to dldump"),
+             NULL);
 
  public:
   typedef options::Dir_list Dir_list;