summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--elfcpp/ChangeLog8
-rw-r--r--elfcpp/elfcpp.h20
-rw-r--r--gold/ChangeLog10
-rw-r--r--gold/layout.cc24
-rw-r--r--gold/options.h47
5 files changed, 109 insertions, 0 deletions
diff --git a/elfcpp/ChangeLog b/elfcpp/ChangeLog
index 588620c243..c543d830a1 100644
--- a/elfcpp/ChangeLog
+++ b/elfcpp/ChangeLog
@@ -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,
diff --git a/elfcpp/elfcpp.h b/elfcpp/elfcpp.h
index b2ccbf569c..a2a72521f6 100644
--- a/elfcpp/elfcpp.h
+++ b/elfcpp/elfcpp.h
@@ -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.
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 4d1a2505d5..7a34ffe5d7 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -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.
diff --git a/gold/layout.cc b/gold/layout.cc
index 76b6b2be8d..fa0d4c8598 100644
--- a/gold/layout.cc
+++ b/gold/layout.cc
@@ -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.
diff --git a/gold/options.h b/gold/options.h
index e17c40f832..2c71fae936 100644
--- a/gold/options.h
+++ b/gold/options.h
@@ -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;