* gold/incremental.cc (Sized_incremental_binary::do_process_got_plt):
Use abstract base class for GOT. * gold/output.h (class Output_data_got_base): New abstract base class. (class Output_data_got): Derive from new base class, adjust ctors. (Output_data_got::reserve_slot): Make virtual; rename to do_reserve_slot; Adjust callers. * gold/target.h (Sized_target::init_got_plt_for_update): Return pointer to abstract base class. * gold/x86_64.cc (Target_x86_64::init_got_plt_for_update): Likewise.
This commit is contained in:
parent
41f402b626
commit
dd74ae0671
@ -1,3 +1,15 @@
|
||||
2012-01-03 Cary Coutant <ccoutant@google.com>
|
||||
|
||||
* gold/incremental.cc (Sized_incremental_binary::do_process_got_plt):
|
||||
Use abstract base class for GOT.
|
||||
* gold/output.h (class Output_data_got_base): New abstract base class.
|
||||
(class Output_data_got): Derive from new base class, adjust ctors.
|
||||
(Output_data_got::reserve_slot): Make virtual; rename to
|
||||
do_reserve_slot; Adjust callers.
|
||||
* gold/target.h (Sized_target::init_got_plt_for_update): Return
|
||||
pointer to abstract base class.
|
||||
* gold/x86_64.cc (Target_x86_64::init_got_plt_for_update): Likewise.
|
||||
|
||||
2011-12-18 Ian Lance Taylor <iant@google.com>
|
||||
|
||||
* object.h (Relobj::local_symbol_value): New function.
|
||||
|
@ -632,7 +632,7 @@ Sized_incremental_binary<size, big_endian>::do_process_got_plt(
|
||||
// Tell the target how big the GOT and PLT sections are.
|
||||
unsigned int got_count = got_plt_reader.get_got_entry_count();
|
||||
unsigned int plt_count = got_plt_reader.get_plt_entry_count();
|
||||
Output_data_got<size, big_endian>* got =
|
||||
Output_data_got_base* got =
|
||||
target->init_got_plt_for_update(symtab, layout, got_count, plt_count);
|
||||
|
||||
// Read the GOT entries from the base file and build the outgoing GOT.
|
||||
|
@ -1582,7 +1582,7 @@ Output_data_got<size, big_endian>::reserve_local(
|
||||
unsigned int sym_index,
|
||||
unsigned int got_type)
|
||||
{
|
||||
this->reserve_slot(i);
|
||||
this->do_reserve_slot(i);
|
||||
object->set_local_got_offset(sym_index, got_type, this->got_offset(i));
|
||||
}
|
||||
|
||||
@ -1595,7 +1595,7 @@ Output_data_got<size, big_endian>::reserve_global(
|
||||
Symbol* gsym,
|
||||
unsigned int got_type)
|
||||
{
|
||||
this->reserve_slot(i);
|
||||
this->do_reserve_slot(i);
|
||||
gsym->set_got_offset(got_type, this->got_offset(i));
|
||||
}
|
||||
|
||||
|
@ -2151,19 +2151,41 @@ class Output_data_group : public Output_section_data
|
||||
// needed. The GOT_SIZE template parameter is the size in bits of a
|
||||
// GOT entry, typically 32 or 64.
|
||||
|
||||
class Output_data_got_base : public Output_section_data_build
|
||||
{
|
||||
public:
|
||||
Output_data_got_base(uint64_t align)
|
||||
: Output_section_data_build(align)
|
||||
{ }
|
||||
|
||||
Output_data_got_base(off_t data_size, uint64_t align)
|
||||
: Output_section_data_build(data_size, align)
|
||||
{ }
|
||||
|
||||
// Reserve the slot at index I in the GOT.
|
||||
void
|
||||
reserve_slot(unsigned int i)
|
||||
{ this->do_reserve_slot(i); }
|
||||
|
||||
protected:
|
||||
// Reserve the slot at index I in the GOT.
|
||||
virtual void
|
||||
do_reserve_slot(unsigned int i) = 0;
|
||||
};
|
||||
|
||||
template<int got_size, bool big_endian>
|
||||
class Output_data_got : public Output_section_data_build
|
||||
class Output_data_got : public Output_data_got_base
|
||||
{
|
||||
public:
|
||||
typedef typename elfcpp::Elf_types<got_size>::Elf_Addr Valtype;
|
||||
|
||||
Output_data_got()
|
||||
: Output_section_data_build(Output_data::default_alignment_for_size(got_size)),
|
||||
: Output_data_got_base(Output_data::default_alignment_for_size(got_size)),
|
||||
entries_(), free_list_()
|
||||
{ }
|
||||
|
||||
Output_data_got(off_t data_size)
|
||||
: Output_section_data_build(data_size,
|
||||
: Output_data_got_base(data_size,
|
||||
Output_data::default_alignment_for_size(got_size)),
|
||||
entries_(), free_list_()
|
||||
{
|
||||
@ -2231,11 +2253,6 @@ class Output_data_got : public Output_section_data_build
|
||||
return got_offset;
|
||||
}
|
||||
|
||||
// Reserve a slot in the GOT.
|
||||
void
|
||||
reserve_slot(unsigned int i)
|
||||
{ this->free_list_.remove(i * got_size / 8, (i + 1) * got_size / 8); }
|
||||
|
||||
// Reserve a slot in the GOT for a local symbol.
|
||||
void
|
||||
reserve_local(unsigned int i, Relobj* object, unsigned int sym_index,
|
||||
@ -2255,6 +2272,11 @@ class Output_data_got : public Output_section_data_build
|
||||
do_print_to_mapfile(Mapfile* mapfile) const
|
||||
{ mapfile->print_output_data(this, _("** GOT")); }
|
||||
|
||||
// Reserve the slot at index I in the GOT.
|
||||
virtual void
|
||||
do_reserve_slot(unsigned int i)
|
||||
{ this->free_list_.remove(i * got_size / 8, (i + 1) * got_size / 8); }
|
||||
|
||||
private:
|
||||
// This POD class holds a single GOT entry.
|
||||
class Got_entry
|
||||
|
@ -56,8 +56,7 @@ template<int size>
|
||||
class Sized_symbol;
|
||||
class Symbol_table;
|
||||
class Output_data;
|
||||
template<int size, bool big_endian>
|
||||
class Output_data_got;
|
||||
class Output_data_got_base;
|
||||
class Output_section;
|
||||
class Input_objects;
|
||||
class Task;
|
||||
@ -845,7 +844,7 @@ class Sized_target : public Target
|
||||
// Create the GOT and PLT sections for an incremental update.
|
||||
// A target needs to implement this to support incremental linking.
|
||||
|
||||
virtual Output_data_got<size, big_endian>*
|
||||
virtual Output_data_got_base*
|
||||
init_got_plt_for_update(Symbol_table*,
|
||||
Layout*,
|
||||
unsigned int /* got_count */,
|
||||
|
@ -425,7 +425,7 @@ class Target_x86_64 : public Sized_target<64, false>
|
||||
plt_entry_size() const;
|
||||
|
||||
// Create the GOT section for an incremental update.
|
||||
Output_data_got<64, false>*
|
||||
Output_data_got_base*
|
||||
init_got_plt_for_update(Symbol_table* symtab,
|
||||
Layout* layout,
|
||||
unsigned int got_count,
|
||||
@ -1463,7 +1463,7 @@ Target_x86_64::plt_entry_size() const
|
||||
|
||||
// Create the GOT and PLT sections for an incremental update.
|
||||
|
||||
Output_data_got<64, false>*
|
||||
Output_data_got_base*
|
||||
Target_x86_64::init_got_plt_for_update(Symbol_table* symtab,
|
||||
Layout* layout,
|
||||
unsigned int got_count,
|
||||
|
Loading…
Reference in New Issue
Block a user