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.
This commit is contained in:
Cary Coutant 2014-03-10 13:33:20 -07:00
parent ce15efd88c
commit 98ff923154
3 changed files with 57 additions and 0 deletions

View File

@ -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

View File

@ -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)

View File

@ -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.