aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Kwan <dougkwan@google.com>2009-10-15 18:17:48 +0000
committerDoug Kwan <dougkwan@google.com>2009-10-15 18:17:48 +0000
commitf15f61a7f344161a8e23cd995d15d7382f738b9d (patch)
tree5d66abb8f886926bd701383fddfa1302351d0e3b
parent58ad35c45378c160247790f352257b7af03b0fdd (diff)
downloadgdb-f15f61a7f344161a8e23cd995d15d7382f738b9d.zip
gdb-f15f61a7f344161a8e23cd995d15d7382f738b9d.tar.gz
gdb-f15f61a7f344161a8e23cd995d15d7382f738b9d.tar.bz2
2009-10-15 Doug Kwan <dougkwan@google.com>
* layout.cc (Layout::finish_dynamic_section): Generate tags DT_FINI_ARRAY, DT_FINI_ARRAYSZ, DT_INIT_ARRAY, DT_INIT_ARRAYSZ, DT_PREINIT_ARRAY, DT_PREINIT_ARRAYSZ as needed. If -Bsymbolic is used, add DT_SYMBOLIC and set DF_SYMBOLIC in DT_FLAGS.
-rw-r--r--gold/ChangeLog7
-rw-r--r--gold/layout.cc31
2 files changed, 36 insertions, 2 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index f5b1fd5..b69da9f 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,10 @@
+2009-10-15 Doug Kwan <dougkwan@google.com>
+
+ * layout.cc (Layout::finish_dynamic_section): Generate tags
+ DT_FINI_ARRAY, DT_FINI_ARRAYSZ, DT_INIT_ARRAY, DT_INIT_ARRAYSZ,
+ DT_PREINIT_ARRAY, DT_PREINIT_ARRAYSZ as needed. If -Bsymbolic is
+ used, add DT_SYMBOLIC and set DF_SYMBOLIC in DT_FLAGS.
+
2009-10-14 Ian Lance Taylor <iant@google.com>
* object.h (class Relocate_info): Add reloc_shdr and data_shdr
diff --git a/gold/layout.cc b/gold/layout.cc
index 2496530..ad3ee1b 100644
--- a/gold/layout.cc
+++ b/gold/layout.cc
@@ -3104,8 +3104,29 @@ Layout::finish_dynamic_section(const Input_objects* input_objects,
if (sym != NULL && sym->is_defined() && !sym->is_from_dynobj())
odyn->add_symbol(elfcpp::DT_FINI, sym);
- // FIXME: Support DT_INIT_ARRAY and DT_FINI_ARRAY.
-
+ // Look for .init_array, .preinit_array and .fini_array by checking
+ // section types.
+ for(Layout::Section_list::const_iterator p = this->section_list_.begin();
+ p != this->section_list_.end();
+ ++p)
+ switch((*p)->type())
+ {
+ case elfcpp::SHT_FINI_ARRAY:
+ odyn->add_section_address(elfcpp::DT_FINI_ARRAY, *p);
+ odyn->add_section_size(elfcpp::DT_FINI_ARRAYSZ, *p);
+ break;
+ case elfcpp::SHT_INIT_ARRAY:
+ odyn->add_section_address(elfcpp::DT_INIT_ARRAY, *p);
+ odyn->add_section_size(elfcpp::DT_INIT_ARRAYSZ, *p);
+ break;
+ case elfcpp::SHT_PREINIT_ARRAY:
+ odyn->add_section_address(elfcpp::DT_PREINIT_ARRAY, *p);
+ odyn->add_section_size(elfcpp::DT_PREINIT_ARRAYSZ, *p);
+ break;
+ default:
+ break;
+ }
+
// Add a DT_RPATH entry if needed.
const General_options::Dir_list& rpath(parameters->options().rpath());
if (!rpath.empty())
@@ -3186,6 +3207,12 @@ Layout::finish_dynamic_section(const Input_objects* input_objects,
flags |= elfcpp::DF_STATIC_TLS;
if (parameters->options().origin())
flags |= elfcpp::DF_ORIGIN;
+ if (parameters->options().Bsymbolic())
+ {
+ flags |= elfcpp::DF_SYMBOLIC;
+ // Add DT_SYMBOLIC for compatibility with older loaders.
+ odyn->add_constant(elfcpp::DT_SYMBOLIC, 0);
+ }
if (parameters->options().now())
flags |= elfcpp::DF_BIND_NOW;
odyn->add_constant(elfcpp::DT_FLAGS, flags);