diff options
author | Cary Coutant <ccoutant@google.com> | 2014-03-10 13:33:20 -0700 |
---|---|---|
committer | Cary Coutant <ccoutant@google.com> | 2014-03-10 13:33:20 -0700 |
commit | 98ff9231545f9ba7221ad64ec1ff17cf52cafc07 (patch) | |
tree | ad1b708df3ac5802a174404b804ef096222f0a64 /gold | |
parent | ce15efd88c41c2b323ef37aed9c24f0557d8b2ca (diff) | |
download | fsf-binutils-gdb-98ff9231545f9ba7221ad64ec1ff17cf52cafc07.zip fsf-binutils-gdb-98ff9231545f9ba7221ad64ec1ff17cf52cafc07.tar.gz fsf-binutils-gdb-98ff9231545f9ba7221ad64ec1ff17cf52cafc07.tar.bz2 |
Allow target to set dynsym indexes.
2014-03-10 Sasa Stankovic <Sasa.Stankovic@imgtec.com>
gold/
* symtab.cc (Symbol_table::set_dynsym_indexes): Allow a target to set
dynsym indexes.
* target.h (Target::has_custom_set_dynsym_indexes): New function.
(Target::do_has_custom_set_dynsym_indexes): New function.
(Target::set_dynsym_indexes): New function.
(Target::do_set_dynsym_indexes): New function.
Diffstat (limited to 'gold')
-rw-r--r-- | gold/ChangeLog | 9 | ||||
-rw-r--r-- | gold/symtab.cc | 19 | ||||
-rw-r--r-- | gold/target.h | 29 |
3 files changed, 57 insertions, 0 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index ddf18d6..2727bac 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,12 @@ +2014-03-10 Sasa Stankovic <Sasa.Stankovic@imgtec.com> + + * symtab.cc (Symbol_table::set_dynsym_indexes): Allow a target to set + dynsym indexes. + * target.h (Target::has_custom_set_dynsym_indexes): New function. + (Target::do_has_custom_set_dynsym_indexes): New function. + (Target::set_dynsym_indexes): New function. + (Target::do_set_dynsym_indexes): New function. + 2014-03-07 Alan Modra <amodra@gmail.com> * powerpc.cc (Powerpc_relocate_functions::Overflow_check): Add diff --git a/gold/symtab.cc b/gold/symtab.cc index 363653e..87173b2 100644 --- a/gold/symtab.cc +++ b/gold/symtab.cc @@ -2371,6 +2371,25 @@ Symbol_table::set_dynsym_indexes(unsigned int index, { std::vector<Symbol*> as_needed_sym; + // Allow a target to set dynsym indexes. + if (parameters->target().has_custom_set_dynsym_indexes()) + { + std::vector<Symbol*> dyn_symbols; + for (Symbol_table_type::iterator p = this->table_.begin(); + p != this->table_.end(); + ++p) + { + Symbol* sym = p->second; + if (!sym->should_add_dynsym_entry(this)) + sym->set_dynsym_index(-1U); + else + dyn_symbols.push_back(sym); + } + + return parameters->target().set_dynsym_indexes(&dyn_symbols, index, syms, + dynpool, versions, this); + } + for (Symbol_table_type::iterator p = this->table_.begin(); p != this->table_.end(); ++p) diff --git a/gold/target.h b/gold/target.h index 8dabc28..1be300a 100644 --- a/gold/target.h +++ b/gold/target.h @@ -36,6 +36,7 @@ #include "elfcpp.h" #include "options.h" #include "parameters.h" +#include "stringpool.h" #include "debug.h" namespace gold @@ -61,6 +62,7 @@ class Output_section; class Input_objects; class Task; struct Symbol_location; +class Versions; // The abstract class for target specific handling. @@ -453,6 +455,21 @@ class Target entry_symbol_name() const { return this->pti_->entry_symbol_name; } + // Whether the target has a custom set_dynsym_indexes method. + bool + has_custom_set_dynsym_indexes() const + { return this->do_has_custom_set_dynsym_indexes(); } + + // Custom set_dynsym_indexes method for a target. + unsigned int + set_dynsym_indexes(std::vector<Symbol*>* dyn_symbols, unsigned int index, + std::vector<Symbol*>* syms, Stringpool* dynpool, + Versions* versions, Symbol_table* symtab) const + { + return this->do_set_dynsym_indexes(dyn_symbols, index, syms, dynpool, + versions, symtab); + } + protected: // This struct holds the constant information for a child class. We // use a struct to avoid the overhead of virtual function calls for @@ -724,6 +741,18 @@ class Target do_gc_mark_symbol(Symbol_table*, Symbol*) const { } + // This may be overridden by the child class. + virtual bool + do_has_custom_set_dynsym_indexes() const + { return false; } + + // This may be overridden by the child class. + virtual unsigned int + do_set_dynsym_indexes(std::vector<Symbol*>*, unsigned int, + std::vector<Symbol*>*, Stringpool*, Versions*, + Symbol_table*) 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. |