aboutsummaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@google.com>2014-03-10 13:34:53 -0700
committerCary Coutant <ccoutant@google.com>2014-03-10 13:34:53 -0700
commit918fc1f8d23c634227c871b67ccb4ed32d0df83c (patch)
treea3904ecadd4c4da6a0b94509be387d622fbda540 /gold
parent98ff9231545f9ba7221ad64ec1ff17cf52cafc07 (diff)
downloadgdb-918fc1f8d23c634227c871b67ccb4ed32d0df83c.zip
gdb-918fc1f8d23c634227c871b67ccb4ed32d0df83c.tar.gz
gdb-918fc1f8d23c634227c871b67ccb4ed32d0df83c.tar.bz2
Allow target to add custom dynamic table entries.
2014-03-10 Sasa Stankovic <Sasa.Stankovic@imgtec.com> 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.
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog11
-rw-r--r--gold/output.cc4
-rw-r--r--gold/output.h14
-rw-r--r--gold/target.h10
4 files changed, 38 insertions, 1 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 2727bac..c29eb1e 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,4 +1,15 @@
2014-03-10 Sasa Stankovic <Sasa.Stankovic@imgtec.com>
+
+ * 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 <Sasa.Stankovic@imgtec.com>
* symtab.cc (Symbol_table::set_dynsym_indexes): Allow a target to set
dynsym indexes.
diff --git a/gold/output.cc b/gold/output.cc
index 29cca5d..c078fbb 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 1f4b27d..ba0cdaa 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 1be300a..bd51250 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.