From 918fc1f8d23c634227c871b67ccb4ed32d0df83c Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Mon, 10 Mar 2014 13:34:53 -0700 Subject: [PATCH] Allow target to add custom dynamic table entries. 2014-03-10 Sasa Stankovic gold/ * output.cc (Output_data_dynamic::Dynamic_entry::write): Get the value of DYNAMIC_CUSTOM dynamic entry. * output.h (Output_data_dynamic::add_custom): New function. (Dynamic_entry::Dynamic_entry): New constructor for DYNAMIC_CUSTOM dynamic entry. (enum Dynamic_entry::Classification): Add DYNAMIC_CUSTOM. * target.h (Target::dynamic_tag_custom_value): New function. (Target::do_dynamic_tag_custom_value): New function. --- gold/ChangeLog | 11 +++++++++++ gold/output.cc | 4 ++++ gold/output.h | 14 +++++++++++++- gold/target.h | 10 ++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 2727bacc926..c29eb1e2c97 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,14 @@ +2014-03-10 Sasa Stankovic + + * output.cc (Output_data_dynamic::Dynamic_entry::write): + Get the value of DYNAMIC_CUSTOM dynamic entry. + * output.h (Output_data_dynamic::add_custom): New function. + (Dynamic_entry::Dynamic_entry): New constructor for DYNAMIC_CUSTOM + dynamic entry. + (enum Dynamic_entry::Classification): Add DYNAMIC_CUSTOM. + * target.h (Target::dynamic_tag_custom_value): New function. + (Target::do_dynamic_tag_custom_value): New function. + 2014-03-10 Sasa Stankovic * symtab.cc (Symbol_table::set_dynsym_indexes): Allow a target to set diff --git a/gold/output.cc b/gold/output.cc index 29cca5dc35c..c078fbb64d1 100644 --- a/gold/output.cc +++ b/gold/output.cc @@ -1796,6 +1796,10 @@ Output_data_dynamic::Dynamic_entry::write( val = pool->get_offset(this->u_.str); break; + case DYNAMIC_CUSTOM: + val = parameters->target().dynamic_tag_custom_value(this->tag_); + break; + default: val = this->u_.od->address() + this->offset_; break; diff --git a/gold/output.h b/gold/output.h index 1f4b27df659..ba0cdaabda9 100644 --- a/gold/output.h +++ b/gold/output.h @@ -2577,6 +2577,11 @@ class Output_data_dynamic : public Output_section_data add_string(elfcpp::DT tag, const std::string& str) { this->add_string(tag, str.c_str()); } + // Add a new dynamic entry with custom value. + void + add_custom(elfcpp::DT tag) + { this->add_entry(Dynamic_entry(tag)); } + protected: // Adjust the output section to set the entry size. void @@ -2641,6 +2646,11 @@ class Output_data_dynamic : public Output_section_data : tag_(tag), offset_(DYNAMIC_STRING) { this->u_.str = str; } + // Create an entry with a custom value. + Dynamic_entry(elfcpp::DT tag) + : tag_(tag), offset_(DYNAMIC_CUSTOM) + { } + // Return the tag of this entry. elfcpp::DT tag() const @@ -2664,7 +2674,9 @@ class Output_data_dynamic : public Output_section_data // Symbol adress. DYNAMIC_SYMBOL = -3U, // String. - DYNAMIC_STRING = -4U + DYNAMIC_STRING = -4U, + // Custom value. + DYNAMIC_CUSTOM = -5U // Any other value indicates a section address plus OFFSET. }; diff --git a/gold/target.h b/gold/target.h index 1be300af916..bd512501b8f 100644 --- a/gold/target.h +++ b/gold/target.h @@ -470,6 +470,11 @@ class Target versions, symtab); } + // Get the custom dynamic tag value. + unsigned int + dynamic_tag_custom_value(elfcpp::DT tag) const + { return this->do_dynamic_tag_custom_value(tag); } + protected: // This struct holds the constant information for a child class. We // use a struct to avoid the overhead of virtual function calls for @@ -753,6 +758,11 @@ class Target Symbol_table*) const { gold_unreachable(); } + // This may be overridden by the child class. + virtual unsigned int + do_dynamic_tag_custom_value(elfcpp::DT) const + { gold_unreachable(); } + private: // The implementations of the four do_make_elf_object virtual functions are // almost identical except for their sizes and endianness. We use a template. -- 2.30.2