* incremental-dump.cc (dump_incremental_inputs): Print dynamic reloc

info; adjust display of GOT entries.
	* incremental.cc (Sized_incremental_binary::setup_readers): Allocate
	vector of input objects; remove file_status_.
	(Sized_incremental_binary::do_reserve_layout): Remove file_status_.
	(Sized_incremental_binary::do_process_got_plt): Adjust calls to
	got_plt reader; call target hooks to reserve GOT entries.
	(Output_section_incremental_inputs::set_final_data_size): Adjust size
	of input file info header and GOT info entry.
	(Output_section_incremental_inputs::write_info_blocks): Write dynamic
	relocation info.
	(Got_plt_view_info::got_descriptor): Remove.
	(Got_plt_view_info::sym_index): New data member.
	(Got_plt_view_info::input_index): New data member.
	(Local_got_offset_visitor::visit): Write input file index.
	(Global_got_offset_visitor::visit): Write 0 for input file index.
	(Global_symbol_visitor_got_plt::operator()): Replace got_descriptor
	with sym_index and input_index.
	(Output_section_incremental_inputs::write_got_plt): Adjust size of
	incremental info GOT entry; replace got_descriptor with input_index.
	(Sized_relobj_incr::Sized_relobj_incr): Adjust initializers; record
	map from input file index to object.
	(Sized_relobj_incr::do_layout): Replace direct data member reference
	with accessor function.
	(Sized_relobj_incr::do_for_all_local_got_entries): Move to base class.
	* incremental.h (Incremental_input_entry_reader::get_symbol_offset):
	Adjust size of input file info header.
	(Incremental_input_entry_reader::get_first_dyn_reloc): New function.
	(Incremental_input_entry_reader::get_dyn_reloc_count): New function.
	(Incremental_input_entry_reader::get_input_section): Adjust size of
	input file info header.
	(Incremental_got_plt_reader::Incremental_got_plt_reader): Adjust size
	of incremental info GOT entry.
	(Incremental_got_plt_reader::get_got_desc): Remove.
	(Incremental_got_plt_reader::get_got_symndx): New function.
	(Incremental_got_plt_reader::get_got_input_index): New function.
	(Sized_incremental_binary::Sized_incremental_binary): Remove
	file_status_; add input_objects_.
	(Sized_incremental_binary::~Sized_incremental_binary): Remove.
	(Sized_incremental_binary::set_file_is_unchanged): Remove.
	(Sized_incremental_binary::file_is_unchanged): Remove.
	(Sized_incremental_binary::set_input_object): New function.
	(Sized_incremental_binary::input_object): New function.
	(Sized_incremental_binary::file_status_): Remove.
	(Sized_incremental_binary::input_objects_): New data member.
	(Sized_relobj_incr): Rename Sized_incr_relobj to this; adjust all
	references.
	(Sized_relobj_incr::invalid_address): Move to base class.
	(Sized_relobj_incr::is_output_section_offset_invalid): Move to base
	class.
	(Sized_relobj_incr::do_output_section_offset): Likewise.
	(Sized_relobj_incr::do_for_all_local_got_entries): Likewise.
	(Sized_relobj_incr::section_offsets_): Likewise.
	* object.cc (Sized_relobj::do_for_all_local_got_entries): New
	function.
	(Sized_relobj_file::Sized_relobj_file): Remove local_got_offsets_.
	(Sized_relobj_file::layout_section): Replace refs to section_offsets_
	with accessor function.
	(Sized_relobj_file::do_layout): Likewise.
	(Sized_relobj_file::do_layout_deferred_sections): Likewise.
	(Sized_relobj_file::do_for_all_local_got_entries): Move to base class.
	(Sized_relobj_file::compute_final_local_value): Replace refs to
	section_offsets_ with accessor function.
	(Sized_relobj_file::do_finalize_local_symbols): Likewise.
	* object.h (Relobj::Relobj): Initialize new data members.
	(Relobj::add_dyn_reloc): New function.
	(Relobj::first_dyn_reloc): New function.
	(Relobj::dyn_reloc_count): New function.
	(Relobj::first_dyn_reloc_): New data member.
	(Relobj::dyn_reloc_count_): New data member.
	(Sized_relobj): Rename Sized_relobj_base to this; adjust all
	references.
	(Sized_relobj::Address): New typedef.
	(Sized_relobj::invalid_address): Move here from child class.
	(Sized_relobj::Sized_relobj): Initialize new data members.
	(Sized_relobj::sized_relobj): New function.
	(Sized_relobj::is_output_section_offset_invalid): Move here from
	child class.
	(Sized_relobj::get_output_section_offset): Likewise.
	(Sized_relobj::local_has_got_offset): Likewise.
	(Sized_relobj::local_got_offset): Likewise.
	(Sized_relobj::set_local_got_offset): Likewise.
	(Sized_relobj::do_for_all_local_got_entries): Likewise.
	(Sized_relobj::clear_got_offsets): New function.
	(Sized_relobj::section_offsets): Move here from child class.
	(Sized_relobj::do_output_section_offset): Likewise.
	(Sized_relobj::do_set_section_offset): Likewise.
	(Sized_relobj::Local_got_offsets): Likewise.
	(Sized_relobj::local_got_offsets_): Likewise.
	(Sized_relobj::section_offsets_): Likewise.
	(Sized_relobj_file): Rename Sized_relobj to this; adjust all
	references.
	(Sized_relobj_file::is_output_section_offset_invalid): Move to base
	class.
	(Sized_relobj_file::sized_relobj): New function
	(Sized_relobj_file::local_has_got_offset): Move to base class.
	(Sized_relobj_file::local_got_offset): Likewise.
	(Sized_relobj_file::set_local_got_offset): Likewise.
	(Sized_relobj_file::get_output_section_offset): Likewise.
	(Sized_relobj_file::do_for_all_local_got_entries): Likewise.
	(Sized_relobj_file::do_output_section_offset): Likewise.
	(Sized_relobj_file::do_set_section_offset): Likewise.
	(Sized_relobj_file::Local_got_offsets): Likewise.
	(Sized_relobj_file::local_got_offsets_): Likewise.
	(Sized_relobj_file::section_offsets_): Likewise.
	* output.cc (Output_reloc::Output_reloc): Adjust type of relobj
	(all constructors).
	(set_needs_dynsym_index): Convert relobj to derived class pointer.
	(Output_reloc::get_symbol_index): Likewise.
	(Output_reloc::local_section_offset): Likewise.
	(Output_reloc::get_address): Likewise.
	(Output_reloc::symbol_value): Likewise.
	(Output_data_got::reserve_slot): Move to class definition.
	(Output_data_got::reserve_local): New function.
	(Output_data_got::reserve_slot_for_global): Remove.
	(Output_data_got::reserve_global): New function.
	* output.h (Output_reloc::Output_reloc): Adjust type of relobj
	(all constructors, two instantiations).
	(Output_reloc::get_relobj): New function (two instantiations).
	(Output_reloc::u1_.relobj, Output_reloc::u2_.relobj): Adjust type.
	(Output_data_reloc_base::add): Convert relobj to derived class pointer.
	(Output_data_reloc::add_global): Adjust type of relobj.
	(Output_data_reloc::add_global_relative): Likewise.
	(Output_data_reloc::add_symbolless_global_addend): Likewise.
	(Output_data_reloc::add_local): Likewise.
	(Output_data_reloc::add_local_relative): Likewise.
	(Output_data_reloc::add_symbolless_local_addend): Likewise.
	(Output_data_reloc::add_local_section): Likewise.
	(Output_data_reloc::add_output_section): Likewise.
	(Output_data_reloc::add_absolute): Likewise.
	(Output_data_reloc::add_target_specific): Likewise.
	(Output_data_got::reserve_slot): Move definition here.
	(Output_data_got::reserve_local): New function.
	(Output_data_got::reserve_global): New function.
	* reloc.cc (Sized_relobj_file::do_read_relocs): Replace refs to
	section_offsets_ with accessor function.
	(Sized_relobj_file::write_sections): Likewise.
	(Sized_relobj_file::do_relocate_sections): Likewise.
	* target.h (Sized_target::reserve_local_got_entry): New function.
	(Sized_target::reserve_global_got_entry): New function.
	* x86_64.cc (Target_x86_64::reserve_local_got_entry): New function.
	(Target_x86_64::reserve_global_got_entry): New function.
	(Target_x86_64::init_got_plt_for_update): Create rela_dyn section.
This commit is contained in:
Cary Coutant 2011-05-24 21:41:10 +00:00
parent 2e21250dbc
commit 6fa2a40bf4
32 changed files with 1265 additions and 874 deletions

View File

@ -1,3 +1,149 @@
2011-05-24 Cary Coutant <ccoutant@google.com>
* incremental-dump.cc (dump_incremental_inputs): Print dynamic reloc
info; adjust display of GOT entries.
* incremental.cc (Sized_incremental_binary::setup_readers): Allocate
vector of input objects; remove file_status_.
(Sized_incremental_binary::do_reserve_layout): Remove file_status_.
(Sized_incremental_binary::do_process_got_plt): Adjust calls to
got_plt reader; call target hooks to reserve GOT entries.
(Output_section_incremental_inputs::set_final_data_size): Adjust size
of input file info header and GOT info entry.
(Output_section_incremental_inputs::write_info_blocks): Write dynamic
relocation info.
(Got_plt_view_info::got_descriptor): Remove.
(Got_plt_view_info::sym_index): New data member.
(Got_plt_view_info::input_index): New data member.
(Local_got_offset_visitor::visit): Write input file index.
(Global_got_offset_visitor::visit): Write 0 for input file index.
(Global_symbol_visitor_got_plt::operator()): Replace got_descriptor
with sym_index and input_index.
(Output_section_incremental_inputs::write_got_plt): Adjust size of
incremental info GOT entry; replace got_descriptor with input_index.
(Sized_relobj_incr::Sized_relobj_incr): Adjust initializers; record
map from input file index to object.
(Sized_relobj_incr::do_layout): Replace direct data member reference
with accessor function.
(Sized_relobj_incr::do_for_all_local_got_entries): Move to base class.
* incremental.h (Incremental_input_entry_reader::get_symbol_offset):
Adjust size of input file info header.
(Incremental_input_entry_reader::get_first_dyn_reloc): New function.
(Incremental_input_entry_reader::get_dyn_reloc_count): New function.
(Incremental_input_entry_reader::get_input_section): Adjust size of
input file info header.
(Incremental_got_plt_reader::Incremental_got_plt_reader): Adjust size
of incremental info GOT entry.
(Incremental_got_plt_reader::get_got_desc): Remove.
(Incremental_got_plt_reader::get_got_symndx): New function.
(Incremental_got_plt_reader::get_got_input_index): New function.
(Sized_incremental_binary::Sized_incremental_binary): Remove
file_status_; add input_objects_.
(Sized_incremental_binary::~Sized_incremental_binary): Remove.
(Sized_incremental_binary::set_file_is_unchanged): Remove.
(Sized_incremental_binary::file_is_unchanged): Remove.
(Sized_incremental_binary::set_input_object): New function.
(Sized_incremental_binary::input_object): New function.
(Sized_incremental_binary::file_status_): Remove.
(Sized_incremental_binary::input_objects_): New data member.
(Sized_relobj_incr): Rename Sized_incr_relobj to this; adjust all
references.
(Sized_relobj_incr::invalid_address): Move to base class.
(Sized_relobj_incr::is_output_section_offset_invalid): Move to base
class.
(Sized_relobj_incr::do_output_section_offset): Likewise.
(Sized_relobj_incr::do_for_all_local_got_entries): Likewise.
(Sized_relobj_incr::section_offsets_): Likewise.
* object.cc (Sized_relobj::do_for_all_local_got_entries): New
function.
(Sized_relobj_file::Sized_relobj_file): Remove local_got_offsets_.
(Sized_relobj_file::layout_section): Replace refs to section_offsets_
with accessor function.
(Sized_relobj_file::do_layout): Likewise.
(Sized_relobj_file::do_layout_deferred_sections): Likewise.
(Sized_relobj_file::do_for_all_local_got_entries): Move to base class.
(Sized_relobj_file::compute_final_local_value): Replace refs to
section_offsets_ with accessor function.
(Sized_relobj_file::do_finalize_local_symbols): Likewise.
* object.h (Relobj::Relobj): Initialize new data members.
(Relobj::add_dyn_reloc): New function.
(Relobj::first_dyn_reloc): New function.
(Relobj::dyn_reloc_count): New function.
(Relobj::first_dyn_reloc_): New data member.
(Relobj::dyn_reloc_count_): New data member.
(Sized_relobj): Rename Sized_relobj_base to this; adjust all
references.
(Sized_relobj::Address): New typedef.
(Sized_relobj::invalid_address): Move here from child class.
(Sized_relobj::Sized_relobj): Initialize new data members.
(Sized_relobj::sized_relobj): New function.
(Sized_relobj::is_output_section_offset_invalid): Move here from
child class.
(Sized_relobj::get_output_section_offset): Likewise.
(Sized_relobj::local_has_got_offset): Likewise.
(Sized_relobj::local_got_offset): Likewise.
(Sized_relobj::set_local_got_offset): Likewise.
(Sized_relobj::do_for_all_local_got_entries): Likewise.
(Sized_relobj::clear_got_offsets): New function.
(Sized_relobj::section_offsets): Move here from child class.
(Sized_relobj::do_output_section_offset): Likewise.
(Sized_relobj::do_set_section_offset): Likewise.
(Sized_relobj::Local_got_offsets): Likewise.
(Sized_relobj::local_got_offsets_): Likewise.
(Sized_relobj::section_offsets_): Likewise.
(Sized_relobj_file): Rename Sized_relobj to this; adjust all
references.
(Sized_relobj_file::is_output_section_offset_invalid): Move to base
class.
(Sized_relobj_file::sized_relobj): New function
(Sized_relobj_file::local_has_got_offset): Move to base class.
(Sized_relobj_file::local_got_offset): Likewise.
(Sized_relobj_file::set_local_got_offset): Likewise.
(Sized_relobj_file::get_output_section_offset): Likewise.
(Sized_relobj_file::do_for_all_local_got_entries): Likewise.
(Sized_relobj_file::do_output_section_offset): Likewise.
(Sized_relobj_file::do_set_section_offset): Likewise.
(Sized_relobj_file::Local_got_offsets): Likewise.
(Sized_relobj_file::local_got_offsets_): Likewise.
(Sized_relobj_file::section_offsets_): Likewise.
* output.cc (Output_reloc::Output_reloc): Adjust type of relobj
(all constructors).
(set_needs_dynsym_index): Convert relobj to derived class pointer.
(Output_reloc::get_symbol_index): Likewise.
(Output_reloc::local_section_offset): Likewise.
(Output_reloc::get_address): Likewise.
(Output_reloc::symbol_value): Likewise.
(Output_data_got::reserve_slot): Move to class definition.
(Output_data_got::reserve_local): New function.
(Output_data_got::reserve_slot_for_global): Remove.
(Output_data_got::reserve_global): New function.
* output.h (Output_reloc::Output_reloc): Adjust type of relobj
(all constructors, two instantiations).
(Output_reloc::get_relobj): New function (two instantiations).
(Output_reloc::u1_.relobj, Output_reloc::u2_.relobj): Adjust type.
(Output_data_reloc_base::add): Convert relobj to derived class pointer.
(Output_data_reloc::add_global): Adjust type of relobj.
(Output_data_reloc::add_global_relative): Likewise.
(Output_data_reloc::add_symbolless_global_addend): Likewise.
(Output_data_reloc::add_local): Likewise.
(Output_data_reloc::add_local_relative): Likewise.
(Output_data_reloc::add_symbolless_local_addend): Likewise.
(Output_data_reloc::add_local_section): Likewise.
(Output_data_reloc::add_output_section): Likewise.
(Output_data_reloc::add_absolute): Likewise.
(Output_data_reloc::add_target_specific): Likewise.
(Output_data_got::reserve_slot): Move definition here.
(Output_data_got::reserve_local): New function.
(Output_data_got::reserve_global): New function.
* reloc.cc (Sized_relobj_file::do_read_relocs): Replace refs to
section_offsets_ with accessor function.
(Sized_relobj_file::write_sections): Likewise.
(Sized_relobj_file::do_relocate_sections): Likewise.
* target.h (Sized_target::reserve_local_got_entry): New function.
(Sized_target::reserve_global_got_entry): New function.
* x86_64.cc (Target_x86_64::reserve_local_got_entry): New function.
(Target_x86_64::reserve_global_got_entry): New function.
(Target_x86_64::init_got_plt_for_update): Create rela_dyn section.
2011-05-23 Cary Coutant <ccoutant@google.com>
* gold.cc (queue_middle_tasks): Process existing GOT/PLT entries.

View File

@ -1479,14 +1479,14 @@ class Arm_exidx_input_section
// Arm_relobj class.
template<bool big_endian>
class Arm_relobj : public Sized_relobj<32, big_endian>
class Arm_relobj : public Sized_relobj_file<32, big_endian>
{
public:
static const Arm_address invalid_address = static_cast<Arm_address>(-1);
Arm_relobj(const std::string& name, Input_file* input_file, off_t offset,
const typename elfcpp::Ehdr<32, big_endian>& ehdr)
: Sized_relobj<32, big_endian>(name, input_file, offset, ehdr),
: Sized_relobj_file<32, big_endian>(name, input_file, offset, ehdr),
stub_tables_(), local_symbol_is_thumb_function_(),
attributes_section_data_(NULL), mapping_symbols_info_(),
section_has_cortex_a8_workaround_(NULL), exidx_section_map_(),
@ -1657,7 +1657,7 @@ class Arm_relobj : public Sized_relobj<32, big_endian>
do_setup()
{
// Call parent's setup method.
Sized_relobj<32, big_endian>::do_setup();
Sized_relobj_file<32, big_endian>::do_setup();
// Initialize look-up tables.
Stub_table_list empty_stub_table_list(this->shnum(), NULL);
@ -1670,9 +1670,10 @@ class Arm_relobj : public Sized_relobj<32, big_endian>
Stringpool_template<char>*);
void
do_relocate_sections(const Symbol_table* symtab, const Layout* layout,
const unsigned char* pshdrs, Output_file* of,
typename Sized_relobj<32, big_endian>::Views* pivews);
do_relocate_sections(
const Symbol_table* symtab, const Layout* layout,
const unsigned char* pshdrs, Output_file* of,
typename Sized_relobj_file<32, big_endian>::Views* pivews);
// Read the symbol information.
void
@ -1912,7 +1913,8 @@ class Arm_output_data_got : public Output_data_got<32, big_endian>
// relocation that needs to be applied in a static link.
void
add_static_reloc(unsigned int got_offset, unsigned int r_type,
Sized_relobj<32, big_endian>* relobj, unsigned int index)
Sized_relobj_file<32, big_endian>* relobj,
unsigned int index)
{
this->static_relocs_.push_back(Static_reloc(got_offset, r_type, relobj,
index));
@ -1929,7 +1931,7 @@ class Arm_output_data_got : public Output_data_got<32, big_endian>
// Same as the above but for a local symbol in OBJECT with INDEX.
void
add_tls_gd32_with_static_reloc(unsigned int got_type,
Sized_relobj<32, big_endian>* object,
Sized_relobj_file<32, big_endian>* object,
unsigned int index);
protected:
@ -1948,7 +1950,7 @@ class Arm_output_data_got : public Output_data_got<32, big_endian>
{ this->u_.global.symbol = gsym; }
Static_reloc(unsigned int got_offset, unsigned int r_type,
Sized_relobj<32, big_endian>* relobj, unsigned int index)
Sized_relobj_file<32, big_endian>* relobj, unsigned int index)
: got_offset_(got_offset), r_type_(r_type), symbol_is_global_(false)
{
this->u_.local.relobj = relobj;
@ -1979,7 +1981,7 @@ class Arm_output_data_got : public Output_data_got<32, big_endian>
}
// For a relocation against a local symbol, the defining object.
Sized_relobj<32, big_endian>*
Sized_relobj_file<32, big_endian>*
relobj() const
{
gold_assert(!this->symbol_is_global_);
@ -2012,7 +2014,7 @@ class Arm_output_data_got : public Output_data_got<32, big_endian>
struct
{
// For a local symbol, the object defining object.
Sized_relobj<32, big_endian>* relobj;
Sized_relobj_file<32, big_endian>* relobj;
// For a local symbol, the symbol index.
unsigned int index;
} local;
@ -2274,7 +2276,7 @@ class Target_arm : public Sized_target<32, big_endian>
void
gc_process_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<32, big_endian>* object,
Sized_relobj_file<32, big_endian>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -2288,7 +2290,7 @@ class Target_arm : public Sized_target<32, big_endian>
void
scan_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<32, big_endian>* object,
Sized_relobj_file<32, big_endian>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -2324,7 +2326,7 @@ class Target_arm : public Sized_target<32, big_endian>
void
scan_relocatable_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<32, big_endian>* object,
Sized_relobj_file<32, big_endian>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -2565,7 +2567,7 @@ class Target_arm : public Sized_target<32, big_endian>
inline void
local(Symbol_table* symtab, Layout* layout, Target_arm* target,
Sized_relobj<32, big_endian>* object,
Sized_relobj_file<32, big_endian>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
@ -2573,7 +2575,7 @@ class Target_arm : public Sized_target<32, big_endian>
inline void
global(Symbol_table* symtab, Layout* layout, Target_arm* target,
Sized_relobj<32, big_endian>* object,
Sized_relobj_file<32, big_endian>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
@ -2581,7 +2583,7 @@ class Target_arm : public Sized_target<32, big_endian>
inline bool
local_reloc_may_be_function_pointer(Symbol_table* , Layout* , Target_arm* ,
Sized_relobj<32, big_endian>* ,
Sized_relobj_file<32, big_endian>* ,
unsigned int ,
Output_section* ,
const elfcpp::Rel<32, big_endian>& ,
@ -2590,7 +2592,7 @@ class Target_arm : public Sized_target<32, big_endian>
inline bool
global_reloc_may_be_function_pointer(Symbol_table* , Layout* , Target_arm* ,
Sized_relobj<32, big_endian>* ,
Sized_relobj_file<32, big_endian>* ,
unsigned int ,
Output_section* ,
const elfcpp::Rel<32, big_endian>& ,
@ -2598,11 +2600,11 @@ class Target_arm : public Sized_target<32, big_endian>
private:
static void
unsupported_reloc_local(Sized_relobj<32, big_endian>*,
unsupported_reloc_local(Sized_relobj_file<32, big_endian>*,
unsigned int r_type);
static void
unsupported_reloc_global(Sized_relobj<32, big_endian>*,
unsupported_reloc_global(Sized_relobj_file<32, big_endian>*,
unsigned int r_type, Symbol*);
void
@ -2744,7 +2746,7 @@ class Target_arm : public Sized_target<32, big_endian>
// Create a GOT entry for the TLS module index.
unsigned int
got_mod_index_entry(Symbol_table* symtab, Layout* layout,
Sized_relobj<32, big_endian>* object);
Sized_relobj_file<32, big_endian>* object);
// Get the PLT section.
const Output_data_plt_arm<big_endian>*
@ -2775,7 +2777,7 @@ class Target_arm : public Sized_target<32, big_endian>
// Add a potential copy relocation.
void
copy_reloc(Symbol_table* symtab, Layout* layout,
Sized_relobj<32, big_endian>* object,
Sized_relobj_file<32, big_endian>* object,
unsigned int shndx, Output_section* output_section,
Symbol* sym, const elfcpp::Rel<32, big_endian>& reloc)
{
@ -3208,7 +3210,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_ABS8: S + A
static inline typename This::Status
abs8(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval)
{
typedef typename elfcpp::Swap<8, big_endian>::Valtype Valtype;
@ -3230,7 +3232,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_THM_ABS5: S + A
static inline typename This::Status
thm_abs5(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval)
{
typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
@ -3252,7 +3254,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_ABS12: S + A
static inline typename This::Status
abs12(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval)
{
typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
@ -3271,7 +3273,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_ABS16: S + A
static inline typename This::Status
abs16(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval)
{
typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
@ -3290,7 +3292,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_ABS32: (S + A) | T
static inline typename This::Status
abs32(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval,
Arm_address thumb_bit)
{
@ -3305,7 +3307,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_REL32: (S + A) | T - P
static inline typename This::Status
rel32(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval,
Arm_address address,
Arm_address thumb_bit)
@ -3327,7 +3329,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_THM_JUMP6: S + A P
static inline typename This::Status
thm_jump6(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval,
Arm_address address)
{
@ -3349,7 +3351,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_THM_JUMP8: S + A P
static inline typename This::Status
thm_jump8(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval,
Arm_address address)
{
@ -3368,7 +3370,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_THM_JUMP11: S + A P
static inline typename This::Status
thm_jump11(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval,
Arm_address address)
{
@ -3425,7 +3427,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_PREL: (S + A) | T - P
static inline typename This::Status
prel31(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval,
Arm_address address,
Arm_address thumb_bit)
@ -3447,7 +3449,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_MOVW_BREL: ((S + A) | T) - B(S)
static inline typename This::Status
movw(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval,
Arm_address relative_address_base,
Arm_address thumb_bit,
@ -3471,7 +3473,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_MOVT_BREL: S + A - B(S)
static inline typename This::Status
movt(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval,
Arm_address relative_address_base)
{
@ -3492,7 +3494,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_THM_MOVW_BREL: ((S + A) | T) - B(S)
static inline typename This::Status
thm_movw(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval,
Arm_address relative_address_base,
Arm_address thumb_bit,
@ -3519,7 +3521,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_THM_MOVT_BREL: S + A - B(S)
static inline typename This::Status
thm_movt(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval,
Arm_address relative_address_base)
{
@ -3539,7 +3541,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_THM_ALU_PREL_11_0: ((S + A) | T) - Pa (Thumb32)
static inline typename This::Status
thm_alu11(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval,
Arm_address address,
Arm_address thumb_bit)
@ -3593,7 +3595,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_THM_PC8: S + A - Pa (Thumb)
static inline typename This::Status
thm_pc8(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval,
Arm_address address)
{
@ -3615,7 +3617,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_THM_PC12: S + A - Pa (Thumb32)
static inline typename This::Status
thm_pc12(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval,
Arm_address address)
{
@ -3700,7 +3702,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_ALU_SB_G2: ((S + A) | T) - B(S)
static inline typename This::Status
arm_grp_alu(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval,
const int group,
Arm_address address,
@ -3757,7 +3759,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_LDR_SB_G2: S + A - B(S)
static inline typename This::Status
arm_grp_ldr(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval,
const int group,
Arm_address address)
@ -3795,7 +3797,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_LDRS_SB_G2: S + A - B(S)
static inline typename This::Status
arm_grp_ldrs(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval,
const int group,
Arm_address address)
@ -3833,7 +3835,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian>
// R_ARM_LDC_SB_G2: S + A - B(S)
static inline typename This::Status
arm_grp_ldc(unsigned char* view,
const Sized_relobj<32, big_endian>* object,
const Sized_relobj_file<32, big_endian>* object,
const Symbol_value<32>* psymval,
const int group,
Arm_address address)
@ -6340,7 +6342,7 @@ Arm_relobj<big_endian>::scan_sections_for_stubs(
// do_count_local_symbol in parent and scan local symbols to mark
// THUMB functions. This is not the most efficient way but I do not want to
// slow down other ports by calling a per symbol target hook inside
// Sized_relobj<size, big_endian>::do_count_local_symbols.
// Sized_relobj_file<size, big_endian>::do_count_local_symbols.
template<bool big_endian>
void
@ -6352,7 +6354,7 @@ Arm_relobj<big_endian>::do_count_local_symbols(
// STT_ARM_TFUNC.
// Ask parent to count the local symbols.
Sized_relobj<32, big_endian>::do_count_local_symbols(pool, dynpool);
Sized_relobj_file<32, big_endian>::do_count_local_symbols(pool, dynpool);
const unsigned int loccount = this->local_symbol_count();
if (loccount == 0)
return;
@ -6400,7 +6402,7 @@ Arm_relobj<big_endian>::do_count_local_symbols(
// Skip the first dummy symbol.
psyms += sym_size;
typename Sized_relobj<32, big_endian>::Local_values* plocal_values =
typename Sized_relobj_file<32, big_endian>::Local_values* plocal_values =
this->local_values();
for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
{
@ -6443,11 +6445,11 @@ Arm_relobj<big_endian>::do_relocate_sections(
const Layout* layout,
const unsigned char* pshdrs,
Output_file* of,
typename Sized_relobj<32, big_endian>::Views* pviews)
typename Sized_relobj_file<32, big_endian>::Views* pviews)
{
// Call parent to relocate sections.
Sized_relobj<32, big_endian>::do_relocate_sections(symtab, layout, pshdrs,
of, pviews);
Sized_relobj_file<32, big_endian>::do_relocate_sections(symtab, layout,
pshdrs, of, pviews);
// We do not generate stubs if doing a relocatable link.
if (parameters->options().relocatable())
@ -6683,7 +6685,7 @@ void
Arm_relobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
{
// Call parent class to read symbol information.
Sized_relobj<32, big_endian>::do_read_symbols(sd);
Sized_relobj_file<32, big_endian>::do_read_symbols(sd);
// If this input file is a binary file, it has no processor
// specific flags and attributes section.
@ -6843,7 +6845,7 @@ Arm_relobj<big_endian>::do_gc_process_relocs(Symbol_table* symtab,
Read_relocs_data* rd)
{
// First, call base class method to process relocations in this object.
Sized_relobj<32, big_endian>::do_gc_process_relocs(symtab, layout, rd);
Sized_relobj_file<32, big_endian>::do_gc_process_relocs(symtab, layout, rd);
// If --gc-sections is not specified, there is nothing more to do.
// This happens when --icf is used but --gc-sections is not.
@ -6908,7 +6910,7 @@ Arm_relobj<big_endian>::update_output_local_symbol_count()
// Loop over the local symbols.
typedef typename Sized_relobj<32, big_endian>::Output_sections
typedef typename Sized_relobj_file<32, big_endian>::Output_sections
Output_sections;
const Output_sections& out_sections(this->output_sections());
unsigned int shnum = this->shnum();
@ -7089,7 +7091,7 @@ template<bool big_endian>
void
Arm_output_data_got<big_endian>::add_tls_gd32_with_static_reloc(
unsigned int got_type,
Sized_relobj<32, big_endian>* object,
Sized_relobj_file<32, big_endian>* object,
unsigned int index)
{
if (object->local_has_got_offset(index, got_type))
@ -7138,7 +7140,7 @@ Arm_output_data_got<big_endian>::do_write(Output_file* of)
Arm_address value;
if (!reloc.symbol_is_global())
{
Sized_relobj<32, big_endian>* object = reloc.relobj();
Sized_relobj_file<32, big_endian>* object = reloc.relobj();
const Symbol_value<32>* psymval =
reloc.relobj()->local_symbol(reloc.index());
@ -7536,7 +7538,7 @@ unsigned int
Target_arm<big_endian>::got_mod_index_entry(
Symbol_table* symtab,
Layout* layout,
Sized_relobj<32, big_endian>* object)
Sized_relobj_file<32, big_endian>* object)
{
if (this->got_mod_index_offset_ == -1U)
{
@ -7702,7 +7704,7 @@ Target_arm<big_endian>::Scan::get_reference_flags(unsigned int r_type)
template<bool big_endian>
void
Target_arm<big_endian>::Scan::unsupported_reloc_local(
Sized_relobj<32, big_endian>* object,
Sized_relobj_file<32, big_endian>* object,
unsigned int r_type)
{
gold_error(_("%s: unsupported reloc %u against local symbol"),
@ -7770,7 +7772,7 @@ inline void
Target_arm<big_endian>::Scan::local(Symbol_table* symtab,
Layout* layout,
Target_arm* target,
Sized_relobj<32, big_endian>* object,
Sized_relobj_file<32, big_endian>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rel<32, big_endian>& reloc,
@ -8074,7 +8076,7 @@ Target_arm<big_endian>::Scan::local(Symbol_table* symtab,
template<bool big_endian>
void
Target_arm<big_endian>::Scan::unsupported_reloc_global(
Sized_relobj<32, big_endian>* object,
Sized_relobj_file<32, big_endian>* object,
unsigned int r_type,
Symbol* gsym)
{
@ -8116,7 +8118,7 @@ Target_arm<big_endian>::Scan::local_reloc_may_be_function_pointer(
Symbol_table*,
Layout*,
Target_arm<big_endian>* target,
Sized_relobj<32, big_endian>*,
Sized_relobj_file<32, big_endian>*,
unsigned int,
Output_section*,
const elfcpp::Rel<32, big_endian>&,
@ -8133,7 +8135,7 @@ Target_arm<big_endian>::Scan::global_reloc_may_be_function_pointer(
Symbol_table*,
Layout*,
Target_arm<big_endian>* target,
Sized_relobj<32, big_endian>*,
Sized_relobj_file<32, big_endian>*,
unsigned int,
Output_section*,
const elfcpp::Rel<32, big_endian>&,
@ -8155,7 +8157,7 @@ inline void
Target_arm<big_endian>::Scan::global(Symbol_table* symtab,
Layout* layout,
Target_arm* target,
Sized_relobj<32, big_endian>* object,
Sized_relobj_file<32, big_endian>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rel<32, big_endian>& reloc,
@ -8484,17 +8486,18 @@ Target_arm<big_endian>::Scan::global(Symbol_table* symtab,
template<bool big_endian>
void
Target_arm<big_endian>::gc_process_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<32, big_endian>* object,
unsigned int data_shndx,
unsigned int,
const unsigned char* prelocs,
size_t reloc_count,
Output_section* output_section,
bool needs_special_offset_handling,
size_t local_symbol_count,
const unsigned char* plocal_symbols)
Target_arm<big_endian>::gc_process_relocs(
Symbol_table* symtab,
Layout* layout,
Sized_relobj_file<32, big_endian>* object,
unsigned int data_shndx,
unsigned int,
const unsigned char* prelocs,
size_t reloc_count,
Output_section* output_section,
bool needs_special_offset_handling,
size_t local_symbol_count,
const unsigned char* plocal_symbols)
{
typedef Target_arm<big_endian> Arm;
typedef typename Target_arm<big_endian>::Scan Scan;
@ -8520,7 +8523,7 @@ template<bool big_endian>
void
Target_arm<big_endian>::scan_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<32, big_endian>* object,
Sized_relobj_file<32, big_endian>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -9295,7 +9298,7 @@ Target_arm<big_endian>::Relocate::relocate_tls(
typedef Relocate_functions<32, big_endian> RelocFuncs;
Output_segment* tls_segment = relinfo->layout->tls_segment();
const Sized_relobj<32, big_endian>* object = relinfo->object;
const Sized_relobj_file<32, big_endian>* object = relinfo->object;
elfcpp::Elf_types<32>::Elf_Addr value = psymval->value(object, 0);
@ -9501,7 +9504,7 @@ void
Target_arm<big_endian>::scan_relocatable_relocs(
Symbol_table* symtab,
Layout* layout,
Sized_relobj<32, big_endian>* object,
Sized_relobj_file<32, big_endian>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -9977,9 +9980,9 @@ Target_arm<big_endian>::do_adjust_elf_header(
}
// do_make_elf_object to override the same function in the base class.
// We need to use a target-specific sub-class of Sized_relobj<32, big_endian>
// to store ARM specific information. Hence we need to have our own
// ELF object creation.
// We need to use a target-specific sub-class of
// Sized_relobj_file<32, big_endian> to store ARM specific information.
// Hence we need to have our own ELF object creation.
template<bool big_endian>
Object*
@ -11189,7 +11192,7 @@ Target_arm<big_endian>::scan_reloc_section_for_stubs(
// symbol.
if (!is_defined_in_discarded_section)
{
typedef Sized_relobj<32, big_endian> ObjType;
typedef Sized_relobj_file<32, big_endian> ObjType;
typename ObjType::Compute_final_local_value_status status =
arm_object->compute_final_local_value(r_sym, psymval, &symval,
relinfo->symtab);

View File

@ -58,7 +58,7 @@ Copy_relocs<sh_type, size, big_endian>::copy_reloc(
Symbol_table* symtab,
Layout* layout,
Sized_symbol<size>* sym,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int shndx,
Output_section* output_section,
const Reloc& rel,
@ -81,7 +81,7 @@ template<int sh_type, int size, bool big_endian>
bool
Copy_relocs<sh_type, size, big_endian>::need_copy_reloc(
Sized_symbol<size>* sym,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int shndx) const
{
if (!parameters->options().copyreloc())
@ -190,7 +190,7 @@ template<int sh_type, int size, bool big_endian>
void
Copy_relocs<sh_type, size, big_endian>::save(
Symbol* sym,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int shndx,
Output_section* output_section,
const Reloc& rel)

View File

@ -66,7 +66,7 @@ class Copy_relocs
// section is where the dynamic relocs are put.
void
copy_reloc(Symbol_table*, Layout*, Sized_symbol<size>* sym,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int shndx, Output_section* output_section,
const Reloc& rel,
Output_data_reloc<sh_type, true, size, big_endian>*);
@ -92,7 +92,7 @@ class Copy_relocs
{
public:
Copy_reloc_entry(Symbol* sym, unsigned int reloc_type,
Sized_relobj<size, big_endian>* relobj,
Sized_relobj_file<size, big_endian>* relobj,
unsigned int shndx,
Output_section* output_section,
Address address, Addend addend)
@ -110,7 +110,7 @@ class Copy_relocs
private:
Symbol* sym_;
unsigned int reloc_type_;
Sized_relobj<size, big_endian>* relobj_;
Sized_relobj_file<size, big_endian>* relobj_;
unsigned int shndx_;
Output_section* output_section_;
Address address_;
@ -123,7 +123,7 @@ class Copy_relocs
// Return whether we need a COPY reloc.
bool
need_copy_reloc(Sized_symbol<size>* gsym,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int shndx) const;
// Emit a COPY reloc.
@ -138,7 +138,7 @@ class Copy_relocs
// Save a reloc against SYM for possible emission later.
void
save(Symbol*, Sized_relobj<size, big_endian>*, unsigned int shndx,
save(Symbol*, Sized_relobj_file<size, big_endian>*, unsigned int shndx,
Output_section*, const Reloc& rel);
// The target specific relocation type of the COPY relocation.

View File

@ -156,7 +156,7 @@ template<int size, bool big_endian>
class Sized_dynobj : public Dynobj
{
public:
typedef typename Sized_relobj<size, big_endian>::Symbols Symbols;
typedef typename Sized_relobj_file<size, big_endian>::Symbols Symbols;
Sized_dynobj(const std::string& name, Input_file* input_file, off_t offset,
const typename elfcpp::Ehdr<size, big_endian>&);

View File

@ -525,7 +525,7 @@ Eh_frame::skip_leb128(const unsigned char** pp, const unsigned char* pend)
template<int size, bool big_endian>
bool
Eh_frame::add_ehframe_input_section(
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
const unsigned char* symbols,
section_size_type symbols_size,
const unsigned char* symbol_names,
@ -588,7 +588,7 @@ Eh_frame::add_ehframe_input_section(
template<int size, bool big_endian>
bool
Eh_frame::do_add_ehframe_input_section(
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
const unsigned char* symbols,
section_size_type symbols_size,
const unsigned char* symbol_names,
@ -675,7 +675,7 @@ Eh_frame::do_add_ehframe_input_section(
template<int size, bool big_endian>
bool
Eh_frame::read_cie(Sized_relobj<size, big_endian>* object,
Eh_frame::read_cie(Sized_relobj_file<size, big_endian>* object,
unsigned int shndx,
const unsigned char* symbols,
section_size_type symbols_size,
@ -929,7 +929,7 @@ Eh_frame::read_cie(Sized_relobj<size, big_endian>* object,
template<int size, bool big_endian>
bool
Eh_frame::read_fde(Sized_relobj<size, big_endian>* object,
Eh_frame::read_fde(Sized_relobj_file<size, big_endian>* object,
unsigned int shndx,
const unsigned char* symbols,
section_size_type symbols_size,
@ -1132,7 +1132,7 @@ Eh_frame::do_sized_write(unsigned char* oview)
template
bool
Eh_frame::add_ehframe_input_section<32, false>(
Sized_relobj<32, false>* object,
Sized_relobj_file<32, false>* object,
const unsigned char* symbols,
section_size_type symbols_size,
const unsigned char* symbol_names,
@ -1146,7 +1146,7 @@ Eh_frame::add_ehframe_input_section<32, false>(
template
bool
Eh_frame::add_ehframe_input_section<32, true>(
Sized_relobj<32, true>* object,
Sized_relobj_file<32, true>* object,
const unsigned char* symbols,
section_size_type symbols_size,
const unsigned char* symbol_names,
@ -1160,7 +1160,7 @@ Eh_frame::add_ehframe_input_section<32, true>(
template
bool
Eh_frame::add_ehframe_input_section<64, false>(
Sized_relobj<64, false>* object,
Sized_relobj_file<64, false>* object,
const unsigned char* symbols,
section_size_type symbols_size,
const unsigned char* symbol_names,
@ -1174,7 +1174,7 @@ Eh_frame::add_ehframe_input_section<64, false>(
template
bool
Eh_frame::add_ehframe_input_section<64, true>(
Sized_relobj<64, true>* object,
Sized_relobj_file<64, true>* object,
const unsigned char* symbols,
section_size_type symbols_size,
const unsigned char* symbol_names,

View File

@ -316,7 +316,7 @@ class Eh_frame : public Output_section_data
// data.
template<int size, bool big_endian>
bool
add_ehframe_input_section(Sized_relobj<size, big_endian>* object,
add_ehframe_input_section(Sized_relobj_file<size, big_endian>* object,
const unsigned char* symbols,
section_size_type symbols_size,
const unsigned char* symbol_names,
@ -382,7 +382,7 @@ class Eh_frame : public Output_section_data
// The implementation of add_ehframe_input_section.
template<int size, bool big_endian>
bool
do_add_ehframe_input_section(Sized_relobj<size, big_endian>* object,
do_add_ehframe_input_section(Sized_relobj_file<size, big_endian>* object,
const unsigned char* symbols,
section_size_type symbols_size,
const unsigned char* symbol_names,
@ -397,7 +397,7 @@ class Eh_frame : public Output_section_data
// Read a CIE.
template<int size, bool big_endian>
bool
read_cie(Sized_relobj<size, big_endian>* object,
read_cie(Sized_relobj_file<size, big_endian>* object,
unsigned int shndx,
const unsigned char* symbols,
section_size_type symbols_size,
@ -413,7 +413,7 @@ class Eh_frame : public Output_section_data
// Read an FDE.
template<int size, bool big_endian>
bool
read_fde(Sized_relobj<size, big_endian>* object,
read_fde(Sized_relobj_file<size, big_endian>* object,
unsigned int shndx,
const unsigned char* symbols,
section_size_type symbols_size,

View File

@ -37,7 +37,7 @@ namespace gold
class Object;
template<int size, bool big_endian>
class Sized_relobj;
class Sized_relobj_file;
template<int sh_type, int size, bool big_endian>
class Reloc_types;
@ -178,7 +178,7 @@ gc_process_relocs(
Symbol_table* symtab,
Layout*,
Target_type* target,
Sized_relobj<size, big_endian>* src_obj,
Sized_relobj_file<size, big_endian>* src_obj,
unsigned int src_indx,
const unsigned char* prelocs,
size_t reloc_count,

View File

@ -60,7 +60,7 @@ class Output_data_plt_i386 : public Output_section_data
// Add an entry to the PLT for a local STT_GNU_IFUNC symbol.
unsigned int
add_local_ifunc_entry(Sized_relobj<32, false>* relobj,
add_local_ifunc_entry(Sized_relobj_file<32, false>* relobj,
unsigned int local_sym_index);
// Return the .rel.plt section data.
@ -133,7 +133,7 @@ class Output_data_plt_i386 : public Output_section_data
// offset in the GOT.
struct Local_ifunc
{
Sized_relobj<32, false>* object;
Sized_relobj_file<32, false>* object;
unsigned int local_sym_index;
unsigned int got_offset;
};
@ -184,7 +184,7 @@ class Target_i386 : public Target_freebsd<32, false>
void
gc_process_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<32, false>* object,
Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -198,7 +198,7 @@ class Target_i386 : public Target_freebsd<32, false>
void
scan_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<32, false>* object,
Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -234,7 +234,7 @@ class Target_i386 : public Target_freebsd<32, false>
void
scan_relocatable_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<32, false>* object,
Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -341,7 +341,7 @@ class Target_i386 : public Target_freebsd<32, false>
inline void
local(Symbol_table* symtab, Layout* layout, Target_i386* target,
Sized_relobj<32, false>* object,
Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rel<32, false>& reloc, unsigned int r_type,
@ -349,7 +349,7 @@ class Target_i386 : public Target_freebsd<32, false>
inline void
global(Symbol_table* symtab, Layout* layout, Target_i386* target,
Sized_relobj<32, false>* object,
Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rel<32, false>& reloc, unsigned int r_type,
@ -358,7 +358,7 @@ class Target_i386 : public Target_freebsd<32, false>
inline bool
local_reloc_may_be_function_pointer(Symbol_table* symtab, Layout* layout,
Target_i386* target,
Sized_relobj<32, false>* object,
Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rel<32, false>& reloc,
@ -368,7 +368,7 @@ class Target_i386 : public Target_freebsd<32, false>
inline bool
global_reloc_may_be_function_pointer(Symbol_table* symtab, Layout* layout,
Target_i386* target,
Sized_relobj<32, false>* object,
Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rel<32, false>& reloc,
@ -379,13 +379,14 @@ class Target_i386 : public Target_freebsd<32, false>
possible_function_pointer_reloc(unsigned int r_type);
bool
reloc_needs_plt_for_ifunc(Sized_relobj<32, false>*, unsigned int r_type);
reloc_needs_plt_for_ifunc(Sized_relobj_file<32, false>*,
unsigned int r_type);
static void
unsupported_reloc_local(Sized_relobj<32, false>*, unsigned int r_type);
unsupported_reloc_local(Sized_relobj_file<32, false>*, unsigned int r_type);
static void
unsupported_reloc_global(Sized_relobj<32, false>*, unsigned int r_type,
unsupported_reloc_global(Sized_relobj_file<32, false>*, unsigned int r_type,
Symbol*);
};
@ -552,7 +553,7 @@ class Target_i386 : public Target_freebsd<32, false>
// Create a PLT entry for a local STT_GNU_IFUNC symbol.
void
make_local_ifunc_plt_entry(Symbol_table*, Layout*,
Sized_relobj<32, false>* relobj,
Sized_relobj_file<32, false>* relobj,
unsigned int local_sym_index);
// Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
@ -562,7 +563,7 @@ class Target_i386 : public Target_freebsd<32, false>
// Create a GOT entry for the TLS module index.
unsigned int
got_mod_index_entry(Symbol_table* symtab, Layout* layout,
Sized_relobj<32, false>* object);
Sized_relobj_file<32, false>* object);
// Get the PLT section.
Output_data_plt_i386*
@ -583,7 +584,7 @@ class Target_i386 : public Target_freebsd<32, false>
// Add a potential copy relocation.
void
copy_reloc(Symbol_table* symtab, Layout* layout,
Sized_relobj<32, false>* object,
Sized_relobj_file<32, false>* object,
unsigned int shndx, Output_section* output_section,
Symbol* sym, const elfcpp::Rel<32, false>& reloc)
{
@ -811,8 +812,9 @@ Output_data_plt_i386::add_entry(Symbol* gsym)
// the PLT offset.
unsigned int
Output_data_plt_i386::add_local_ifunc_entry(Sized_relobj<32, false>* relobj,
unsigned int local_sym_index)
Output_data_plt_i386::add_local_ifunc_entry(
Sized_relobj_file<32, false>* relobj,
unsigned int local_sym_index)
{
unsigned int plt_offset = (this->count_ + 1) * plt_entry_size;
++this->count_;
@ -1046,7 +1048,7 @@ Target_i386::make_plt_entry(Symbol_table* symtab, Layout* layout, Symbol* gsym)
void
Target_i386::make_local_ifunc_plt_entry(Symbol_table* symtab, Layout* layout,
Sized_relobj<32, false>* relobj,
Sized_relobj_file<32, false>* relobj,
unsigned int local_sym_index)
{
if (relobj->local_has_plt_offset(local_sym_index))
@ -1122,7 +1124,7 @@ Target_i386::define_tls_base_symbol(Symbol_table* symtab, Layout* layout)
unsigned int
Target_i386::got_mod_index_entry(Symbol_table* symtab, Layout* layout,
Sized_relobj<32, false>* object)
Sized_relobj_file<32, false>* object)
{
if (this->got_mod_index_offset_ == -1U)
{
@ -1268,7 +1270,7 @@ Target_i386::Scan::get_reference_flags(unsigned int r_type)
// Report an unsupported relocation against a local symbol.
void
Target_i386::Scan::unsupported_reloc_local(Sized_relobj<32, false>* object,
Target_i386::Scan::unsupported_reloc_local(Sized_relobj_file<32, false>* object,
unsigned int r_type)
{
gold_error(_("%s: unsupported reloc %u against local symbol"),
@ -1279,8 +1281,9 @@ Target_i386::Scan::unsupported_reloc_local(Sized_relobj<32, false>* object,
// given type against a STT_GNU_IFUNC symbol.
bool
Target_i386::Scan::reloc_needs_plt_for_ifunc(Sized_relobj<32, false>* object,
unsigned int r_type)
Target_i386::Scan::reloc_needs_plt_for_ifunc(
Sized_relobj_file<32, false>* object,
unsigned int r_type)
{
int flags = Scan::get_reference_flags(r_type);
if (flags & Symbol::TLS_REF)
@ -1295,7 +1298,7 @@ inline void
Target_i386::Scan::local(Symbol_table* symtab,
Layout* layout,
Target_i386* target,
Sized_relobj<32, false>* object,
Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rel<32, false>& reloc,
@ -1597,9 +1600,10 @@ Target_i386::Scan::local(Symbol_table* symtab,
// Report an unsupported relocation against a global symbol.
void
Target_i386::Scan::unsupported_reloc_global(Sized_relobj<32, false>* object,
unsigned int r_type,
Symbol* gsym)
Target_i386::Scan::unsupported_reloc_global(
Sized_relobj_file<32, false>* object,
unsigned int r_type,
Symbol* gsym)
{
gold_error(_("%s: unsupported reloc %u against global symbol %s"),
object->name().c_str(), r_type, gsym->demangled_name().c_str());
@ -1629,7 +1633,7 @@ Target_i386::Scan::local_reloc_may_be_function_pointer(
Symbol_table* ,
Layout* ,
Target_i386* ,
Sized_relobj<32, false>* ,
Sized_relobj_file<32, false>* ,
unsigned int ,
Output_section* ,
const elfcpp::Rel<32, false>& ,
@ -1644,7 +1648,7 @@ Target_i386::Scan::global_reloc_may_be_function_pointer(
Symbol_table* ,
Layout* ,
Target_i386* ,
Sized_relobj<32, false>* ,
Sized_relobj_file<32, false>* ,
unsigned int ,
Output_section* ,
const elfcpp::Rel<32, false>& ,
@ -1660,7 +1664,7 @@ inline void
Target_i386::Scan::global(Symbol_table* symtab,
Layout* layout,
Target_i386* target,
Sized_relobj<32, false>* object,
Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rel<32, false>& reloc,
@ -2025,7 +2029,7 @@ Target_i386::Scan::global(Symbol_table* symtab,
void
Target_i386::gc_process_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<32, false>* object,
Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
unsigned int,
const unsigned char* prelocs,
@ -2056,7 +2060,7 @@ Target_i386::gc_process_relocs(Symbol_table* symtab,
void
Target_i386::scan_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<32, false>* object,
Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -2187,7 +2191,7 @@ Target_i386::Relocate::relocate(const Relocate_info<32, false>* relinfo,
}
}
const Sized_relobj<32, false>* object = relinfo->object;
const Sized_relobj_file<32, false>* object = relinfo->object;
// Pick the value to use for symbols defined in shared objects.
Symbol_value<32> symval;
@ -2388,7 +2392,7 @@ Target_i386::Relocate::relocate_tls(const Relocate_info<32, false>* relinfo,
{
Output_segment* tls_segment = relinfo->layout->tls_segment();
const Sized_relobj<32, false>* object = relinfo->object;
const Sized_relobj_file<32, false>* object = relinfo->object;
elfcpp::Elf_types<32>::Elf_Addr value = psymval->value(object, 0);
@ -3066,7 +3070,7 @@ Target_i386::Relocatable_size_for_reloc::get_size_for_reloc(
void
Target_i386::scan_relocatable_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<32, false>* object,
Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,

View File

@ -149,6 +149,10 @@ dump_incremental_inputs(const char* argv0, const char* filename,
input_file.get_local_symbol_offset());
printf(" Local symbol count: %d\n",
input_file.get_local_symbol_count());
printf(" First dynamic reloc: %d\n",
input_file.get_first_dyn_reloc());
printf(" Dynamic reloc count: %d\n",
input_file.get_dyn_reloc_count());
break;
case INCREMENTAL_INPUT_ARCHIVE:
printf("Archive\n");
@ -368,24 +372,26 @@ dump_incremental_inputs(const char* argv0, const char* filename,
for (unsigned int i = 0; i < ngot; ++i)
{
unsigned int got_type = igot_plt.get_got_type(i);
unsigned int got_desc = igot_plt.get_got_desc(i);
unsigned int got_symndx = igot_plt.get_got_symndx(i);
unsigned int got_input_index = igot_plt.get_got_input_index(i);
printf("[%d] type %02x, ", i, got_type & 0x7f);
if ((got_type & 0x7f) == 0x7f)
printf("reserved");
else if (got_type & 0x80)
{
Entry_reader input_file = incremental_inputs.input_file(got_desc);
Entry_reader input_file =
incremental_inputs.input_file(got_input_index);
const char* objname = input_file.filename();
printf("local: %s (%d)", objname, got_desc);
printf("local: %s (%d)", objname, got_symndx);
}
else
{
sym_p = symtab_view.data() + got_desc * sym_size;
sym_p = symtab_view.data() + got_symndx * sym_size;
elfcpp::Sym<size, big_endian> sym(sym_p);
const char* symname;
if (!strtab.get_c_string(sym.get_st_name(), &symname))
symname = "<unknown>";
printf("global %s (%d)", symname, got_desc);
printf("global %s (%d)", symname, got_symndx);
}
printf("\n");
}

View File

@ -276,6 +276,7 @@ Sized_incremental_binary<size, big_endian>::setup_readers()
// libraries and scripts.
Incremental_inputs_reader<size, big_endian>& inputs = this->inputs_reader_;
unsigned int count = inputs.input_file_count();
this->input_objects_.resize(count);
this->input_entry_readers_.reserve(count);
this->library_map_.resize(count);
this->script_map_.resize(count);
@ -327,10 +328,6 @@ Sized_incremental_binary<size, big_endian>::setup_readers()
unsigned int nglobals = this->symtab_reader_.symbol_count();
this->symbol_map_.resize(nglobals);
// Initialize the status of each input file.
this->file_status_ = new unsigned char[(count + 7) / 8];
memset(this->file_status_, 0, (count + 7) / 8);
this->has_incremental_info_ = true;
}
@ -524,8 +521,6 @@ Sized_incremental_binary<size, big_endian>::do_reserve_layout(
Input_entry_reader input_file =
this->inputs_reader_.input_file(input_file_index);
this->set_file_is_unchanged(input_file_index);
if (input_file.type() == INCREMENTAL_INPUT_SHARED_LIBRARY)
return;
@ -579,29 +574,31 @@ Sized_incremental_binary<size, big_endian>::do_process_got_plt(
got->reserve_slot(i);
continue;
}
unsigned int got_desc = got_plt_reader.get_got_desc(i);
unsigned int symndx = got_plt_reader.get_got_symndx(i);
if (got_type & 0x80)
{
// This is an entry for a local symbol. GOT_DESC is the index
// of the object file entry in the list of input files. Ignore
// this entry if the object file was replaced.
// This is an entry for a local symbol. Ignore this entry if
// the object file was replaced.
unsigned int input_index = got_plt_reader.get_got_input_index(i);
gold_debug(DEBUG_INCREMENTAL,
"GOT entry %d, type %02x: (local symbol)",
i, got_type & 0x7f);
if (this->file_is_unchanged(got_desc))
got->reserve_slot(i);
Sized_relobj_incr<size, big_endian>* obj =
this->input_object(input_index);
if (obj != NULL)
target->reserve_local_got_entry(i, obj, symndx, got_type & 0x7f);
}
else
{
// This is an entry for a global symbol. GOT_DESC is the symbol
// table index.
// FIXME: This should really be a fatal error (corrupt input).
gold_assert(got_desc >= first_global && got_desc < symtab_count);
Symbol* sym = this->global_symbol(got_desc - first_global);
gold_assert(symndx >= first_global && symndx < symtab_count);
Symbol* sym = this->global_symbol(symndx - first_global);
gold_debug(DEBUG_INCREMENTAL,
"GOT entry %d, type %02x: %s",
i, got_type, sym->name());
got->reserve_slot_for_global(i, sym, got_type);
target->reserve_global_got_entry(i, sym, got_type);
}
}
@ -1146,8 +1143,8 @@ Output_section_incremental_inputs<size, big_endian>::set_final_data_size()
gold_assert(entry != NULL);
(*p)->set_info_offset(info_offset);
// Input section count, global symbol count, local symbol offset,
// local symbol count.
info_offset += 16;
// local symbol count, first dynamic reloc, dynamic reloc count.
info_offset += 24;
// Each input section.
info_offset += (entry->get_input_section_count()
* (8 + 2 * sizeof_addr));
@ -1216,7 +1213,7 @@ Output_section_incremental_inputs<size, big_endian>::set_final_data_size()
unsigned int plt_count = target->plt_entry_count();
unsigned int got_plt_size = 8; // GOT entry count, PLT entry count.
got_plt_size = (got_plt_size + got_count + 3) & ~3; // GOT type array.
got_plt_size += got_count * 4 + plt_count * 4; // GOT array, PLT array.
got_plt_size += got_count * 8 + plt_count * 4; // GOT array, PLT array.
inputs->got_plt_section()->set_current_data_size(got_plt_size);
}
@ -1393,11 +1390,15 @@ Output_section_incremental_inputs<size, big_endian>::write_info_blocks(
unsigned int nsyms = syms->size();
off_t locals_offset = relobj->local_symbol_offset();
unsigned int nlocals = relobj->output_local_symbol_count();
unsigned int first_dynrel = relobj->first_dyn_reloc();
unsigned int ndynrel = relobj->dyn_reloc_count();
Swap32::writeval(pov, nsections);
Swap32::writeval(pov + 4, nsyms);
Swap32::writeval(pov + 8, static_cast<unsigned int>(locals_offset));
Swap32::writeval(pov + 12, nlocals);
pov += 16;
Swap32::writeval(pov + 16, first_dynrel);
Swap32::writeval(pov + 20, ndynrel);
pov += 24;
// Build a temporary array to map input section indexes
// from the original object file index to the index in the
@ -1592,11 +1593,14 @@ struct Got_plt_view_info
unsigned int first_plt_entry_offset;
// Size of a PLT entry (this is a target-dependent value).
unsigned int plt_entry_size;
// Value to write in the GOT descriptor array. For global symbols,
// this is the global symbol table index; for local symbols, it is
// the offset of the input file entry in the .gnu_incremental_inputs
// section.
unsigned int got_descriptor;
// Symbol index to write in the GOT descriptor array. For global symbols,
// this is the global symbol table index; for local symbols, it is the
// local symbol table index.
unsigned int sym_index;
// Input file index to write in the GOT descriptor array. For global
// symbols, this is 0; for local symbols, it is the index of the input
// file entry in the .gnu_incremental_inputs section.
unsigned int input_index;
};
// Functor class for processing a GOT offset list for local symbols.
@ -1621,8 +1625,9 @@ class Local_got_offset_visitor : public Got_offset_list::Visitor
// high bit to flag a local symbol.
gold_assert(got_type < 0x7f);
this->info_.got_type_p[got_index] = got_type | 0x80;
unsigned char* pov = this->info_.got_desc_p + got_index * 4;
elfcpp::Swap<32, big_endian>::writeval(pov, this->info_.got_descriptor);
unsigned char* pov = this->info_.got_desc_p + got_index * 8;
elfcpp::Swap<32, big_endian>::writeval(pov, this->info_.sym_index);
elfcpp::Swap<32, big_endian>::writeval(pov + 4, this->info_.input_index);
}
private:
@ -1652,8 +1657,9 @@ class Global_got_offset_visitor : public Got_offset_list::Visitor
// high bit to flag a local symbol.
gold_assert(got_type < 0x7f);
this->info_.got_type_p[got_index] = got_type;
unsigned char* pov = this->info_.got_desc_p + got_index * 4;
elfcpp::Swap<32, big_endian>::writeval(pov, this->info_.got_descriptor);
unsigned char* pov = this->info_.got_desc_p + got_index * 8;
elfcpp::Swap<32, big_endian>::writeval(pov, this->info_.sym_index);
elfcpp::Swap<32, big_endian>::writeval(pov + 4, 0);
}
private:
@ -1680,7 +1686,8 @@ class Global_symbol_visitor_got_plt
const Got_offset_list* got_offsets = sym->got_offset_list();
if (got_offsets != NULL)
{
this->info_.got_descriptor = sym->symtab_index();
this->info_.sym_index = sym->symtab_index();
this->info_.input_index = 0;
Got_visitor v(this->info_);
got_offsets->for_all_got_offsets(&v);
}
@ -1719,7 +1726,7 @@ Output_section_incremental_inputs<size, big_endian>::write_got_plt(
view_info.got_type_p = pov + 8;
view_info.got_desc_p = (view_info.got_type_p
+ ((view_info.got_count + 3) & ~3));
view_info.plt_desc_p = view_info.got_desc_p + view_info.got_count * 4;
view_info.plt_desc_p = view_info.got_desc_p + view_info.got_count * 8;
gold_assert(pov + view_size ==
view_info.plt_desc_p + view_info.plt_count * 4);
@ -1745,7 +1752,7 @@ Output_section_incremental_inputs<size, big_endian>::write_got_plt(
gold_assert(entry != NULL);
const Object* obj = entry->object();
gold_assert(obj != NULL);
view_info.got_descriptor = (*p)->get_file_index();
view_info.input_index = (*p)->get_file_index();
Got_visitor v(view_info);
obj->for_all_local_got_entries(&v);
}
@ -1755,35 +1762,35 @@ Output_section_incremental_inputs<size, big_endian>::write_got_plt(
symtab_->for_all_symbols<size, Symbol_visitor>(Symbol_visitor(view_info));
}
// Class Sized_incr_relobj. Most of these methods are not used for
// Class Sized_relobj_incr. Most of these methods are not used for
// Incremental objects, but are required to be implemented by the
// base class Object.
template<int size, bool big_endian>
Sized_incr_relobj<size, big_endian>::Sized_incr_relobj(
Sized_relobj_incr<size, big_endian>::Sized_relobj_incr(
const std::string& name,
Sized_incremental_binary<size, big_endian>* ibase,
unsigned int input_file_index)
: Sized_relobj_base<size, big_endian>(name, NULL), ibase_(ibase),
: Sized_relobj<size, big_endian>(name, NULL), ibase_(ibase),
input_file_index_(input_file_index),
input_reader_(ibase->inputs_reader().input_file(input_file_index)),
local_symbol_count_(0), output_local_dynsym_count_(0),
local_symbol_index_(0), local_symbol_offset_(0), local_dynsym_offset_(0),
symbols_(), section_offsets_(), incr_reloc_offset_(-1U),
incr_reloc_count_(0), incr_reloc_output_index_(0), incr_relocs_(NULL),
local_symbols_()
symbols_(), incr_reloc_offset_(-1U), incr_reloc_count_(0),
incr_reloc_output_index_(0), incr_relocs_(NULL), local_symbols_()
{
if (this->input_reader_.is_in_system_directory())
this->set_is_in_system_directory();
const unsigned int shnum = this->input_reader_.get_input_section_count() + 1;
this->set_shnum(shnum);
ibase->set_input_object(input_file_index, this);
}
// Read the symbols.
template<int size, bool big_endian>
void
Sized_incr_relobj<size, big_endian>::do_read_symbols(Read_symbols_data*)
Sized_relobj_incr<size, big_endian>::do_read_symbols(Read_symbols_data*)
{
gold_unreachable();
}
@ -1792,7 +1799,7 @@ Sized_incr_relobj<size, big_endian>::do_read_symbols(Read_symbols_data*)
template<int size, bool big_endian>
void
Sized_incr_relobj<size, big_endian>::do_layout(
Sized_relobj_incr<size, big_endian>::do_layout(
Symbol_table*,
Layout* layout,
Read_symbols_data*)
@ -1802,7 +1809,7 @@ Sized_incr_relobj<size, big_endian>::do_layout(
gold_assert(incremental_inputs != NULL);
Output_sections& out_sections(this->output_sections());
out_sections.resize(shnum);
this->section_offsets_.resize(shnum);
this->section_offsets().resize(shnum);
for (unsigned int i = 1; i < shnum; i++)
{
typename Input_entry_reader::Input_section_info sect =
@ -1815,7 +1822,7 @@ Sized_incr_relobj<size, big_endian>::do_layout(
Output_section* os = this->ibase_->output_section(sect.output_shndx);
gold_assert(os != NULL);
out_sections[i] = os;
this->section_offsets_[i] = static_cast<Address>(sect.sh_offset);
this->section_offsets()[i] = static_cast<Address>(sect.sh_offset);
}
}
@ -1823,7 +1830,7 @@ Sized_incr_relobj<size, big_endian>::do_layout(
// input files from a plugin.
template<int size, bool big_endian>
void
Sized_incr_relobj<size, big_endian>::do_layout_deferred_sections(Layout*)
Sized_relobj_incr<size, big_endian>::do_layout_deferred_sections(Layout*)
{
}
@ -1831,7 +1838,7 @@ Sized_incr_relobj<size, big_endian>::do_layout_deferred_sections(Layout*)
template<int size, bool big_endian>
void
Sized_incr_relobj<size, big_endian>::do_add_symbols(
Sized_relobj_incr<size, big_endian>::do_add_symbols(
Symbol_table* symtab,
Read_symbols_data*,
Layout*)
@ -1916,7 +1923,7 @@ Sized_incr_relobj<size, big_endian>::do_add_symbols(
template<int size, bool big_endian>
Archive::Should_include
Sized_incr_relobj<size, big_endian>::do_should_include_member(
Sized_relobj_incr<size, big_endian>::do_should_include_member(
Symbol_table*,
Layout*,
Read_symbols_data*,
@ -1929,29 +1936,18 @@ Sized_incr_relobj<size, big_endian>::do_should_include_member(
template<int size, bool big_endian>
void
Sized_incr_relobj<size, big_endian>::do_for_all_global_symbols(
Sized_relobj_incr<size, big_endian>::do_for_all_global_symbols(
Read_symbols_data*,
Library_base::Symbol_visitor_base*)
{
// This routine is not used for incremental objects.
}
// Iterate over local symbols, calling a visitor class V for each GOT offset
// associated with a local symbol.
template<int size, bool big_endian>
void
Sized_incr_relobj<size, big_endian>::do_for_all_local_got_entries(
Got_offset_list::Visitor*) const
{
// FIXME: Implement Sized_incr_relobj::do_for_all_local_got_entries.
}
// Get the size of a section.
template<int size, bool big_endian>
uint64_t
Sized_incr_relobj<size, big_endian>::do_section_size(unsigned int)
Sized_relobj_incr<size, big_endian>::do_section_size(unsigned int)
{
gold_unreachable();
}
@ -1960,7 +1956,7 @@ Sized_incr_relobj<size, big_endian>::do_section_size(unsigned int)
template<int size, bool big_endian>
std::string
Sized_incr_relobj<size, big_endian>::do_section_name(unsigned int)
Sized_relobj_incr<size, big_endian>::do_section_name(unsigned int)
{
gold_unreachable();
}
@ -1969,7 +1965,7 @@ Sized_incr_relobj<size, big_endian>::do_section_name(unsigned int)
template<int size, bool big_endian>
Object::Location
Sized_incr_relobj<size, big_endian>::do_section_contents(unsigned int)
Sized_relobj_incr<size, big_endian>::do_section_contents(unsigned int)
{
gold_unreachable();
}
@ -1978,7 +1974,7 @@ Sized_incr_relobj<size, big_endian>::do_section_contents(unsigned int)
template<int size, bool big_endian>
uint64_t
Sized_incr_relobj<size, big_endian>::do_section_flags(unsigned int)
Sized_relobj_incr<size, big_endian>::do_section_flags(unsigned int)
{
gold_unreachable();
}
@ -1987,7 +1983,7 @@ Sized_incr_relobj<size, big_endian>::do_section_flags(unsigned int)
template<int size, bool big_endian>
uint64_t
Sized_incr_relobj<size, big_endian>::do_section_entsize(unsigned int)
Sized_relobj_incr<size, big_endian>::do_section_entsize(unsigned int)
{
gold_unreachable();
}
@ -1996,7 +1992,7 @@ Sized_incr_relobj<size, big_endian>::do_section_entsize(unsigned int)
template<int size, bool big_endian>
uint64_t
Sized_incr_relobj<size, big_endian>::do_section_address(unsigned int)
Sized_relobj_incr<size, big_endian>::do_section_address(unsigned int)
{
gold_unreachable();
}
@ -2005,7 +2001,7 @@ Sized_incr_relobj<size, big_endian>::do_section_address(unsigned int)
template<int size, bool big_endian>
unsigned int
Sized_incr_relobj<size, big_endian>::do_section_type(unsigned int)
Sized_relobj_incr<size, big_endian>::do_section_type(unsigned int)
{
gold_unreachable();
}
@ -2014,7 +2010,7 @@ Sized_incr_relobj<size, big_endian>::do_section_type(unsigned int)
template<int size, bool big_endian>
unsigned int
Sized_incr_relobj<size, big_endian>::do_section_link(unsigned int)
Sized_relobj_incr<size, big_endian>::do_section_link(unsigned int)
{
gold_unreachable();
}
@ -2023,7 +2019,7 @@ Sized_incr_relobj<size, big_endian>::do_section_link(unsigned int)
template<int size, bool big_endian>
unsigned int
Sized_incr_relobj<size, big_endian>::do_section_info(unsigned int)
Sized_relobj_incr<size, big_endian>::do_section_info(unsigned int)
{
gold_unreachable();
}
@ -2032,7 +2028,7 @@ Sized_incr_relobj<size, big_endian>::do_section_info(unsigned int)
template<int size, bool big_endian>
uint64_t
Sized_incr_relobj<size, big_endian>::do_section_addralign(unsigned int)
Sized_relobj_incr<size, big_endian>::do_section_addralign(unsigned int)
{
gold_unreachable();
}
@ -2041,7 +2037,7 @@ Sized_incr_relobj<size, big_endian>::do_section_addralign(unsigned int)
template<int size, bool big_endian>
Xindex*
Sized_incr_relobj<size, big_endian>::do_initialize_xindex()
Sized_relobj_incr<size, big_endian>::do_initialize_xindex()
{
gold_unreachable();
}
@ -2050,7 +2046,7 @@ Sized_incr_relobj<size, big_endian>::do_initialize_xindex()
template<int size, bool big_endian>
void
Sized_incr_relobj<size, big_endian>::do_get_global_symbol_counts(
Sized_relobj_incr<size, big_endian>::do_get_global_symbol_counts(
const Symbol_table*, size_t*, size_t*) const
{
gold_unreachable();
@ -2060,7 +2056,7 @@ Sized_incr_relobj<size, big_endian>::do_get_global_symbol_counts(
template<int size, bool big_endian>
void
Sized_incr_relobj<size, big_endian>::do_read_relocs(Read_relocs_data*)
Sized_relobj_incr<size, big_endian>::do_read_relocs(Read_relocs_data*)
{
}
@ -2069,7 +2065,7 @@ Sized_incr_relobj<size, big_endian>::do_read_relocs(Read_relocs_data*)
template<int size, bool big_endian>
void
Sized_incr_relobj<size, big_endian>::do_gc_process_relocs(Symbol_table*,
Sized_relobj_incr<size, big_endian>::do_gc_process_relocs(Symbol_table*,
Layout*,
Read_relocs_data*)
{
@ -2080,7 +2076,7 @@ Sized_incr_relobj<size, big_endian>::do_gc_process_relocs(Symbol_table*,
template<int size, bool big_endian>
void
Sized_incr_relobj<size, big_endian>::do_scan_relocs(Symbol_table*,
Sized_relobj_incr<size, big_endian>::do_scan_relocs(Symbol_table*,
Layout* layout,
Read_relocs_data*)
{
@ -2125,7 +2121,7 @@ Sized_incr_relobj<size, big_endian>::do_scan_relocs(Symbol_table*,
template<int size, bool big_endian>
void
Sized_incr_relobj<size, big_endian>::do_count_local_symbols(
Sized_relobj_incr<size, big_endian>::do_count_local_symbols(
Stringpool_template<char>* pool,
Stringpool_template<char>*)
{
@ -2166,7 +2162,7 @@ Sized_incr_relobj<size, big_endian>::do_count_local_symbols(
template<int size, bool big_endian>
unsigned int
Sized_incr_relobj<size, big_endian>::do_finalize_local_symbols(
Sized_relobj_incr<size, big_endian>::do_finalize_local_symbols(
unsigned int index,
off_t off,
Symbol_table*)
@ -2180,7 +2176,7 @@ Sized_incr_relobj<size, big_endian>::do_finalize_local_symbols(
template<int size, bool big_endian>
unsigned int
Sized_incr_relobj<size, big_endian>::do_set_local_dynsym_indexes(
Sized_relobj_incr<size, big_endian>::do_set_local_dynsym_indexes(
unsigned int index)
{
// FIXME: set local dynsym indexes.
@ -2191,7 +2187,7 @@ Sized_incr_relobj<size, big_endian>::do_set_local_dynsym_indexes(
template<int size, bool big_endian>
unsigned int
Sized_incr_relobj<size, big_endian>::do_set_local_dynsym_offset(off_t)
Sized_relobj_incr<size, big_endian>::do_set_local_dynsym_offset(off_t)
{
return 0;
}
@ -2204,7 +2200,7 @@ Sized_incr_relobj<size, big_endian>::do_set_local_dynsym_offset(off_t)
template<int size, bool big_endian>
void
Sized_incr_relobj<size, big_endian>::do_relocate(const Symbol_table*,
Sized_relobj_incr<size, big_endian>::do_relocate(const Symbol_table*,
const Layout* layout,
Output_file* of)
{
@ -2330,7 +2326,7 @@ Sized_incr_relobj<size, big_endian>::do_relocate(const Symbol_table*,
template<int size, bool big_endian>
void
Sized_incr_relobj<size, big_endian>::do_set_section_offset(unsigned int,
Sized_relobj_incr<size, big_endian>::do_set_section_offset(unsigned int,
uint64_t)
{
}
@ -2617,7 +2613,7 @@ make_sized_incremental_object(
obj = new Sized_incr_dynobj<32, false>(name, sized_ibase,
input_file_index);
else
obj = new Sized_incr_relobj<32, false>(name, sized_ibase,
obj = new Sized_relobj_incr<32, false>(name, sized_ibase,
input_file_index);
}
break;
@ -2631,7 +2627,7 @@ make_sized_incremental_object(
obj = new Sized_incr_dynobj<32, true>(name, sized_ibase,
input_file_index);
else
obj = new Sized_incr_relobj<32, true>(name, sized_ibase,
obj = new Sized_relobj_incr<32, true>(name, sized_ibase,
input_file_index);
}
break;
@ -2645,7 +2641,7 @@ make_sized_incremental_object(
obj = new Sized_incr_dynobj<64, false>(name, sized_ibase,
input_file_index);
else
obj = new Sized_incr_relobj<64, false>(name, sized_ibase,
obj = new Sized_relobj_incr<64, false>(name, sized_ibase,
input_file_index);
}
break;
@ -2659,7 +2655,7 @@ make_sized_incremental_object(
obj = new Sized_incr_dynobj<64, true>(name, sized_ibase,
input_file_index);
else
obj = new Sized_incr_relobj<64, true>(name, sized_ibase,
obj = new Sized_relobj_incr<64, true>(name, sized_ibase,
input_file_index);
}
break;
@ -2705,7 +2701,7 @@ template
class Sized_incremental_binary<32, false>;
template
class Sized_incr_relobj<32, false>;
class Sized_relobj_incr<32, false>;
template
class Sized_incr_dynobj<32, false>;
@ -2716,7 +2712,7 @@ template
class Sized_incremental_binary<32, true>;
template
class Sized_incr_relobj<32, true>;
class Sized_relobj_incr<32, true>;
template
class Sized_incr_dynobj<32, true>;
@ -2727,7 +2723,7 @@ template
class Sized_incremental_binary<64, false>;
template
class Sized_incr_relobj<64, false>;
class Sized_relobj_incr<64, false>;
template
class Sized_incr_dynobj<64, false>;
@ -2738,7 +2734,7 @@ template
class Sized_incremental_binary<64, true>;
template
class Sized_incr_relobj<64, true>;
class Sized_relobj_incr<64, true>;
template
class Sized_incr_dynobj<64, true>;

View File

@ -736,7 +736,7 @@ class Incremental_inputs_reader
|| this->type() == INCREMENTAL_INPUT_ARCHIVE_MEMBER);
unsigned int section_count = this->get_input_section_count();
return (this->info_offset_ + 16
return (this->info_offset_ + 24
+ section_count * input_section_entry_size
+ symndx * 20);
}
@ -777,6 +777,26 @@ class Incremental_inputs_reader
return Swap32::readval(this->inputs_->p_ + this->info_offset_ + 12);
}
// Return the index of the first dynamic relocation -- for objects only.
unsigned int
get_first_dyn_reloc() const
{
gold_assert(this->type() == INCREMENTAL_INPUT_OBJECT
|| this->type() == INCREMENTAL_INPUT_ARCHIVE_MEMBER);
return Swap32::readval(this->inputs_->p_ + this->info_offset_ + 16);
}
// Return the dynamic relocation count -- for objects only.
unsigned int
get_dyn_reloc_count() const
{
gold_assert(this->type() == INCREMENTAL_INPUT_OBJECT
|| this->type() == INCREMENTAL_INPUT_ARCHIVE_MEMBER);
return Swap32::readval(this->inputs_->p_ + this->info_offset_ + 20);
}
// Return the object count -- for scripts only.
unsigned int
get_object_count() const
@ -847,7 +867,7 @@ class Incremental_inputs_reader
{
Input_section_info info;
const unsigned char* p = (this->inputs_->p_
+ this->info_offset_ + 16
+ this->info_offset_ + 24
+ n * input_section_entry_size);
unsigned int name_offset = Swap32::readval(p);
info.name = this->inputs_->get_string(name_offset);
@ -865,7 +885,7 @@ class Incremental_inputs_reader
|| this->type() == INCREMENTAL_INPUT_ARCHIVE_MEMBER);
unsigned int section_count = this->get_input_section_count();
const unsigned char* p = (this->inputs_->p_
+ this->info_offset_ + 16
+ this->info_offset_ + 24
+ section_count * input_section_entry_size
+ n * 20);
return Incremental_global_symbol_reader<big_endian>(p);
@ -1064,7 +1084,7 @@ class Incremental_got_plt_reader
{
this->got_count_ = elfcpp::Swap<32, big_endian>::readval(p);
this->got_desc_p_ = p + 8 + ((this->got_count_ + 3) & ~3);
this->plt_desc_p_ = this->got_desc_p_ + this->got_count_ * 4;
this->plt_desc_p_ = this->got_desc_p_ + this->got_count_ * 8;
}
// Return the GOT entry count.
@ -1088,11 +1108,18 @@ class Incremental_got_plt_reader
return this->p_[8 + n];
}
// Return the GOT descriptor for GOT entry N.
// Return the symbol index for GOT entry N.
unsigned int
get_got_desc(unsigned int n)
get_got_symndx(unsigned int n)
{
return elfcpp::Swap<32, big_endian>::readval(this->got_desc_p_ + n * 4);
return elfcpp::Swap<32, big_endian>::readval(this->got_desc_p_ + n * 8);
}
// Return the input file index for GOT entry N.
unsigned int
get_got_input_index(unsigned int n)
{
return elfcpp::Swap<32, big_endian>::readval(this->got_desc_p_ + n * 8 + 4);
}
// Return the PLT descriptor for PLT entry N.
@ -1357,6 +1384,9 @@ class Incremental_binary
Target* target_;
};
template<int size, bool big_endian>
class Sized_relobj_incr;
template<int size, bool big_endian>
class Sized_incremental_binary : public Incremental_binary
{
@ -1365,38 +1395,29 @@ class Sized_incremental_binary : public Incremental_binary
const elfcpp::Ehdr<size, big_endian>& ehdr,
Target* target)
: Incremental_binary(output, target), elf_file_(this, ehdr),
file_status_(NULL), section_map_(), symbol_map_(), main_symtab_loc_(),
input_objects_(), section_map_(), symbol_map_(), main_symtab_loc_(),
main_strtab_loc_(), has_incremental_info_(false), inputs_reader_(),
symtab_reader_(), relocs_reader_(), got_plt_reader_(),
input_entry_readers_()
{ this->setup_readers(); }
virtual
~Sized_incremental_binary()
{
if (this->file_status_ != NULL)
delete[] this->file_status_;
}
// Returns TRUE if the file contains incremental info.
bool
has_incremental_info() const
{ return this->has_incremental_info_; }
// Set the flag for input file N to indicate that the file is unchanged.
// Record a pointer to the object for input file N.
void
set_file_is_unchanged(unsigned int n)
{
gold_assert(this->file_status_ != NULL);
this->file_status_[n / 8] |= 1U << (n % 8);
}
set_input_object(unsigned int n,
Sized_relobj_incr<size, big_endian>* obj)
{ this->input_objects_[n] = obj; }
// Returns TRUE if input file N is unchanged.
bool
file_is_unchanged(unsigned int n) const
// Return a pointer to the object for input file N.
Sized_relobj_incr<size, big_endian>*
input_object(unsigned int n) const
{
gold_assert(this->file_status_ != NULL);
return (this->file_status_[n / 8] & (1U << (n % 8))) != 0;
gold_assert(n < this->input_objects_.size());
return this->input_objects_[n];
}
// Return the Output_section for section index SHNDX.
@ -1537,10 +1558,9 @@ class Sized_incremental_binary : public Incremental_binary
// Output as an ELF file.
elfcpp::Elf_file<size, big_endian, Incremental_binary> elf_file_;
// Status flags for each input file. Each bit represents one input file;
// 0 indicates that the file was replaced; 1 indicates that the file was
// unchanged.
unsigned char* file_status_;
// Vector of pointers to the input objects for the unchanged files.
// For replaced files, the corresponding pointer is NULL.
std::vector<Sized_relobj_incr<size, big_endian>*> input_objects_;
// Map section index to an Output_section in the updated layout.
std::vector<Output_section*> section_map_;
@ -1566,44 +1586,22 @@ class Sized_incremental_binary : public Incremental_binary
// can be used directly from the base file.
template<int size, bool big_endian>
class Sized_incr_relobj : public Sized_relobj_base<size, big_endian>
class Sized_relobj_incr : public Sized_relobj<size, big_endian>
{
public:
typedef typename elfcpp::Elf_types<size>::Elf_Addr Address;
typedef typename Sized_relobj_base<size, big_endian>::Symbols Symbols;
typedef typename Sized_relobj<size, big_endian>::Symbols Symbols;
static const Address invalid_address = static_cast<Address>(0) - 1;
Sized_incr_relobj(const std::string& name,
Sized_relobj_incr(const std::string& name,
Sized_incremental_binary<size, big_endian>* ibase,
unsigned int input_file_index);
// Checks if the offset of input section SHNDX within its output
// section is invalid.
bool
is_output_section_offset_invalid(unsigned int shndx) const
{ return this->section_offsets_[shndx] == invalid_address; }
// Get the offset of input section SHNDX within its output section.
// This is -1 if the input section requires a special mapping, such
// as a merge section. The output section can be found in the
// output_sections_ field of the parent class Incrobj.
uint64_t
do_output_section_offset(unsigned int shndx) const
{
gold_assert(shndx < this->section_offsets_.size());
Address off = this->section_offsets_[shndx];
if (off == invalid_address)
return -1ULL;
return off;
}
private:
// For convenience.
typedef Sized_incr_relobj<size, big_endian> This;
typedef Sized_relobj_incr<size, big_endian> This;
static const int sym_size = elfcpp::Elf_sizes<size>::sym_size;
typedef typename Sized_relobj_base<size, big_endian>::Output_sections
typedef typename Sized_relobj<size, big_endian>::Output_sections
Output_sections;
typedef Incremental_inputs_reader<size, big_endian> Inputs_reader;
typedef typename Inputs_reader::Incremental_input_entry_reader
@ -1671,11 +1669,6 @@ class Sized_incr_relobj : public Sized_relobj_base<size, big_endian>
do_for_all_global_symbols(Read_symbols_data* sd,
Library_base::Symbol_visitor_base* v);
// Iterate over local symbols, calling a visitor class V for each GOT offset
// associated with a local symbol.
void
do_for_all_local_got_entries(Got_offset_list::Visitor* v) const;
// Get the size of a section.
uint64_t
do_section_size(unsigned int shndx);
@ -1801,10 +1794,6 @@ class Sized_incr_relobj : public Sized_relobj_base<size, big_endian>
unsigned int local_dynsym_offset_;
// The entries in the symbol table for the external symbols.
Symbols symbols_;
// For each input section, the offset of the input section in its
// output section. This is INVALID_ADDRESS if the input section requires a
// special mapping.
std::vector<Address> section_offsets_;
// The offset of the first incremental relocation for this object.
unsigned int incr_reloc_offset_;
// The number of incremental relocations for this object.

View File

@ -510,7 +510,7 @@ is_compressed_debug_section(const char* secname)
template<int size, bool big_endian>
bool
Layout::include_section(Sized_relobj<size, big_endian>*, const char* name,
Layout::include_section(Sized_relobj_file<size, big_endian>*, const char* name,
const elfcpp::Shdr<size, big_endian>& shdr)
{
if (shdr.get_sh_flags() & elfcpp::SHF_EXCLUDE)
@ -880,7 +880,7 @@ Layout::init_fixed_output_section(const char* name,
template<int size, bool big_endian>
Output_section*
Layout::layout(Sized_relobj<size, big_endian>* object, unsigned int shndx,
Layout::layout(Sized_relobj_file<size, big_endian>* object, unsigned int shndx,
const char* name, const elfcpp::Shdr<size, big_endian>& shdr,
unsigned int reloc_shndx, unsigned int, off_t* off)
{
@ -968,7 +968,7 @@ Layout::layout(Sized_relobj<size, big_endian>* object, unsigned int shndx,
template<int size, bool big_endian>
Output_section*
Layout::layout_reloc(Sized_relobj<size, big_endian>* object,
Layout::layout_reloc(Sized_relobj_file<size, big_endian>* object,
unsigned int,
const elfcpp::Shdr<size, big_endian>& shdr,
Output_section* data_section,
@ -1035,7 +1035,7 @@ Layout::layout_reloc(Sized_relobj<size, big_endian>* object,
template<int size, bool big_endian>
void
Layout::layout_group(Symbol_table* symtab,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int,
const char* group_section_name,
const char* signature,
@ -1085,7 +1085,7 @@ Layout::layout_group(Symbol_table* symtab,
template<int size, bool big_endian>
Output_section*
Layout::layout_eh_frame(Sized_relobj<size, big_endian>* object,
Layout::layout_eh_frame(Sized_relobj_file<size, big_endian>* object,
const unsigned char* symbols,
off_t symbols_size,
const unsigned char* symbol_names,
@ -4787,7 +4787,8 @@ Layout::init_fixed_output_section<64, true>(
#ifdef HAVE_TARGET_32_LITTLE
template
Output_section*
Layout::layout<32, false>(Sized_relobj<32, false>* object, unsigned int shndx,
Layout::layout<32, false>(Sized_relobj_file<32, false>* object,
unsigned int shndx,
const char* name,
const elfcpp::Shdr<32, false>& shdr,
unsigned int, unsigned int, off_t*);
@ -4796,7 +4797,8 @@ Layout::layout<32, false>(Sized_relobj<32, false>* object, unsigned int shndx,
#ifdef HAVE_TARGET_32_BIG
template
Output_section*
Layout::layout<32, true>(Sized_relobj<32, true>* object, unsigned int shndx,
Layout::layout<32, true>(Sized_relobj_file<32, true>* object,
unsigned int shndx,
const char* name,
const elfcpp::Shdr<32, true>& shdr,
unsigned int, unsigned int, off_t*);
@ -4805,7 +4807,8 @@ Layout::layout<32, true>(Sized_relobj<32, true>* object, unsigned int shndx,
#ifdef HAVE_TARGET_64_LITTLE
template
Output_section*
Layout::layout<64, false>(Sized_relobj<64, false>* object, unsigned int shndx,
Layout::layout<64, false>(Sized_relobj_file<64, false>* object,
unsigned int shndx,
const char* name,
const elfcpp::Shdr<64, false>& shdr,
unsigned int, unsigned int, off_t*);
@ -4814,7 +4817,8 @@ Layout::layout<64, false>(Sized_relobj<64, false>* object, unsigned int shndx,
#ifdef HAVE_TARGET_64_BIG
template
Output_section*
Layout::layout<64, true>(Sized_relobj<64, true>* object, unsigned int shndx,
Layout::layout<64, true>(Sized_relobj_file<64, true>* object,
unsigned int shndx,
const char* name,
const elfcpp::Shdr<64, true>& shdr,
unsigned int, unsigned int, off_t*);
@ -4823,7 +4827,7 @@ Layout::layout<64, true>(Sized_relobj<64, true>* object, unsigned int shndx,
#ifdef HAVE_TARGET_32_LITTLE
template
Output_section*
Layout::layout_reloc<32, false>(Sized_relobj<32, false>* object,
Layout::layout_reloc<32, false>(Sized_relobj_file<32, false>* object,
unsigned int reloc_shndx,
const elfcpp::Shdr<32, false>& shdr,
Output_section* data_section,
@ -4833,7 +4837,7 @@ Layout::layout_reloc<32, false>(Sized_relobj<32, false>* object,
#ifdef HAVE_TARGET_32_BIG
template
Output_section*
Layout::layout_reloc<32, true>(Sized_relobj<32, true>* object,
Layout::layout_reloc<32, true>(Sized_relobj_file<32, true>* object,
unsigned int reloc_shndx,
const elfcpp::Shdr<32, true>& shdr,
Output_section* data_section,
@ -4843,7 +4847,7 @@ Layout::layout_reloc<32, true>(Sized_relobj<32, true>* object,
#ifdef HAVE_TARGET_64_LITTLE
template
Output_section*
Layout::layout_reloc<64, false>(Sized_relobj<64, false>* object,
Layout::layout_reloc<64, false>(Sized_relobj_file<64, false>* object,
unsigned int reloc_shndx,
const elfcpp::Shdr<64, false>& shdr,
Output_section* data_section,
@ -4853,7 +4857,7 @@ Layout::layout_reloc<64, false>(Sized_relobj<64, false>* object,
#ifdef HAVE_TARGET_64_BIG
template
Output_section*
Layout::layout_reloc<64, true>(Sized_relobj<64, true>* object,
Layout::layout_reloc<64, true>(Sized_relobj_file<64, true>* object,
unsigned int reloc_shndx,
const elfcpp::Shdr<64, true>& shdr,
Output_section* data_section,
@ -4864,7 +4868,7 @@ Layout::layout_reloc<64, true>(Sized_relobj<64, true>* object,
template
void
Layout::layout_group<32, false>(Symbol_table* symtab,
Sized_relobj<32, false>* object,
Sized_relobj_file<32, false>* object,
unsigned int,
const char* group_section_name,
const char* signature,
@ -4877,7 +4881,7 @@ Layout::layout_group<32, false>(Symbol_table* symtab,
template
void
Layout::layout_group<32, true>(Symbol_table* symtab,
Sized_relobj<32, true>* object,
Sized_relobj_file<32, true>* object,
unsigned int,
const char* group_section_name,
const char* signature,
@ -4890,7 +4894,7 @@ Layout::layout_group<32, true>(Symbol_table* symtab,
template
void
Layout::layout_group<64, false>(Symbol_table* symtab,
Sized_relobj<64, false>* object,
Sized_relobj_file<64, false>* object,
unsigned int,
const char* group_section_name,
const char* signature,
@ -4903,7 +4907,7 @@ Layout::layout_group<64, false>(Symbol_table* symtab,
template
void
Layout::layout_group<64, true>(Symbol_table* symtab,
Sized_relobj<64, true>* object,
Sized_relobj_file<64, true>* object,
unsigned int,
const char* group_section_name,
const char* signature,
@ -4915,7 +4919,7 @@ Layout::layout_group<64, true>(Symbol_table* symtab,
#ifdef HAVE_TARGET_32_LITTLE
template
Output_section*
Layout::layout_eh_frame<32, false>(Sized_relobj<32, false>* object,
Layout::layout_eh_frame<32, false>(Sized_relobj_file<32, false>* object,
const unsigned char* symbols,
off_t symbols_size,
const unsigned char* symbol_names,
@ -4930,9 +4934,9 @@ Layout::layout_eh_frame<32, false>(Sized_relobj<32, false>* object,
#ifdef HAVE_TARGET_32_BIG
template
Output_section*
Layout::layout_eh_frame<32, true>(Sized_relobj<32, true>* object,
const unsigned char* symbols,
off_t symbols_size,
Layout::layout_eh_frame<32, true>(Sized_relobj_file<32, true>* object,
const unsigned char* symbols,
off_t symbols_size,
const unsigned char* symbol_names,
off_t symbol_names_size,
unsigned int shndx,
@ -4945,7 +4949,7 @@ Layout::layout_eh_frame<32, true>(Sized_relobj<32, true>* object,
#ifdef HAVE_TARGET_64_LITTLE
template
Output_section*
Layout::layout_eh_frame<64, false>(Sized_relobj<64, false>* object,
Layout::layout_eh_frame<64, false>(Sized_relobj_file<64, false>* object,
const unsigned char* symbols,
off_t symbols_size,
const unsigned char* symbol_names,
@ -4960,9 +4964,9 @@ Layout::layout_eh_frame<64, false>(Sized_relobj<64, false>* object,
#ifdef HAVE_TARGET_64_BIG
template
Output_section*
Layout::layout_eh_frame<64, true>(Sized_relobj<64, true>* object,
const unsigned char* symbols,
off_t symbols_size,
Layout::layout_eh_frame<64, true>(Sized_relobj_file<64, true>* object,
const unsigned char* symbols,
off_t symbols_size,
const unsigned char* symbol_names,
off_t symbol_names_size,
unsigned int shndx,

View File

@ -488,7 +488,7 @@ class Layout
// within the output section.
template<int size, bool big_endian>
Output_section*
layout(Sized_relobj<size, big_endian> *object, unsigned int shndx,
layout(Sized_relobj_file<size, big_endian> *object, unsigned int shndx,
const char* name, const elfcpp::Shdr<size, big_endian>& shdr,
unsigned int reloc_shndx, unsigned int reloc_type, off_t* offset);
@ -510,7 +510,7 @@ class Layout
// relocatable information.
template<int size, bool big_endian>
Output_section*
layout_reloc(Sized_relobj<size, big_endian>* object,
layout_reloc(Sized_relobj_file<size, big_endian>* object,
unsigned int reloc_shndx,
const elfcpp::Shdr<size, big_endian>& shdr,
Output_section* data_section,
@ -520,7 +520,7 @@ class Layout
template<int size, bool big_endian>
void
layout_group(Symbol_table* symtab,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int group_shndx,
const char* group_section_name,
const char* signature,
@ -539,7 +539,7 @@ class Layout
// returns the output section, and sets *OFFSET to the offset.
template<int size, bool big_endian>
Output_section*
layout_eh_frame(Sized_relobj<size, big_endian>* object,
layout_eh_frame(Sized_relobj_file<size, big_endian>* object,
const unsigned char* symbols,
off_t symbols_size,
const unsigned char* symbol_names,
@ -958,7 +958,7 @@ class Layout
// Return whether to include this section in the link.
template<int size, bool big_endian>
bool
include_section(Sized_relobj<size, big_endian>* object, const char* name,
include_section(Sized_relobj_file<size, big_endian>* object, const char* name,
const elfcpp::Shdr<size, big_endian>&);
// Return the output section name to use given an input section

View File

@ -202,7 +202,7 @@ Mapfile::print_memory_map_header()
template<int size, bool big_endian>
void
Mapfile::print_input_section_symbols(
const Sized_relobj<size, big_endian>* relobj,
const Sized_relobj_file<size, big_endian>* relobj,
unsigned int shndx)
{
unsigned int symcount = relobj->symbol_count();
@ -273,8 +273,8 @@ Mapfile::print_input_section(Relobj* relobj, unsigned int shndx)
#ifdef HAVE_TARGET_32_LITTLE
case Parameters::TARGET_32_LITTLE:
{
const Sized_relobj<32, false>* sized_relobj =
static_cast<Sized_relobj<32, false>*>(relobj);
const Sized_relobj_file<32, false>* sized_relobj =
static_cast<Sized_relobj_file<32, false>*>(relobj);
this->print_input_section_symbols(sized_relobj, shndx);
}
break;
@ -282,8 +282,8 @@ Mapfile::print_input_section(Relobj* relobj, unsigned int shndx)
#ifdef HAVE_TARGET_32_BIG
case Parameters::TARGET_32_BIG:
{
const Sized_relobj<32, true>* sized_relobj =
static_cast<Sized_relobj<32, true>*>(relobj);
const Sized_relobj_file<32, true>* sized_relobj =
static_cast<Sized_relobj_file<32, true>*>(relobj);
this->print_input_section_symbols(sized_relobj, shndx);
}
break;
@ -291,8 +291,8 @@ Mapfile::print_input_section(Relobj* relobj, unsigned int shndx)
#ifdef HAVE_TARGET_64_LITTLE
case Parameters::TARGET_64_LITTLE:
{
const Sized_relobj<64, false>* sized_relobj =
static_cast<Sized_relobj<64, false>*>(relobj);
const Sized_relobj_file<64, false>* sized_relobj =
static_cast<Sized_relobj_file<64, false>*>(relobj);
this->print_input_section_symbols(sized_relobj, shndx);
}
break;
@ -300,8 +300,8 @@ Mapfile::print_input_section(Relobj* relobj, unsigned int shndx)
#ifdef HAVE_TARGET_64_BIG
case Parameters::TARGET_64_BIG:
{
const Sized_relobj<64, true>* sized_relobj =
static_cast<Sized_relobj<64, true>*>(relobj);
const Sized_relobj_file<64, true>* sized_relobj =
static_cast<Sized_relobj_file<64, true>*>(relobj);
this->print_input_section_symbols(sized_relobj, shndx);
}
break;

View File

@ -33,7 +33,7 @@ class Archive;
class Symbol;
class Relobj;
template<int size, bool big_endian>
class Sized_relobj;
class Sized_relobj_file;
class Output_section;
class Output_data;
@ -100,7 +100,7 @@ class Mapfile
// Print symbols for an input section.
template<int size, bool big_endian>
void
print_input_section_symbols(const Sized_relobj<size, big_endian>*,
print_input_section_symbols(const Sized_relobj_file<size, big_endian>*,
unsigned int shndx);
// Map file to write to.

View File

@ -189,7 +189,7 @@ Object::section_contents(unsigned int shndx, section_size_type* plen,
return this->get_view(loc.file_offset, *plen, true, cache);
}
// Read the section data into SD. This is code common to Sized_relobj
// Read the section data into SD. This is code common to Sized_relobj_file
// and Sized_dynobj, so we put it into Object.
template<int size, bool big_endian>
@ -374,13 +374,35 @@ Relobj::finalize_incremental_relocs(Layout* layout, bool clear_counts)
// Class Sized_relobj.
// Iterate over local symbols, calling a visitor class V for each GOT offset
// associated with a local symbol.
template<int size, bool big_endian>
Sized_relobj<size, big_endian>::Sized_relobj(
void
Sized_relobj<size, big_endian>::do_for_all_local_got_entries(
Got_offset_list::Visitor* v) const
{
unsigned int nsyms = this->local_symbol_count();
for (unsigned int i = 0; i < nsyms; i++)
{
Local_got_offsets::const_iterator p = this->local_got_offsets_.find(i);
if (p != this->local_got_offsets_.end())
{
const Got_offset_list* got_offsets = p->second;
got_offsets->for_all_got_offsets(v);
}
}
}
// Class Sized_relobj_file.
template<int size, bool big_endian>
Sized_relobj_file<size, big_endian>::Sized_relobj_file(
const std::string& name,
Input_file* input_file,
off_t offset,
const elfcpp::Ehdr<size, big_endian>& ehdr)
: Sized_relobj_base<size, big_endian>(name, input_file, offset),
: Sized_relobj<size, big_endian>(name, input_file, offset),
elf_file_(this, ehdr),
symtab_shndx_(-1U),
local_symbol_count_(0),
@ -391,7 +413,6 @@ Sized_relobj<size, big_endian>::Sized_relobj(
local_symbol_offset_(0),
local_dynsym_offset_(0),
local_values_(),
local_got_offsets_(),
local_plt_offsets_(),
kept_comdat_sections_(),
has_eh_frame_(false),
@ -403,7 +424,7 @@ Sized_relobj<size, big_endian>::Sized_relobj(
}
template<int size, bool big_endian>
Sized_relobj<size, big_endian>::~Sized_relobj()
Sized_relobj_file<size, big_endian>::~Sized_relobj_file()
{
}
@ -412,7 +433,7 @@ Sized_relobj<size, big_endian>::~Sized_relobj()
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::do_setup()
Sized_relobj_file<size, big_endian>::do_setup()
{
const unsigned int shnum = this->elf_file_.shnum();
this->set_shnum(shnum);
@ -425,7 +446,7 @@ Sized_relobj<size, big_endian>::do_setup()
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::find_symtab(const unsigned char* pshdrs)
Sized_relobj_file<size, big_endian>::find_symtab(const unsigned char* pshdrs)
{
const unsigned int shnum = this->shnum();
this->symtab_shndx_ = 0;
@ -474,7 +495,7 @@ Sized_relobj<size, big_endian>::find_symtab(const unsigned char* pshdrs)
template<int size, bool big_endian>
Xindex*
Sized_relobj<size, big_endian>::do_initialize_xindex()
Sized_relobj_file<size, big_endian>::do_initialize_xindex()
{
gold_assert(this->symtab_shndx_ != -1U);
Xindex* xindex = new Xindex(this->elf_file_.large_shndx_offset());
@ -487,7 +508,7 @@ Sized_relobj<size, big_endian>::do_initialize_xindex()
template<int size, bool big_endian>
bool
Sized_relobj<size, big_endian>::check_eh_frame_flags(
Sized_relobj_file<size, big_endian>::check_eh_frame_flags(
const elfcpp::Shdr<size, big_endian>* shdr) const
{
return (shdr->get_sh_type() == elfcpp::SHT_PROGBITS
@ -499,7 +520,7 @@ Sized_relobj<size, big_endian>::check_eh_frame_flags(
template<int size, bool big_endian>
bool
Sized_relobj<size, big_endian>::find_eh_frame(
Sized_relobj_file<size, big_endian>::find_eh_frame(
const unsigned char* pshdrs,
const char* names,
section_size_type names_size) const
@ -536,7 +557,7 @@ build_compressed_section_map(
unsigned int shnum,
const char* names,
section_size_type names_size,
Sized_relobj<size, big_endian>* obj)
Sized_relobj_file<size, big_endian>* obj)
{
Compressed_section_map* uncompressed_sizes = new Compressed_section_map();
const unsigned int shdr_size = elfcpp::Elf_sizes<size>::shdr_size;
@ -574,7 +595,7 @@ build_compressed_section_map(
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::do_read_symbols(Read_symbols_data* sd)
Sized_relobj_file<size, big_endian>::do_read_symbols(Read_symbols_data* sd)
{
this->read_section_data(&this->elf_file_, sd);
@ -677,9 +698,9 @@ Sized_relobj<size, big_endian>::do_read_symbols(Read_symbols_data* sd)
template<int size, bool big_endian>
unsigned int
Sized_relobj<size, big_endian>::symbol_section_and_value(unsigned int sym,
Address* value,
bool* is_ordinary)
Sized_relobj_file<size, big_endian>::symbol_section_and_value(unsigned int sym,
Address* value,
bool* is_ordinary)
{
section_size_type symbols_size;
const unsigned char* symbols = this->section_contents(this->symtab_shndx_,
@ -703,7 +724,7 @@ Sized_relobj<size, big_endian>::symbol_section_and_value(unsigned int sym,
template<int size, bool big_endian>
bool
Sized_relobj<size, big_endian>::include_section_group(
Sized_relobj_file<size, big_endian>::include_section_group(
Symbol_table* symtab,
Layout* layout,
unsigned int index,
@ -916,7 +937,7 @@ Sized_relobj<size, big_endian>::include_section_group(
template<int size, bool big_endian>
bool
Sized_relobj<size, big_endian>::include_linkonce_section(
Sized_relobj_file<size, big_endian>::include_linkonce_section(
Layout* layout,
unsigned int index,
const char* name,
@ -988,12 +1009,12 @@ Sized_relobj<size, big_endian>::include_linkonce_section(
template<int size, bool big_endian>
inline void
Sized_relobj<size, big_endian>::layout_section(Layout* layout,
unsigned int shndx,
const char* name,
typename This::Shdr& shdr,
unsigned int reloc_shndx,
unsigned int reloc_type)
Sized_relobj_file<size, big_endian>::layout_section(Layout* layout,
unsigned int shndx,
const char* name,
typename This::Shdr& shdr,
unsigned int reloc_shndx,
unsigned int reloc_type)
{
off_t offset;
Output_section* os = layout->layout(this, shndx, name, shdr,
@ -1001,9 +1022,9 @@ Sized_relobj<size, big_endian>::layout_section(Layout* layout,
this->output_sections()[shndx] = os;
if (offset == -1)
this->section_offsets_[shndx] = invalid_address;
this->section_offsets()[shndx] = invalid_address;
else
this->section_offsets_[shndx] = convert_types<Address, off_t>(offset);
this->section_offsets()[shndx] = convert_types<Address, off_t>(offset);
// If this section requires special handling, and if there are
// relocs that apply to it, then we must do the special handling
@ -1028,9 +1049,9 @@ Sized_relobj<size, big_endian>::layout_section(Layout* layout,
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::do_layout(Symbol_table* symtab,
Layout* layout,
Read_symbols_data* sd)
Sized_relobj_file<size, big_endian>::do_layout(Symbol_table* symtab,
Layout* layout,
Read_symbols_data* sd)
{
const unsigned int shnum = this->shnum();
bool is_gc_pass_one = ((parameters->options().gc_sections()
@ -1151,7 +1172,7 @@ Sized_relobj<size, big_endian>::do_layout(Symbol_table* symtab,
}
Output_sections& out_sections(this->output_sections());
std::vector<Address>& out_section_offsets(this->section_offsets_);
std::vector<Address>& out_section_offsets(this->section_offsets());
if (!is_gc_pass_two)
{
@ -1552,7 +1573,7 @@ Sized_relobj<size, big_endian>::do_layout(Symbol_table* symtab,
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::do_layout_deferred_sections(Layout* layout)
Sized_relobj_file<size, big_endian>::do_layout_deferred_sections(Layout* layout)
{
typename std::vector<Deferred_layout>::iterator deferred;
@ -1575,7 +1596,7 @@ Sized_relobj<size, big_endian>::do_layout_deferred_sections(Layout* layout)
// Now handle the deferred relocation sections.
Output_sections& out_sections(this->output_sections());
std::vector<Address>& out_section_offsets(this->section_offsets_);
std::vector<Address>& out_section_offsets(this->section_offsets());
for (deferred = this->deferred_layout_relocs_.begin();
deferred != this->deferred_layout_relocs_.end();
@ -1607,9 +1628,9 @@ Sized_relobj<size, big_endian>::do_layout_deferred_sections(Layout* layout)
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::do_add_symbols(Symbol_table* symtab,
Read_symbols_data* sd,
Layout*)
Sized_relobj_file<size, big_endian>::do_add_symbols(Symbol_table* symtab,
Read_symbols_data* sd,
Layout*)
{
if (sd->symbols == NULL)
{
@ -1650,10 +1671,11 @@ Sized_relobj<size, big_endian>::do_add_symbols(Symbol_table* symtab,
template<int size, bool big_endian>
Archive::Should_include
Sized_relobj<size, big_endian>::do_should_include_member(Symbol_table* symtab,
Layout* layout,
Read_symbols_data* sd,
std::string* why)
Sized_relobj_file<size, big_endian>::do_should_include_member(
Symbol_table* symtab,
Layout* layout,
Read_symbols_data* sd,
std::string* why)
{
char* tmpbuf = NULL;
size_t tmpbuflen = 0;
@ -1699,7 +1721,7 @@ Sized_relobj<size, big_endian>::do_should_include_member(Symbol_table* symtab,
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::do_for_all_global_symbols(
Sized_relobj_file<size, big_endian>::do_for_all_global_symbols(
Read_symbols_data* sd,
Library_base::Symbol_visitor_base* v)
{
@ -1720,31 +1742,12 @@ Sized_relobj<size, big_endian>::do_for_all_global_symbols(
}
}
// Iterate over local symbols, calling a visitor class V for each GOT offset
// associated with a local symbol.
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::do_for_all_local_got_entries(
Got_offset_list::Visitor* v) const
{
unsigned int nsyms = this->local_symbol_count();
for (unsigned int i = 0; i < nsyms; i++)
{
Local_got_offsets::const_iterator p = this->local_got_offsets_.find(i);
if (p != this->local_got_offsets_.end())
{
const Got_offset_list* got_offsets = p->second;
got_offsets->for_all_got_offsets(v);
}
}
}
// Return whether the local symbol SYMNDX has a PLT offset.
template<int size, bool big_endian>
bool
Sized_relobj<size, big_endian>::local_has_plt_offset(unsigned int symndx) const
Sized_relobj_file<size, big_endian>::local_has_plt_offset(
unsigned int symndx) const
{
typename Local_plt_offsets::const_iterator p =
this->local_plt_offsets_.find(symndx);
@ -1755,7 +1758,7 @@ Sized_relobj<size, big_endian>::local_has_plt_offset(unsigned int symndx) const
template<int size, bool big_endian>
unsigned int
Sized_relobj<size, big_endian>::local_plt_offset(unsigned int symndx) const
Sized_relobj_file<size, big_endian>::local_plt_offset(unsigned int symndx) const
{
typename Local_plt_offsets::const_iterator p =
this->local_plt_offsets_.find(symndx);
@ -1767,8 +1770,8 @@ Sized_relobj<size, big_endian>::local_plt_offset(unsigned int symndx) const
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::set_local_plt_offset(unsigned int symndx,
unsigned int plt_offset)
Sized_relobj_file<size, big_endian>::set_local_plt_offset(
unsigned int symndx, unsigned int plt_offset)
{
std::pair<typename Local_plt_offsets::iterator, bool> ins =
this->local_plt_offsets_.insert(std::make_pair(symndx, plt_offset));
@ -1783,8 +1786,8 @@ Sized_relobj<size, big_endian>::set_local_plt_offset(unsigned int symndx,
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::do_count_local_symbols(Stringpool* pool,
Stringpool* dynpool)
Sized_relobj_file<size, big_endian>::do_count_local_symbols(Stringpool* pool,
Stringpool* dynpool)
{
gold_assert(this->symtab_shndx_ != -1U);
if (this->symtab_shndx_ == 0)
@ -1932,8 +1935,8 @@ Sized_relobj<size, big_endian>::do_count_local_symbols(Stringpool* pool,
// Compute the final value of a local symbol.
template<int size, bool big_endian>
typename Sized_relobj<size, big_endian>::Compute_final_local_value_status
Sized_relobj<size, big_endian>::compute_final_local_value_internal(
typename Sized_relobj_file<size, big_endian>::Compute_final_local_value_status
Sized_relobj_file<size, big_endian>::compute_final_local_value_internal(
unsigned int r_sym,
const Symbol_value<size>* lv_in,
Symbol_value<size>* lv_out,
@ -1982,8 +1985,8 @@ Sized_relobj<size, big_endian>::compute_final_local_value_internal(
Section_id folded = symtab->icf()->get_folded_section(this,
shndx);
gold_assert(folded.first != NULL);
Sized_relobj<size, big_endian>* folded_obj = reinterpret_cast
<Sized_relobj<size, big_endian>*>(folded.first);
Sized_relobj_file<size, big_endian>* folded_obj = reinterpret_cast
<Sized_relobj_file<size, big_endian>*>(folded.first);
os = folded_obj->output_section(folded.second);
gold_assert(os != NULL);
secoffset = folded_obj->get_output_section_offset(folded.second);
@ -2085,8 +2088,8 @@ Sized_relobj<size, big_endian>::compute_final_local_value_internal(
// everything is finalized. The caller should also free up any allocated
// memory in the return value in *LV.
template<int size, bool big_endian>
typename Sized_relobj<size, big_endian>::Compute_final_local_value_status
Sized_relobj<size, big_endian>::compute_final_local_value(
typename Sized_relobj_file<size, big_endian>::Compute_final_local_value_status
Sized_relobj_file<size, big_endian>::compute_final_local_value(
unsigned int r_sym,
const Symbol_value<size>* lv_in,
Symbol_value<size>* lv_out,
@ -2095,7 +2098,7 @@ Sized_relobj<size, big_endian>::compute_final_local_value(
// This is just a wrapper of compute_final_local_value_internal.
const bool relocatable = parameters->options().relocatable();
const Output_sections& out_sections(this->output_sections());
const std::vector<Address>& out_offsets(this->section_offsets_);
const std::vector<Address>& out_offsets(this->section_offsets());
return this->compute_final_local_value_internal(r_sym, lv_in, lv_out,
relocatable, out_sections,
out_offsets, symtab);
@ -2108,9 +2111,10 @@ Sized_relobj<size, big_endian>::compute_final_local_value(
template<int size, bool big_endian>
unsigned int
Sized_relobj<size, big_endian>::do_finalize_local_symbols(unsigned int index,
off_t off,
Symbol_table* symtab)
Sized_relobj_file<size, big_endian>::do_finalize_local_symbols(
unsigned int index,
off_t off,
Symbol_table* symtab)
{
gold_assert(off == static_cast<off_t>(align_address(off, size >> 3)));
@ -2119,7 +2123,7 @@ Sized_relobj<size, big_endian>::do_finalize_local_symbols(unsigned int index,
const bool relocatable = parameters->options().relocatable();
const Output_sections& out_sections(this->output_sections());
const std::vector<Address>& out_offsets(this->section_offsets_);
const std::vector<Address>& out_offsets(this->section_offsets());
for (unsigned int i = 1; i < loccount; ++i)
{
@ -2153,7 +2157,8 @@ Sized_relobj<size, big_endian>::do_finalize_local_symbols(unsigned int index,
template<int size, bool big_endian>
unsigned int
Sized_relobj<size, big_endian>::do_set_local_dynsym_indexes(unsigned int index)
Sized_relobj_file<size, big_endian>::do_set_local_dynsym_indexes(
unsigned int index)
{
const unsigned int loccount = this->local_symbol_count_;
for (unsigned int i = 1; i < loccount; ++i)
@ -2174,7 +2179,7 @@ Sized_relobj<size, big_endian>::do_set_local_dynsym_indexes(unsigned int index)
template<int size, bool big_endian>
unsigned int
Sized_relobj<size, big_endian>::do_set_local_dynsym_offset(off_t off)
Sized_relobj_file<size, big_endian>::do_set_local_dynsym_offset(off_t off)
{
gold_assert(off == static_cast<off_t>(align_address(off, size >> 3)));
this->local_dynsym_offset_ = off;
@ -2186,7 +2191,7 @@ Sized_relobj<size, big_endian>::do_set_local_dynsym_offset(off_t off)
template<int size, bool big_endian>
uint64_t
Sized_relobj<size, big_endian>::do_section_flags(unsigned int shndx)
Sized_relobj_file<size, big_endian>::do_section_flags(unsigned int shndx)
{
Symbols_data* sd = this->get_symbols_data();
if (sd != NULL)
@ -2205,7 +2210,7 @@ Sized_relobj<size, big_endian>::do_section_flags(unsigned int shndx)
template<int size, bool big_endian>
uint64_t
Sized_relobj<size, big_endian>::do_section_entsize(unsigned int shndx)
Sized_relobj_file<size, big_endian>::do_section_entsize(unsigned int shndx)
{
Symbols_data* sd = this->get_symbols_data();
gold_assert(sd != NULL);
@ -2220,7 +2225,7 @@ Sized_relobj<size, big_endian>::do_section_entsize(unsigned int shndx)
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::write_local_symbols(
Sized_relobj_file<size, big_endian>::write_local_symbols(
Output_file* of,
const Stringpool* sympool,
const Stringpool* dynpool,
@ -2370,7 +2375,7 @@ Sized_relobj<size, big_endian>::write_local_symbols(
template<int size, bool big_endian>
bool
Sized_relobj<size, big_endian>::get_symbol_location_info(
Sized_relobj_file<size, big_endian>::get_symbol_location_info(
unsigned int shndx,
off_t offset,
Symbol_location_info* info)
@ -2445,8 +2450,8 @@ Sized_relobj<size, big_endian>::get_symbol_location_info(
// debugging sections. If we can't find the kept section, return 0.
template<int size, bool big_endian>
typename Sized_relobj<size, big_endian>::Address
Sized_relobj<size, big_endian>::map_to_kept_section(
typename Sized_relobj_file<size, big_endian>::Address
Sized_relobj_file<size, big_endian>::map_to_kept_section(
unsigned int shndx,
bool* found) const
{
@ -2454,8 +2459,8 @@ Sized_relobj<size, big_endian>::map_to_kept_section(
unsigned int kept_shndx;
if (this->get_kept_comdat_section(shndx, &kept_object, &kept_shndx))
{
Sized_relobj<size, big_endian>* kept_relobj =
static_cast<Sized_relobj<size, big_endian>*>(kept_object);
Sized_relobj_file<size, big_endian>* kept_relobj =
static_cast<Sized_relobj_file<size, big_endian>*>(kept_object);
Output_section* os = kept_relobj->output_section(kept_shndx);
Address offset = kept_relobj->get_output_section_offset(kept_shndx);
if (os != NULL && offset != invalid_address)
@ -2472,7 +2477,7 @@ Sized_relobj<size, big_endian>::map_to_kept_section(
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::do_get_global_symbol_counts(
Sized_relobj_file<size, big_endian>::do_get_global_symbol_counts(
const Symbol_table*,
size_t* defined,
size_t* used) const
@ -2851,22 +2856,22 @@ Object::read_section_data<64, true>(elfcpp::Elf_file<64, true, Object>*,
#ifdef HAVE_TARGET_32_LITTLE
template
class Sized_relobj<32, false>;
class Sized_relobj_file<32, false>;
#endif
#ifdef HAVE_TARGET_32_BIG
template
class Sized_relobj<32, true>;
class Sized_relobj_file<32, true>;
#endif
#ifdef HAVE_TARGET_64_LITTLE
template
class Sized_relobj<64, false>;
class Sized_relobj_file<64, false>;
#endif
#ifdef HAVE_TARGET_64_BIG
template
class Sized_relobj<64, true>;
class Sized_relobj_file<64, true>;
#endif
#ifdef HAVE_TARGET_32_LITTLE

View File

@ -834,7 +834,7 @@ class Object
set_shnum(int shnum)
{ this->shnum_ = shnum; }
// Functions used by both Sized_relobj and Sized_dynobj.
// Functions used by both Sized_relobj_file and Sized_dynobj.
// Read the section data into a Read_symbols_data object.
template<int size, bool big_endian>
@ -916,7 +916,7 @@ class Object
};
// A regular object (ET_REL). This is an abstract base class itself.
// The implementation is the template class Sized_relobj.
// The implementation is the template class Sized_relobj_file.
class Relobj : public Object
{
@ -929,7 +929,9 @@ class Relobj : public Object
relocs_must_follow_section_writes_(false),
sd_(NULL),
reloc_counts_(NULL),
reloc_bases_(NULL)
reloc_bases_(NULL),
first_dyn_reloc_(0),
dyn_reloc_count_(0)
{ }
// During garbage collection, the Read_symbols_data pass for
@ -1022,6 +1024,25 @@ class Relobj : public Object
set_local_dynsym_offset(off_t off)
{ return this->do_set_local_dynsym_offset(off); }
// Record a dynamic relocation against an input section from this object.
void
add_dyn_reloc(unsigned int index)
{
if (this->dyn_reloc_count_ == 0)
this->first_dyn_reloc_ = index;
++this->dyn_reloc_count_;
}
// Return the index of the first dynamic relocation.
unsigned int
first_dyn_reloc() const
{ return this->first_dyn_reloc_; }
// Return the count of dynamic relocations.
unsigned int
dyn_reloc_count() const
{ return this->dyn_reloc_count_; }
// Relocate the input sections and write out the local symbols.
void
relocate(const Symbol_table* symtab, const Layout* layout, Output_file* of)
@ -1262,6 +1283,10 @@ class Relobj : public Object
unsigned int* reloc_counts_;
// Per-symbol base indexes of relocations, for incremental links.
unsigned int* reloc_bases_;
// Index of the first dynamic relocation for this object.
unsigned int first_dyn_reloc_;
// Count of dynamic relocations for this object.
unsigned int dyn_reloc_count_;
};
// This class is used to handle relocations against a section symbol
@ -1379,7 +1404,7 @@ class Symbol_value
// symbol is defined, and ADDEND is an addend to add to the value.
template<bool big_endian>
Value
value(const Sized_relobj<size, big_endian>* object, Value addend) const
value(const Sized_relobj_file<size, big_endian>* object, Value addend) const
{
if (this->has_output_value_)
return this->u_.value + addend;
@ -1678,37 +1703,155 @@ typedef std::map<unsigned int, section_size_type> Compressed_section_map;
// or an incremental (unchanged) object. This is size and endian specific.
template<int size, bool big_endian>
class Sized_relobj_base : public Relobj
class Sized_relobj : public Relobj
{
public:
typedef typename elfcpp::Elf_types<size>::Elf_Addr Address;
typedef Relobj::Symbols Symbols;
Sized_relobj_base(const std::string& name, Input_file* input_file)
: Relobj(name, input_file)
static const Address invalid_address = static_cast<Address>(0) - 1;
Sized_relobj(const std::string& name, Input_file* input_file)
: Relobj(name, input_file), local_got_offsets_(), section_offsets_()
{ }
Sized_relobj_base(const std::string& name, Input_file* input_file,
Sized_relobj(const std::string& name, Input_file* input_file,
off_t offset)
: Relobj(name, input_file, offset)
: Relobj(name, input_file, offset), local_got_offsets_(), section_offsets_()
{ }
~Sized_relobj_base()
~Sized_relobj()
{ }
// If this is a regular object, return a pointer to the Sized_relobj_file
// object. Otherwise, return NULL.
virtual Sized_relobj_file<size, big_endian>*
sized_relobj()
{ return NULL; }
const virtual Sized_relobj_file<size, big_endian>*
sized_relobj() const
{ return NULL; }
// Checks if the offset of input section SHNDX within its output
// section is invalid.
bool
is_output_section_offset_invalid(unsigned int shndx) const
{ return this->get_output_section_offset(shndx) == invalid_address; }
// Get the offset of input section SHNDX within its output section.
// This is -1 if the input section requires a special mapping, such
// as a merge section. The output section can be found in the
// output_sections_ field of the parent class Relobj.
Address
get_output_section_offset(unsigned int shndx) const
{
gold_assert(shndx < this->section_offsets_.size());
return this->section_offsets_[shndx];
}
// Return whether the local symbol SYMNDX has a GOT offset.
// For TLS symbols, the GOT entry will hold its tp-relative offset.
bool
local_has_got_offset(unsigned int symndx, unsigned int got_type) const
{
Local_got_offsets::const_iterator p =
this->local_got_offsets_.find(symndx);
return (p != this->local_got_offsets_.end()
&& p->second->get_offset(got_type) != -1U);
}
// Return the GOT offset of the local symbol SYMNDX.
unsigned int
local_got_offset(unsigned int symndx, unsigned int got_type) const
{
Local_got_offsets::const_iterator p =
this->local_got_offsets_.find(symndx);
gold_assert(p != this->local_got_offsets_.end());
unsigned int off = p->second->get_offset(got_type);
gold_assert(off != -1U);
return off;
}
// Set the GOT offset of the local symbol SYMNDX to GOT_OFFSET.
void
set_local_got_offset(unsigned int symndx, unsigned int got_type,
unsigned int got_offset)
{
Local_got_offsets::const_iterator p =
this->local_got_offsets_.find(symndx);
if (p != this->local_got_offsets_.end())
p->second->set_offset(got_type, got_offset);
else
{
Got_offset_list* g = new Got_offset_list(got_type, got_offset);
std::pair<Local_got_offsets::iterator, bool> ins =
this->local_got_offsets_.insert(std::make_pair(symndx, g));
gold_assert(ins.second);
}
}
// Iterate over local symbols, calling a visitor class V for each GOT offset
// associated with a local symbol.
void
do_for_all_local_got_entries(Got_offset_list::Visitor* v) const;
protected:
typedef Relobj::Output_sections Output_sections;
// Clear the local symbol information.
void
clear_got_offsets()
{ this->local_got_offsets_.clear(); }
// Return the vector of section offsets.
std::vector<Address>&
section_offsets()
{ return this->section_offsets_; }
// Get the offset of a section.
uint64_t
do_output_section_offset(unsigned int shndx) const
{
Address off = this->get_output_section_offset(shndx);
if (off == invalid_address)
return -1ULL;
return off;
}
// Set the offset of a section.
void
do_set_section_offset(unsigned int shndx, uint64_t off)
{
gold_assert(shndx < this->section_offsets_.size());
this->section_offsets_[shndx] =
(off == static_cast<uint64_t>(-1)
? invalid_address
: convert_types<Address, uint64_t>(off));
}
private:
// The GOT offsets of local symbols. This map also stores GOT offsets
// for tp-relative offsets for TLS symbols.
typedef Unordered_map<unsigned int, Got_offset_list*> Local_got_offsets;
// GOT offsets for local non-TLS symbols, and tp-relative offsets
// for TLS symbols, indexed by symbol number.
Local_got_offsets local_got_offsets_;
// For each input section, the offset of the input section in its
// output section. This is INVALID_ADDRESS if the input section requires a
// special mapping.
std::vector<Address> section_offsets_;
};
// A regular object file. This is size and endian specific.
template<int size, bool big_endian>
class Sized_relobj : public Sized_relobj_base<size, big_endian>
class Sized_relobj_file : public Sized_relobj<size, big_endian>
{
public:
typedef typename elfcpp::Elf_types<size>::Elf_Addr Address;
typedef typename Sized_relobj_base<size, big_endian>::Symbols Symbols;
typedef typename Sized_relobj<size, big_endian>::Symbols Symbols;
typedef std::vector<Symbol_value<size> > Local_values;
static const Address invalid_address = static_cast<Address>(0) - 1;
@ -1723,22 +1866,27 @@ class Sized_relobj : public Sized_relobj_base<size, big_endian>
CFLV_DISCARDED
};
Sized_relobj(const std::string& name, Input_file* input_file, off_t offset,
const typename elfcpp::Ehdr<size, big_endian>&);
Sized_relobj_file(const std::string& name,
Input_file* input_file,
off_t offset,
const typename elfcpp::Ehdr<size, big_endian>&);
~Sized_relobj();
// Checks if the offset of input section SHNDX within its output
// section is invalid.
bool
is_output_section_offset_invalid(unsigned int shndx) const
{ return this->get_output_section_offset(shndx) == invalid_address; }
~Sized_relobj_file();
// Set up the object file based on TARGET.
void
setup()
{ this->do_setup(); }
// Return a pointer to the Sized_relobj_file object.
Sized_relobj_file<size, big_endian>*
sized_relobj()
{ return this; }
const Sized_relobj_file<size, big_endian>*
sized_relobj() const
{ return this; }
// Return the number of symbols. This is only valid after
// Object::add_symbols has been called.
unsigned int
@ -1818,47 +1966,6 @@ class Sized_relobj : public Sized_relobj_base<size, big_endian>
this->local_values_[sym].set_needs_output_dynsym_entry();
}
// Return whether the local symbol SYMNDX has a GOT offset.
// For TLS symbols, the GOT entry will hold its tp-relative offset.
bool
local_has_got_offset(unsigned int symndx, unsigned int got_type) const
{
Local_got_offsets::const_iterator p =
this->local_got_offsets_.find(symndx);
return (p != this->local_got_offsets_.end()
&& p->second->get_offset(got_type) != -1U);
}
// Return the GOT offset of the local symbol SYMNDX.
unsigned int
local_got_offset(unsigned int symndx, unsigned int got_type) const
{
Local_got_offsets::const_iterator p =
this->local_got_offsets_.find(symndx);
gold_assert(p != this->local_got_offsets_.end());
unsigned int off = p->second->get_offset(got_type);
gold_assert(off != -1U);
return off;
}
// Set the GOT offset of the local symbol SYMNDX to GOT_OFFSET.
void
set_local_got_offset(unsigned int symndx, unsigned int got_type,
unsigned int got_offset)
{
Local_got_offsets::const_iterator p =
this->local_got_offsets_.find(symndx);
if (p != this->local_got_offsets_.end())
p->second->set_offset(got_type, got_offset);
else
{
Got_offset_list* g = new Got_offset_list(got_type, got_offset);
std::pair<Local_got_offsets::iterator, bool> ins =
this->local_got_offsets_.insert(std::make_pair(symndx, g));
gold_assert(ins.second);
}
}
// Return whether the local symbol SYMNDX has a PLT offset.
bool
local_has_plt_offset(unsigned int symndx) const;
@ -1872,17 +1979,6 @@ class Sized_relobj : public Sized_relobj_base<size, big_endian>
void
set_local_plt_offset(unsigned int symndx, unsigned int plt_offset);
// Get the offset of input section SHNDX within its output section.
// This is -1 if the input section requires a special mapping, such
// as a merge section. The output section can be found in the
// output_sections_ field of the parent class Relobj.
Address
get_output_section_offset(unsigned int shndx) const
{
gold_assert(shndx < this->section_offsets_.size());
return this->section_offsets_[shndx];
}
// Return the name of the symbol that spans the given offset in the
// specified section in this object. This is used only for error
// messages and is not particularly efficient.
@ -1913,7 +2009,7 @@ class Sized_relobj : public Sized_relobj_base<size, big_endian>
const Symbol_table* symtab);
protected:
typedef typename Sized_relobj_base<size, big_endian>::Output_sections
typedef typename Sized_relobj<size, big_endian>::Output_sections
Output_sections;
// Set up.
@ -1961,11 +2057,6 @@ class Sized_relobj : public Sized_relobj_base<size, big_endian>
do_for_all_global_symbols(Read_symbols_data* sd,
Library_base::Symbol_visitor_base* v);
// Iterate over local symbols, calling a visitor class V for each GOT offset
// associated with a local symbol.
void
do_for_all_local_got_entries(Got_offset_list::Visitor* v) const;
// Read the relocs.
void
do_read_relocs(Read_relocs_data*);
@ -2061,27 +2152,6 @@ class Sized_relobj : public Sized_relobj_base<size, big_endian>
do_get_global_symbols() const
{ return &this->symbols_; }
// Get the offset of a section.
uint64_t
do_output_section_offset(unsigned int shndx) const
{
Address off = this->get_output_section_offset(shndx);
if (off == invalid_address)
return -1ULL;
return off;
}
// Set the offset of a section.
void
do_set_section_offset(unsigned int shndx, uint64_t off)
{
gold_assert(shndx < this->section_offsets_.size());
this->section_offsets_[shndx] =
(off == static_cast<uint64_t>(-1)
? invalid_address
: convert_types<Address, uint64_t>(off));
}
// Adjust a section index if necessary.
unsigned int
adjust_shndx(unsigned int shndx)
@ -2161,7 +2231,7 @@ class Sized_relobj : public Sized_relobj_base<size, big_endian>
private:
// For convenience.
typedef Sized_relobj<size, big_endian> This;
typedef Sized_relobj_file<size, big_endian> This;
static const int ehdr_size = elfcpp::Elf_sizes<size>::ehdr_size;
static const int shdr_size = elfcpp::Elf_sizes<size>::shdr_size;
static const int sym_size = elfcpp::Elf_sizes<size>::sym_size;
@ -2369,10 +2439,6 @@ class Sized_relobj : public Sized_relobj_base<size, big_endian>
const std::vector<Address>& out_offsets,
const Symbol_table* symtab);
// The GOT offsets of local symbols. This map also stores GOT offsets
// for tp-relative offsets for TLS symbols.
typedef Unordered_map<unsigned int, Got_offset_list*> Local_got_offsets;
// The PLT offsets of local symbols.
typedef Unordered_map<unsigned int, unsigned int> Local_plt_offsets;
@ -2416,15 +2482,8 @@ class Sized_relobj : public Sized_relobj_base<size, big_endian>
off_t local_dynsym_offset_;
// Values of local symbols.
Local_values local_values_;
// GOT offsets for local non-TLS symbols, and tp-relative offsets
// for TLS symbols, indexed by symbol number.
Local_got_offsets local_got_offsets_;
// PLT offsets for local symbols.
Local_plt_offsets local_plt_offsets_;
// For each input section, the offset of the input section in its
// output section. This is INVALID_ADDRESS if the input section requires a
// special mapping.
std::vector<Address> section_offsets_;
// Table mapping discarded comdat sections to corresponding kept sections.
Kept_comdat_section_table kept_comdat_sections_;
// Whether this object has a GNU style .eh_frame section.
@ -2548,7 +2607,7 @@ struct Relocate_info
// Layout.
const Layout* layout;
// Object being relocated.
Sized_relobj<size, big_endian>* object;
Sized_relobj_file<size, big_endian>* object;
// Section index of relocation section.
unsigned int reloc_shndx;
// Section header of relocation section.

View File

@ -941,10 +941,13 @@ set_needs_dynsym_index()
default:
{
const unsigned int lsi = this->local_sym_index_;
Sized_relobj_file<size, big_endian>* relobj =
this->u1_.relobj->sized_relobj();
gold_assert(relobj != NULL);
if (!this->is_section_symbol_)
this->u1_.relobj->set_needs_output_dynsym_entry(lsi);
relobj->set_needs_output_dynsym_entry(lsi);
else
this->u1_.relobj->output_section(lsi)->set_needs_dynsym_index();
relobj->output_section(lsi)->set_needs_dynsym_index();
}
break;
}
@ -994,16 +997,19 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::get_symbol_index()
default:
{
const unsigned int lsi = this->local_sym_index_;
Sized_relobj_file<size, big_endian>* relobj =
this->u1_.relobj->sized_relobj();
gold_assert(relobj != NULL);
if (!this->is_section_symbol_)
{
if (dynamic)
index = this->u1_.relobj->dynsym_index(lsi);
index = relobj->dynsym_index(lsi);
else
index = this->u1_.relobj->symtab_index(lsi);
index = relobj->symtab_index(lsi);
}
else
{
Output_section* os = this->u1_.relobj->output_section(lsi);
Output_section* os = relobj->output_section(lsi);
gold_assert(os != NULL);
if (dynamic)
index = os->dynsym_index();
@ -1038,7 +1044,10 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::
if (offset != invalid_address)
return offset + addend;
// This is a merge section.
offset = os->output_address(this->u1_.relobj, lsi, addend);
Sized_relobj_file<size, big_endian>* relobj =
this->u1_.relobj->sized_relobj();
gold_assert(relobj != NULL);
offset = os->output_address(relobj, lsi, addend);
gold_assert(offset != invalid_address);
return offset;
}
@ -1059,8 +1068,10 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::get_address() const
address += os->address() + off;
else
{
address = os->output_address(this->u2_.relobj, this->shndx_,
address);
Sized_relobj_file<size, big_endian>* relobj =
this->u2_.relobj->sized_relobj();
gold_assert(relobj != NULL);
address = os->output_address(relobj, this->shndx_, address);
gold_assert(address != invalid_address);
}
}
@ -1113,8 +1124,11 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::symbol_value(
&& this->local_sym_index_ != 0
&& !this->is_section_symbol_);
const unsigned int lsi = this->local_sym_index_;
const Symbol_value<size>* symval = this->u1_.relobj->local_symbol(lsi);
return symval->value(this->u1_.relobj, addend);
Sized_relobj_file<size, big_endian>* relobj =
this->u1_.relobj->sized_relobj();
gold_assert(relobj != NULL);
const Symbol_value<size>* symval = relobj->local_symbol(lsi);
return symval->value(relobj, addend);
}
// Reloc comparison. This function sorts the dynamic relocs for the
@ -1265,7 +1279,7 @@ Output_relocatable_relocs<sh_type, size, big_endian>::set_final_data_size()
template<int size, bool big_endian>
Output_data_group<size, big_endian>::Output_data_group(
Sized_relobj<size, big_endian>* relobj,
Sized_relobj_file<size, big_endian>* relobj,
section_size_type entry_count,
elfcpp::Elf_Word flags,
std::vector<unsigned int>* input_shndxes)
@ -1367,7 +1381,7 @@ Output_data_got<size, big_endian>::Got_entry::write(unsigned char* pov) const
default:
{
const Sized_relobj<size, big_endian>* object = this->u_.object;
const Sized_relobj_file<size, big_endian>* object = this->u_.object;
const unsigned int lsi = this->local_sym_index_;
const Symbol_value<size>* symval = object->local_symbol(lsi);
if (!this->use_plt_offset_)
@ -1505,7 +1519,7 @@ Output_data_got<size, big_endian>::add_global_pair_with_rela(
template<int size, bool big_endian>
bool
Output_data_got<size, big_endian>::add_local(
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int symndx,
unsigned int got_type)
{
@ -1523,7 +1537,7 @@ Output_data_got<size, big_endian>::add_local(
template<int size, bool big_endian>
bool
Output_data_got<size, big_endian>::add_local_plt(
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int symndx,
unsigned int got_type)
{
@ -1542,7 +1556,7 @@ Output_data_got<size, big_endian>::add_local_plt(
template<int size, bool big_endian>
void
Output_data_got<size, big_endian>::add_local_with_rel(
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int symndx,
unsigned int got_type,
Rel_dyn* rel_dyn,
@ -1559,7 +1573,7 @@ Output_data_got<size, big_endian>::add_local_with_rel(
template<int size, bool big_endian>
void
Output_data_got<size, big_endian>::add_local_with_rela(
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int symndx,
unsigned int got_type,
Rela_dyn* rela_dyn,
@ -1579,7 +1593,7 @@ Output_data_got<size, big_endian>::add_local_with_rela(
template<int size, bool big_endian>
void
Output_data_got<size, big_endian>::add_local_pair_with_rel(
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int symndx,
unsigned int shndx,
unsigned int got_type,
@ -1604,7 +1618,7 @@ Output_data_got<size, big_endian>::add_local_pair_with_rel(
template<int size, bool big_endian>
void
Output_data_got<size, big_endian>::add_local_pair_with_rela(
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int symndx,
unsigned int shndx,
unsigned int got_type,
@ -1630,21 +1644,26 @@ Output_data_got<size, big_endian>::add_local_pair_with_rela(
template<int size, bool big_endian>
void
Output_data_got<size, big_endian>::reserve_slot(unsigned int i)
Output_data_got<size, big_endian>::reserve_local(
unsigned int i,
Sized_relobj<size, big_endian>* object,
unsigned int sym_index,
unsigned int got_type)
{
this->free_list_.remove(i * size / 8, (i + 1) * size / 8);
this->reserve_slot(i);
object->set_local_got_offset(sym_index, got_type, this->got_offset(i));
}
// Reserve a slot in the GOT for a global symbol.
template<int size, bool big_endian>
void
Output_data_got<size, big_endian>::reserve_slot_for_global(
Output_data_got<size, big_endian>::reserve_global(
unsigned int i,
Symbol* gsym,
unsigned int got_type)
{
this->free_list_.remove(i * size / 8, (i + 1) * size / 8);
this->reserve_slot(i);
gsym->set_got_offset(got_type, this->got_offset(i));
}
@ -2189,7 +2208,7 @@ Output_section::set_entsize(uint64_t v)
template<int size, bool big_endian>
off_t
Output_section::add_input_section(Layout* layout,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int shndx,
const char* secname,
const elfcpp::Shdr<size, big_endian>& shdr,
@ -4821,7 +4840,7 @@ template
off_t
Output_section::add_input_section<32, false>(
Layout* layout,
Sized_relobj<32, false>* object,
Sized_relobj_file<32, false>* object,
unsigned int shndx,
const char* secname,
const elfcpp::Shdr<32, false>& shdr,
@ -4834,7 +4853,7 @@ template
off_t
Output_section::add_input_section<32, true>(
Layout* layout,
Sized_relobj<32, true>* object,
Sized_relobj_file<32, true>* object,
unsigned int shndx,
const char* secname,
const elfcpp::Shdr<32, true>& shdr,
@ -4847,7 +4866,7 @@ template
off_t
Output_section::add_input_section<64, false>(
Layout* layout,
Sized_relobj<64, false>* object,
Sized_relobj_file<64, false>* object,
unsigned int shndx,
const char* secname,
const elfcpp::Shdr<64, false>& shdr,
@ -4860,7 +4879,7 @@ template
off_t
Output_section::add_input_section<64, true>(
Layout* layout,
Sized_relobj<64, true>* object,
Sized_relobj_file<64, true>* object,
unsigned int shndx,
const char* secname,
const elfcpp::Shdr<64, true>& shdr,

View File

@ -46,6 +46,8 @@ template<int size, bool big_endian>
class Sized_target;
template<int size, bool big_endian>
class Sized_relobj;
template<int size, bool big_endian>
class Sized_relobj_file;
// An abtract class for data which has to go into the output file.
@ -1119,6 +1121,16 @@ class Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
Address
symbol_value(Addend addend) const;
// If this relocation is against an input section, return the
// relocatable object containing the input section.
Sized_relobj<size, big_endian>*
get_relobj() const
{
if (this->shndx_ == INVALID_CODE)
return NULL;
return this->u2_.relobj;
}
// Write the reloc entry to an output view.
void
write(unsigned char* pov) const;
@ -1325,6 +1337,12 @@ class Output_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
is_symbolless() const
{ return this->rel_.is_symbolless(); }
// If this relocation is against an input section, return the
// relocatable object containing the input section.
Sized_relobj<size, big_endian>*
get_relobj() const
{ return this->rel_.get_relobj(); }
// Write the reloc entry to an output view.
void
write(unsigned char* pov) const;
@ -1437,6 +1455,9 @@ class Output_data_reloc_base : public Output_data_reloc_generic
od->add_dynamic_reloc();
if (reloc.is_relative())
this->bump_relative_reloc_count();
Sized_relobj<size, big_endian>* relobj = reloc.get_relobj();
if (relobj != NULL)
relobj->add_dyn_reloc(this->relocs_.size() - 1);
}
private:
@ -1819,9 +1840,9 @@ class Output_data_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
void
add_local_section(Sized_relobj<size, big_endian>* relobj,
unsigned int input_shndx, unsigned int type,
Output_data* od, unsigned int shndx, Address address,
Addend addend)
unsigned int input_shndx, unsigned int type,
Output_data* od, unsigned int shndx, Address address,
Addend addend)
{
this->add(od, Output_reloc_type(relobj, input_shndx, type, shndx,
address, addend, false, false, true));
@ -1910,7 +1931,7 @@ class Output_data_group : public Output_section_data
{
public:
// The constructor clears *INPUT_SHNDXES.
Output_data_group(Sized_relobj<size, big_endian>* relobj,
Output_data_group(Sized_relobj_file<size, big_endian>* relobj,
section_size_type entry_count,
elfcpp::Elf_Word flags,
std::vector<unsigned int>* input_shndxes);
@ -1930,7 +1951,7 @@ class Output_data_group : public Output_section_data
private:
// The input object.
Sized_relobj<size, big_endian>* relobj_;
Sized_relobj_file<size, big_endian>* relobj_;
// The group flag word.
elfcpp::Elf_Word flags_;
// The section indexes of the input sections in this group.
@ -2002,37 +2023,38 @@ class Output_data_got : public Output_section_data_build
// this is a new GOT entry, false if the symbol already has a GOT
// entry.
bool
add_local(Sized_relobj<size, big_endian>* object, unsigned int sym_index,
add_local(Sized_relobj_file<size, big_endian>* object, unsigned int sym_index,
unsigned int got_type);
// Like add_local, but use the PLT offset of the local symbol if it
// has one.
bool
add_local_plt(Sized_relobj<size, big_endian>* object, unsigned int sym_index,
add_local_plt(Sized_relobj_file<size, big_endian>* object,
unsigned int sym_index,
unsigned int got_type);
// Add an entry for a local symbol to the GOT, and add a dynamic
// relocation of type R_TYPE for the GOT entry.
void
add_local_with_rel(Sized_relobj<size, big_endian>* object,
add_local_with_rel(Sized_relobj_file<size, big_endian>* object,
unsigned int sym_index, unsigned int got_type,
Rel_dyn* rel_dyn, unsigned int r_type);
void
add_local_with_rela(Sized_relobj<size, big_endian>* object,
add_local_with_rela(Sized_relobj_file<size, big_endian>* object,
unsigned int sym_index, unsigned int got_type,
Rela_dyn* rela_dyn, unsigned int r_type);
// Add a pair of entries for a local symbol to the GOT, and add
// dynamic relocations of type R_TYPE_1 and R_TYPE_2, respectively.
void
add_local_pair_with_rel(Sized_relobj<size, big_endian>* object,
add_local_pair_with_rel(Sized_relobj_file<size, big_endian>* object,
unsigned int sym_index, unsigned int shndx,
unsigned int got_type, Rel_dyn* rel_dyn,
unsigned int r_type_1, unsigned int r_type_2);
void
add_local_pair_with_rela(Sized_relobj<size, big_endian>* object,
add_local_pair_with_rela(Sized_relobj_file<size, big_endian>* object,
unsigned int sym_index, unsigned int shndx,
unsigned int got_type, Rela_dyn* rela_dyn,
unsigned int r_type_1, unsigned int r_type_2);
@ -2046,13 +2068,19 @@ class Output_data_got : public Output_section_data_build
return got_offset;
}
// Reserve a slot in the GOT for a local symbol or the second slot of a pair.
// Reserve a slot in the GOT.
void
reserve_slot(unsigned int i);
reserve_slot(unsigned int i)
{ this->free_list_.remove(i * size / 8, (i + 1) * size / 8); }
// Reserve a slot in the GOT for a local symbol.
void
reserve_local(unsigned int i, Sized_relobj<size, big_endian>* object,
unsigned int sym_index, unsigned int got_type);
// Reserve a slot in the GOT for a global symbol.
void
reserve_slot_for_global(unsigned int i, Symbol* gsym, unsigned int got_type);
reserve_global(unsigned int i, Symbol* gsym, unsigned int got_type);
protected:
// Write out the GOT table.
@ -2080,7 +2108,7 @@ class Output_data_got : public Output_section_data_build
{ this->u_.gsym = gsym; }
// Create a local symbol entry.
Got_entry(Sized_relobj<size, big_endian>* object,
Got_entry(Sized_relobj_file<size, big_endian>* object,
unsigned int local_sym_index, bool use_plt_offset)
: local_sym_index_(local_sym_index), use_plt_offset_(use_plt_offset)
{
@ -2112,7 +2140,7 @@ class Output_data_got : public Output_section_data_build
union
{
// For a local symbol, the object.
Sized_relobj<size, big_endian>* object;
Sized_relobj_file<size, big_endian>* object;
// For a global symbol, the symbol.
Symbol* gsym;
// For a constant, the constant.
@ -2608,7 +2636,7 @@ class Output_section : public Output_data
// within the output section.
template<int size, bool big_endian>
off_t
add_input_section(Layout* layout, Sized_relobj<size, big_endian>* object,
add_input_section(Layout* layout, Sized_relobj_file<size, big_endian>* object,
unsigned int shndx, const char* name,
const elfcpp::Shdr<size, big_endian>& shdr,
unsigned int reloc_shndx, bool have_sections_script);

View File

@ -67,7 +67,7 @@ class Target_powerpc : public Sized_target<size, big_endian>
void
gc_process_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -81,7 +81,7 @@ class Target_powerpc : public Sized_target<size, big_endian>
void
scan_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -116,7 +116,7 @@ class Target_powerpc : public Sized_target<size, big_endian>
void
scan_relocatable_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -193,7 +193,7 @@ class Target_powerpc : public Sized_target<size, big_endian>
inline void
local(Symbol_table* symtab, Layout* layout, Target_powerpc* target,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rela<size, big_endian>& reloc, unsigned int r_type,
@ -201,7 +201,7 @@ class Target_powerpc : public Sized_target<size, big_endian>
inline void
global(Symbol_table* symtab, Layout* layout, Target_powerpc* target,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rela<size, big_endian>& reloc, unsigned int r_type,
@ -210,7 +210,7 @@ class Target_powerpc : public Sized_target<size, big_endian>
inline bool
local_reloc_may_be_function_pointer(Symbol_table* , Layout* ,
Target_powerpc* ,
Sized_relobj<size, big_endian>* ,
Sized_relobj_file<size, big_endian>* ,
unsigned int ,
Output_section* ,
const elfcpp::Rela<size, big_endian>& ,
@ -221,7 +221,7 @@ class Target_powerpc : public Sized_target<size, big_endian>
inline bool
global_reloc_may_be_function_pointer(Symbol_table* , Layout* ,
Target_powerpc* ,
Sized_relobj<size, big_endian>* ,
Sized_relobj_file<size, big_endian>* ,
unsigned int ,
Output_section* ,
const elfcpp::Rela<size,
@ -231,11 +231,11 @@ class Target_powerpc : public Sized_target<size, big_endian>
private:
static void
unsupported_reloc_local(Sized_relobj<size, big_endian>*,
unsupported_reloc_local(Sized_relobj_file<size, big_endian>*,
unsigned int r_type);
static void
unsupported_reloc_global(Sized_relobj<size, big_endian>*,
unsupported_reloc_global(Sized_relobj_file<size, big_endian>*,
unsigned int r_type, Symbol*);
static void
@ -313,7 +313,7 @@ class Target_powerpc : public Sized_target<size, big_endian>
// Create a GOT entry for the TLS module index.
unsigned int
got_mod_index_entry(Symbol_table* symtab, Layout* layout,
Sized_relobj<size, big_endian>* object);
Sized_relobj_file<size, big_endian>* object);
// Get the PLT section.
const Output_data_plt_powerpc<size, big_endian>*
@ -330,7 +330,7 @@ class Target_powerpc : public Sized_target<size, big_endian>
// Copy a relocation against a global symbol.
void
copy_reloc(Symbol_table* symtab, Layout* layout,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int shndx, Output_section* output_section,
Symbol* sym, const elfcpp::Rela<size, big_endian>& reloc)
{
@ -496,7 +496,7 @@ private:
rela(unsigned char* view,
unsigned int right_shift,
elfcpp::Elf_Xword dst_mask,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Swap<valsize, big_endian>::Valtype addend)
{
@ -517,7 +517,7 @@ private:
static inline void
rela_ua(unsigned char* view, unsigned int right_shift,
elfcpp::Elf_Xword dst_mask,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Swap<size, big_endian>::Valtype addend)
{
@ -539,7 +539,7 @@ private:
static inline void
pcrela(unsigned char* view, unsigned int right_shift,
elfcpp::Elf_Xword dst_mask,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Swap<size, big_endian>::Valtype addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -559,7 +559,7 @@ private:
template<int valsize>
static inline void
pcrela_unaligned(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Swap<size, big_endian>::Valtype addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -578,7 +578,7 @@ public:
// R_POWERPC_REL32: (Symbol + Addend - Address)
static inline void
rel32(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -587,7 +587,7 @@ public:
// R_POWERPC_REL24: (Symbol + Addend - Address) & 0x3fffffc
static inline void
rel24(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -599,7 +599,7 @@ public:
// R_POWERPC_REL14: (Symbol + Addend - Address) & 0xfffc
static inline void
rel14(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -617,7 +617,7 @@ public:
static inline void
addr16(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{ This_reloc::rela16(view, object, psymval, addend); }
@ -640,7 +640,7 @@ public:
static inline void
addr16_lo(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{ This_reloc::rela16(view, object, psymval, addend); }
@ -656,7 +656,7 @@ public:
static inline void
addr16_hi(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -684,7 +684,7 @@ public:
static inline void
addr16_ha(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -702,7 +702,7 @@ public:
// R_PPC_REL16: (Symbol + Addend - Address) & 0xffff
static inline void
rel16(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -711,7 +711,7 @@ public:
// R_PPC_REL16_LO: (Symbol + Addend - Address) & 0xffff
static inline void
rel16_lo(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -720,7 +720,7 @@ public:
// R_PPC_REL16_HI: ((Symbol + Addend - Address) >> 16) & 0xffff
static inline void
rel16_hi(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -734,7 +734,7 @@ public:
// relocation is negative, add one.
static inline void
rel16_ha(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -1068,9 +1068,10 @@ Target_powerpc<size, big_endian>::plt_entry_size() const
template<int size, bool big_endian>
unsigned int
Target_powerpc<size, big_endian>::got_mod_index_entry(Symbol_table* symtab,
Layout* layout,
Sized_relobj<size, big_endian>* object)
Target_powerpc<size, big_endian>::got_mod_index_entry(
Symbol_table* symtab,
Layout* layout,
Sized_relobj_file<size, big_endian>* object)
{
if (this->got_mod_index_offset_ == -1U)
{
@ -1176,7 +1177,7 @@ Target_powerpc<size, big_endian>::Scan::get_reference_flags(
template<int size, bool big_endian>
void
Target_powerpc<size, big_endian>::Scan::unsupported_reloc_local(
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int r_type)
{
gold_error(_("%s: unsupported reloc %u against local symbol"),
@ -1284,7 +1285,7 @@ Target_powerpc<size, big_endian>::Scan::local(
Symbol_table* symtab,
Layout* layout,
Target_powerpc<size, big_endian>* target,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rela<size, big_endian>& reloc,
@ -1402,7 +1403,7 @@ Target_powerpc<size, big_endian>::Scan::local(
template<int size, bool big_endian>
void
Target_powerpc<size, big_endian>::Scan::unsupported_reloc_global(
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int r_type,
Symbol* gsym)
{
@ -1418,7 +1419,7 @@ Target_powerpc<size, big_endian>::Scan::global(
Symbol_table* symtab,
Layout* layout,
Target_powerpc<size, big_endian>* target,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rela<size, big_endian>& reloc,
@ -1609,7 +1610,7 @@ void
Target_powerpc<size, big_endian>::gc_process_relocs(
Symbol_table* symtab,
Layout* layout,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
unsigned int,
const unsigned char* prelocs,
@ -1644,7 +1645,7 @@ void
Target_powerpc<size, big_endian>::scan_relocs(
Symbol_table* symtab,
Layout* layout,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -1756,7 +1757,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
psymval = &symval;
}
const Sized_relobj<size, big_endian>* object = relinfo->object;
const Sized_relobj_file<size, big_endian>* object = relinfo->object;
elfcpp::Elf_Xword addend = rela.get_r_addend();
// Get the GOT offset if needed. Unlike i386 and x86_64, our GOT
@ -1959,7 +1960,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate_tls(
{
Output_segment* tls_segment = relinfo->layout->tls_segment();
typedef Powerpc_relocate_functions<size, big_endian> Reloc;
const Sized_relobj<size, big_endian>* object = relinfo->object;
const Sized_relobj_file<size, big_endian>* object = relinfo->object;
const elfcpp::Elf_Xword addend = rela.get_r_addend();
typename elfcpp::Elf_types<size>::Elf_Addr value = psymval->value(object, 0);
@ -2033,7 +2034,7 @@ void
Target_powerpc<size, big_endian>::scan_relocatable_relocs(
Symbol_table* symtab,
Layout* layout,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,

View File

@ -258,7 +258,7 @@ Relocate_task::get_name() const
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::do_read_relocs(Read_relocs_data* rd)
Sized_relobj_file<size, big_endian>::do_read_relocs(Read_relocs_data* rd)
{
rd->relocs.clear();
@ -269,7 +269,7 @@ Sized_relobj<size, big_endian>::do_read_relocs(Read_relocs_data* rd)
rd->relocs.reserve(shnum / 2);
const Output_sections& out_sections(this->output_sections());
const std::vector<Address>& out_offsets(this->section_offsets_);
const std::vector<Address>& out_offsets(this->section_offsets());
const unsigned char* pshdrs = this->get_view(this->elf_file_.shoff(),
shnum * This::shdr_size,
@ -380,9 +380,9 @@ Sized_relobj<size, big_endian>::do_read_relocs(Read_relocs_data* rd)
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::do_gc_process_relocs(Symbol_table* symtab,
Layout* layout,
Read_relocs_data* rd)
Sized_relobj_file<size, big_endian>::do_gc_process_relocs(Symbol_table* symtab,
Layout* layout,
Read_relocs_data* rd)
{
Sized_target<size, big_endian>* target =
parameters->sized_target<size, big_endian>();
@ -420,7 +420,7 @@ Sized_relobj<size, big_endian>::do_gc_process_relocs(Symbol_table* symtab,
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::do_scan_relocs(Symbol_table* symtab,
Sized_relobj_file<size, big_endian>::do_scan_relocs(Symbol_table* symtab,
Layout* layout,
Read_relocs_data* rd)
{
@ -537,7 +537,7 @@ class Emit_relocs_strategy
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::emit_relocs_scan(
Sized_relobj_file<size, big_endian>::emit_relocs_scan(
Symbol_table* symtab,
Layout* layout,
const unsigned char* plocal_syms,
@ -564,7 +564,7 @@ Sized_relobj<size, big_endian>::emit_relocs_scan(
template<int size, bool big_endian>
template<int sh_type>
void
Sized_relobj<size, big_endian>::emit_relocs_scan_reltype(
Sized_relobj_file<size, big_endian>::emit_relocs_scan_reltype(
Symbol_table* symtab,
Layout* layout,
const unsigned char* plocal_syms,
@ -590,7 +590,7 @@ Sized_relobj<size, big_endian>::emit_relocs_scan_reltype(
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::incremental_relocs_scan(
Sized_relobj_file<size, big_endian>::incremental_relocs_scan(
const Read_relocs_data::Relocs_list::iterator& p)
{
if (p->sh_type == elfcpp::SHT_REL)
@ -608,7 +608,7 @@ Sized_relobj<size, big_endian>::incremental_relocs_scan(
template<int size, bool big_endian>
template<int sh_type>
void
Sized_relobj<size, big_endian>::incremental_relocs_scan_reltype(
Sized_relobj_file<size, big_endian>::incremental_relocs_scan_reltype(
const Read_relocs_data::Relocs_list::iterator& p)
{
typedef typename Reloc_types<sh_type, size, big_endian>::Reloc Reltype;
@ -638,9 +638,9 @@ Sized_relobj<size, big_endian>::incremental_relocs_scan_reltype(
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::do_relocate(const Symbol_table* symtab,
const Layout* layout,
Output_file* of)
Sized_relobj_file<size, big_endian>::do_relocate(const Symbol_table* symtab,
const Layout* layout,
Output_file* of)
{
unsigned int shnum = this->shnum();
@ -709,13 +709,13 @@ struct Read_multiple_compare
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::write_sections(const unsigned char* pshdrs,
Output_file* of,
Views* pviews)
Sized_relobj_file<size, big_endian>::write_sections(const unsigned char* pshdrs,
Output_file* of,
Views* pviews)
{
unsigned int shnum = this->shnum();
const Output_sections& out_sections(this->output_sections());
const std::vector<Address>& out_offsets(this->section_offsets_);
const std::vector<Address>& out_offsets(this->section_offsets());
File_read::Read_multiple rm;
bool is_sorted = true;
@ -888,7 +888,7 @@ Sized_relobj<size, big_endian>::write_sections(const unsigned char* pshdrs,
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::do_relocate_sections(
Sized_relobj_file<size, big_endian>::do_relocate_sections(
const Symbol_table* symtab,
const Layout* layout,
const unsigned char* pshdrs,
@ -900,7 +900,7 @@ Sized_relobj<size, big_endian>::do_relocate_sections(
parameters->sized_target<size, big_endian>();
const Output_sections& out_sections(this->output_sections());
const std::vector<Address>& out_offsets(this->section_offsets_);
const std::vector<Address>& out_offsets(this->section_offsets());
Relocate_info<size, big_endian> relinfo;
relinfo.symtab = symtab;
@ -1024,7 +1024,7 @@ Sized_relobj<size, big_endian>::do_relocate_sections(
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::emit_relocs(
Sized_relobj_file<size, big_endian>::emit_relocs(
const Relocate_info<size, big_endian>* relinfo,
unsigned int i,
unsigned int sh_type,
@ -1061,7 +1061,7 @@ Sized_relobj<size, big_endian>::emit_relocs(
template<int size, bool big_endian>
template<int sh_type>
void
Sized_relobj<size, big_endian>::emit_relocs_reltype(
Sized_relobj_file<size, big_endian>::emit_relocs_reltype(
const Relocate_info<size, big_endian>* relinfo,
unsigned int i,
const unsigned char* prelocs,
@ -1093,7 +1093,7 @@ Sized_relobj<size, big_endian>::emit_relocs_reltype(
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::incremental_relocs_write(
Sized_relobj_file<size, big_endian>::incremental_relocs_write(
const Relocate_info<size, big_endian>* relinfo,
unsigned int sh_type,
const unsigned char* prelocs,
@ -1129,7 +1129,7 @@ Sized_relobj<size, big_endian>::incremental_relocs_write(
template<int size, bool big_endian>
template<int sh_type>
void
Sized_relobj<size, big_endian>::incremental_relocs_write_reltype(
Sized_relobj_file<size, big_endian>::incremental_relocs_write_reltype(
const Relocate_info<size, big_endian>* relinfo,
const unsigned char* prelocs,
size_t reloc_count,
@ -1215,7 +1215,7 @@ Sized_relobj<size, big_endian>::incremental_relocs_write_reltype(
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::initialize_input_to_output_maps()
Sized_relobj_file<size, big_endian>::initialize_input_to_output_maps()
{
const unsigned int loccount = this->local_symbol_count_;
for (unsigned int i = 1; i < loccount; ++i)
@ -1229,7 +1229,7 @@ Sized_relobj<size, big_endian>::initialize_input_to_output_maps()
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::free_input_to_output_maps()
Sized_relobj_file<size, big_endian>::free_input_to_output_maps()
{
const unsigned int loccount = this->local_symbol_count_;
for (unsigned int i = 1; i < loccount; ++i)
@ -1247,7 +1247,7 @@ Sized_relobj<size, big_endian>::free_input_to_output_maps()
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::split_stack_adjust(
Sized_relobj_file<size, big_endian>::split_stack_adjust(
const Symbol_table* symtab,
const unsigned char* pshdrs,
unsigned int sh_type,
@ -1279,7 +1279,7 @@ Sized_relobj<size, big_endian>::split_stack_adjust(
template<int size, bool big_endian>
template<int sh_type>
void
Sized_relobj<size, big_endian>::split_stack_adjust_reltype(
Sized_relobj_file<size, big_endian>::split_stack_adjust_reltype(
const Symbol_table* symtab,
const unsigned char* pshdrs,
unsigned int shndx,
@ -1436,10 +1436,10 @@ Sized_relobj<size, big_endian>::split_stack_adjust_reltype(
template<int size, bool big_endian>
void
Sized_relobj<size, big_endian>::find_functions(
Sized_relobj_file<size, big_endian>::find_functions(
const unsigned char* pshdrs,
unsigned int shndx,
Sized_relobj<size, big_endian>::Function_offsets* function_offsets)
Sized_relobj_file<size, big_endian>::Function_offsets* function_offsets)
{
// We need to read the symbols to find the functions. If we wanted
// to, we could cache reading the symbols across all sections in the
@ -1636,127 +1636,127 @@ Track_relocs<size, big_endian>::advance(off_t offset)
#ifdef HAVE_TARGET_32_LITTLE
template
void
Sized_relobj<32, false>::do_read_relocs(Read_relocs_data* rd);
Sized_relobj_file<32, false>::do_read_relocs(Read_relocs_data* rd);
#endif
#ifdef HAVE_TARGET_32_BIG
template
void
Sized_relobj<32, true>::do_read_relocs(Read_relocs_data* rd);
Sized_relobj_file<32, true>::do_read_relocs(Read_relocs_data* rd);
#endif
#ifdef HAVE_TARGET_64_LITTLE
template
void
Sized_relobj<64, false>::do_read_relocs(Read_relocs_data* rd);
Sized_relobj_file<64, false>::do_read_relocs(Read_relocs_data* rd);
#endif
#ifdef HAVE_TARGET_64_BIG
template
void
Sized_relobj<64, true>::do_read_relocs(Read_relocs_data* rd);
Sized_relobj_file<64, true>::do_read_relocs(Read_relocs_data* rd);
#endif
#ifdef HAVE_TARGET_32_LITTLE
template
void
Sized_relobj<32, false>::do_gc_process_relocs(Symbol_table* symtab,
Layout* layout,
Read_relocs_data* rd);
Sized_relobj_file<32, false>::do_gc_process_relocs(Symbol_table* symtab,
Layout* layout,
Read_relocs_data* rd);
#endif
#ifdef HAVE_TARGET_32_BIG
template
void
Sized_relobj<32, true>::do_gc_process_relocs(Symbol_table* symtab,
Sized_relobj_file<32, true>::do_gc_process_relocs(Symbol_table* symtab,
Layout* layout,
Read_relocs_data* rd);
#endif
#ifdef HAVE_TARGET_64_LITTLE
template
void
Sized_relobj_file<64, false>::do_gc_process_relocs(Symbol_table* symtab,
Layout* layout,
Read_relocs_data* rd);
#endif
#ifdef HAVE_TARGET_64_BIG
template
void
Sized_relobj_file<64, true>::do_gc_process_relocs(Symbol_table* symtab,
Layout* layout,
Read_relocs_data* rd);
#endif
#ifdef HAVE_TARGET_32_LITTLE
template
void
Sized_relobj_file<32, false>::do_scan_relocs(Symbol_table* symtab,
Layout* layout,
Read_relocs_data* rd);
#endif
#ifdef HAVE_TARGET_32_BIG
template
void
Sized_relobj_file<32, true>::do_scan_relocs(Symbol_table* symtab,
Layout* layout,
Read_relocs_data* rd);
#endif
#ifdef HAVE_TARGET_64_LITTLE
template
void
Sized_relobj<64, false>::do_gc_process_relocs(Symbol_table* symtab,
Layout* layout,
Read_relocs_data* rd);
#endif
#ifdef HAVE_TARGET_64_BIG
template
void
Sized_relobj<64, true>::do_gc_process_relocs(Symbol_table* symtab,
Sized_relobj_file<64, false>::do_scan_relocs(Symbol_table* symtab,
Layout* layout,
Read_relocs_data* rd);
#endif
#ifdef HAVE_TARGET_64_BIG
template
void
Sized_relobj_file<64, true>::do_scan_relocs(Symbol_table* symtab,
Layout* layout,
Read_relocs_data* rd);
#endif
#ifdef HAVE_TARGET_32_LITTLE
template
void
Sized_relobj<32, false>::do_scan_relocs(Symbol_table* symtab,
Layout* layout,
Read_relocs_data* rd);
Sized_relobj_file<32, false>::do_relocate(const Symbol_table* symtab,
const Layout* layout,
Output_file* of);
#endif
#ifdef HAVE_TARGET_32_BIG
template
void
Sized_relobj<32, true>::do_scan_relocs(Symbol_table* symtab,
Layout* layout,
Read_relocs_data* rd);
Sized_relobj_file<32, true>::do_relocate(const Symbol_table* symtab,
const Layout* layout,
Output_file* of);
#endif
#ifdef HAVE_TARGET_64_LITTLE
template
void
Sized_relobj<64, false>::do_scan_relocs(Symbol_table* symtab,
Layout* layout,
Read_relocs_data* rd);
Sized_relobj_file<64, false>::do_relocate(const Symbol_table* symtab,
const Layout* layout,
Output_file* of);
#endif
#ifdef HAVE_TARGET_64_BIG
template
void
Sized_relobj<64, true>::do_scan_relocs(Symbol_table* symtab,
Layout* layout,
Read_relocs_data* rd);
Sized_relobj_file<64, true>::do_relocate(const Symbol_table* symtab,
const Layout* layout,
Output_file* of);
#endif
#ifdef HAVE_TARGET_32_LITTLE
template
void
Sized_relobj<32, false>::do_relocate(const Symbol_table* symtab,
const Layout* layout,
Output_file* of);
#endif
#ifdef HAVE_TARGET_32_BIG
template
void
Sized_relobj<32, true>::do_relocate(const Symbol_table* symtab,
const Layout* layout,
Output_file* of);
#endif
#ifdef HAVE_TARGET_64_LITTLE
template
void
Sized_relobj<64, false>::do_relocate(const Symbol_table* symtab,
const Layout* layout,
Output_file* of);
#endif
#ifdef HAVE_TARGET_64_BIG
template
void
Sized_relobj<64, true>::do_relocate(const Symbol_table* symtab,
const Layout* layout,
Output_file* of);
#endif
#ifdef HAVE_TARGET_32_LITTLE
template
void
Sized_relobj<32, false>::do_relocate_sections(
Sized_relobj_file<32, false>::do_relocate_sections(
const Symbol_table* symtab,
const Layout* layout,
const unsigned char* pshdrs,
@ -1767,7 +1767,7 @@ Sized_relobj<32, false>::do_relocate_sections(
#ifdef HAVE_TARGET_32_BIG
template
void
Sized_relobj<32, true>::do_relocate_sections(
Sized_relobj_file<32, true>::do_relocate_sections(
const Symbol_table* symtab,
const Layout* layout,
const unsigned char* pshdrs,
@ -1778,7 +1778,7 @@ Sized_relobj<32, true>::do_relocate_sections(
#ifdef HAVE_TARGET_64_LITTLE
template
void
Sized_relobj<64, false>::do_relocate_sections(
Sized_relobj_file<64, false>::do_relocate_sections(
const Symbol_table* symtab,
const Layout* layout,
const unsigned char* pshdrs,
@ -1789,7 +1789,7 @@ Sized_relobj<64, false>::do_relocate_sections(
#ifdef HAVE_TARGET_64_BIG
template
void
Sized_relobj<64, true>::do_relocate_sections(
Sized_relobj_file<64, true>::do_relocate_sections(
const Symbol_table* symtab,
const Layout* layout,
const unsigned char* pshdrs,
@ -1800,41 +1800,41 @@ Sized_relobj<64, true>::do_relocate_sections(
#ifdef HAVE_TARGET_32_LITTLE
template
void
Sized_relobj<32, false>::initialize_input_to_output_maps();
Sized_relobj_file<32, false>::initialize_input_to_output_maps();
template
void
Sized_relobj<32, false>::free_input_to_output_maps();
Sized_relobj_file<32, false>::free_input_to_output_maps();
#endif
#ifdef HAVE_TARGET_32_BIG
template
void
Sized_relobj<32, true>::initialize_input_to_output_maps();
Sized_relobj_file<32, true>::initialize_input_to_output_maps();
template
void
Sized_relobj<32, true>::free_input_to_output_maps();
Sized_relobj_file<32, true>::free_input_to_output_maps();
#endif
#ifdef HAVE_TARGET_64_LITTLE
template
void
Sized_relobj<64, false>::initialize_input_to_output_maps();
Sized_relobj_file<64, false>::initialize_input_to_output_maps();
template
void
Sized_relobj<64, false>::free_input_to_output_maps();
Sized_relobj_file<64, false>::free_input_to_output_maps();
#endif
#ifdef HAVE_TARGET_64_BIG
template
void
Sized_relobj<64, true>::initialize_input_to_output_maps();
Sized_relobj_file<64, true>::initialize_input_to_output_maps();
template
void
Sized_relobj<64, true>::free_input_to_output_maps();
Sized_relobj_file<64, true>::free_input_to_output_maps();
#endif
#if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG)

View File

@ -47,7 +47,7 @@ template<int size>
class Sized_symbol;
template<int size, bool big_endian>
class Sized_relobj;
class Sized_relobj_file;
template<int size>
class Symbol_value;
@ -337,7 +337,7 @@ private:
template<int valsize>
static inline void
rel(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval)
{
typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
@ -365,7 +365,7 @@ private:
template<int valsize>
static inline void
rela(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Swap<valsize, big_endian>::Valtype addend)
{
@ -395,7 +395,7 @@ private:
template<int valsize>
static inline void
pcrel(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr address)
{
@ -425,7 +425,7 @@ private:
template<int valsize>
static inline void
pcrela(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Swap<valsize, big_endian>::Valtype addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -447,7 +447,7 @@ public:
static inline void
rel8(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval)
{ This::template rel<8>(view, object, psymval); }
@ -458,7 +458,7 @@ public:
static inline void
rela8(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
unsigned char addend)
{ This::template rela<8>(view, object, psymval, addend); }
@ -472,7 +472,7 @@ public:
static inline void
pcrel8(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr address)
{ This::template pcrel<8>(view, object, psymval, address); }
@ -486,7 +486,7 @@ public:
static inline void
pcrela8(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
unsigned char addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -500,7 +500,7 @@ public:
static inline void
rel16(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval)
{ This::template rel<16>(view, object, psymval); }
@ -511,7 +511,7 @@ public:
static inline void
rela16(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
elfcpp::Elf_Half addend)
{ This::template rela<16>(view, object, psymval, addend); }
@ -525,7 +525,7 @@ public:
static inline void
pcrel16(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr address)
{ This::template pcrel<16>(view, object, psymval, address); }
@ -540,7 +540,7 @@ public:
static inline void
pcrela16(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
elfcpp::Elf_Half addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -554,7 +554,7 @@ public:
static inline void
rel32(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval)
{ This::template rel<32>(view, object, psymval); }
@ -565,7 +565,7 @@ public:
static inline void
rela32(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
elfcpp::Elf_Word addend)
{ This::template rela<32>(view, object, psymval, addend); }
@ -579,7 +579,7 @@ public:
static inline void
pcrel32(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr address)
{ This::template pcrel<32>(view, object, psymval, address); }
@ -594,7 +594,7 @@ public:
static inline void
pcrela32(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
elfcpp::Elf_Word addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -608,7 +608,7 @@ public:
static inline void
rel64(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval)
{ This::template rel<64>(view, object, psymval); }
@ -620,7 +620,7 @@ public:
static inline void
rela64(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
elfcpp::Elf_Xword addend)
{ This::template rela<64>(view, object, psymval, addend); }
@ -634,7 +634,7 @@ public:
static inline void
pcrel64(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr address)
{ This::template pcrel<64>(view, object, psymval, address); }
@ -649,7 +649,7 @@ public:
static inline void
pcrela64(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
elfcpp::Elf_Xword addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)

View File

@ -69,7 +69,7 @@ class Target_sparc : public Sized_target<size, big_endian>
void
gc_process_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -83,7 +83,7 @@ class Target_sparc : public Sized_target<size, big_endian>
void
scan_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -118,7 +118,7 @@ class Target_sparc : public Sized_target<size, big_endian>
void
scan_relocatable_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -203,7 +203,7 @@ class Target_sparc : public Sized_target<size, big_endian>
inline void
local(Symbol_table* symtab, Layout* layout, Target_sparc* target,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rela<size, big_endian>& reloc, unsigned int r_type,
@ -211,7 +211,7 @@ class Target_sparc : public Sized_target<size, big_endian>
inline void
global(Symbol_table* symtab, Layout* layout, Target_sparc* target,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rela<size, big_endian>& reloc, unsigned int r_type,
@ -220,7 +220,7 @@ class Target_sparc : public Sized_target<size, big_endian>
inline bool
local_reloc_may_be_function_pointer(Symbol_table* , Layout* ,
Target_sparc* ,
Sized_relobj<size, big_endian>* ,
Sized_relobj_file<size, big_endian>* ,
unsigned int ,
Output_section* ,
const elfcpp::Rela<size, big_endian>& ,
@ -231,7 +231,7 @@ class Target_sparc : public Sized_target<size, big_endian>
inline bool
global_reloc_may_be_function_pointer(Symbol_table* , Layout* ,
Target_sparc* ,
Sized_relobj<size, big_endian>* ,
Sized_relobj_file<size, big_endian>* ,
unsigned int ,
Output_section* ,
const elfcpp::Rela<size,
@ -242,11 +242,11 @@ class Target_sparc : public Sized_target<size, big_endian>
private:
static void
unsupported_reloc_local(Sized_relobj<size, big_endian>*,
unsupported_reloc_local(Sized_relobj_file<size, big_endian>*,
unsigned int r_type);
static void
unsupported_reloc_global(Sized_relobj<size, big_endian>*,
unsupported_reloc_global(Sized_relobj_file<size, big_endian>*,
unsigned int r_type, Symbol*);
static void
@ -324,7 +324,7 @@ class Target_sparc : public Sized_target<size, big_endian>
// Create a GOT entry for the TLS module index.
unsigned int
got_mod_index_entry(Symbol_table* symtab, Layout* layout,
Sized_relobj<size, big_endian>* object);
Sized_relobj_file<size, big_endian>* object);
// Return the gsym for "__tls_get_addr". Cache if not already
// cached.
@ -352,7 +352,7 @@ class Target_sparc : public Sized_target<size, big_endian>
// Copy a relocation against a global symbol.
void
copy_reloc(Symbol_table* symtab, Layout* layout,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int shndx, Output_section* output_section,
Symbol* sym, const elfcpp::Rela<size, big_endian>& reloc)
{
@ -472,7 +472,7 @@ private:
rela(unsigned char* view,
unsigned int right_shift,
typename elfcpp::Elf_types<valsize>::Elf_Addr dst_mask,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Swap<valsize, big_endian>::Valtype addend)
{
@ -493,7 +493,7 @@ private:
static inline void
rela_ua(unsigned char* view,
unsigned int right_shift, elfcpp::Elf_Xword dst_mask,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Swap<size, big_endian>::Valtype addend)
{
@ -516,7 +516,7 @@ private:
pcrela(unsigned char* view,
unsigned int right_shift,
typename elfcpp::Elf_types<valsize>::Elf_Addr dst_mask,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Swap<size, big_endian>::Valtype addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -536,7 +536,7 @@ private:
template<int valsize>
static inline void
pcrela_unaligned(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Swap<size, big_endian>::Valtype addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -556,7 +556,7 @@ public:
// R_SPARC_WDISP30: (Symbol + Addend - Address) >> 2
static inline void
wdisp30(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -568,7 +568,7 @@ public:
// R_SPARC_WDISP22: (Symbol + Addend - Address) >> 2
static inline void
wdisp22(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -580,7 +580,7 @@ public:
// R_SPARC_WDISP19: (Symbol + Addend - Address) >> 2
static inline void
wdisp19(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -592,7 +592,7 @@ public:
// R_SPARC_WDISP16: (Symbol + Addend - Address) >> 2
static inline void
wdisp16(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -615,7 +615,7 @@ public:
// R_SPARC_PC22: (Symbol + Addend - Address) >> 10
static inline void
pc22(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -627,7 +627,7 @@ public:
// R_SPARC_PC10: (Symbol + Addend - Address) & 0x3ff
static inline void
pc10(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -648,7 +648,7 @@ public:
// R_SPARC_HI22: (Symbol + Addend) >> 10
static inline void
hi22(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -658,7 +658,7 @@ public:
// R_SPARC_PCPLT22: (Symbol + Addend - Address) >> 10
static inline void
pcplt22(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -679,7 +679,7 @@ public:
// R_SPARC_LO10: (Symbol + Addend) & 0x3ff
static inline void
lo10(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -689,7 +689,7 @@ public:
// R_SPARC_LO10: (Symbol + Addend) & 0x3ff
static inline void
lo10(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -701,7 +701,7 @@ public:
// R_SPARC_OLO10: ((Symbol + Addend) & 0x3ff) + Addend2
static inline void
olo10(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr addend2)
@ -722,7 +722,7 @@ public:
// R_SPARC_22: (Symbol + Addend)
static inline void
rela32_22(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -741,7 +741,7 @@ public:
// R_SPARC_13: (Symbol + Addend)
static inline void
rela32_13(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -751,7 +751,7 @@ public:
// R_SPARC_UA16: (Symbol + Addend)
static inline void
ua16(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -761,7 +761,7 @@ public:
// R_SPARC_UA32: (Symbol + Addend)
static inline void
ua32(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -771,7 +771,7 @@ public:
// R_SPARC_UA64: (Symbol + Addend)
static inline void
ua64(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -782,7 +782,7 @@ public:
// R_SPARC_DISP8: (Symbol + Addend - Address)
static inline void
disp8(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -794,7 +794,7 @@ public:
// R_SPARC_DISP16: (Symbol + Addend - Address)
static inline void
disp16(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -806,7 +806,7 @@ public:
// R_SPARC_DISP32: (Symbol + Addend - Address)
static inline void
disp32(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -818,7 +818,7 @@ public:
// R_SPARC_DISP64: (Symbol + Addend - Address)
static inline void
disp64(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
elfcpp::Elf_Xword addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -830,7 +830,7 @@ public:
// R_SPARC_H44: (Symbol + Addend) >> 22
static inline void
h44(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -840,7 +840,7 @@ public:
// R_SPARC_M44: ((Symbol + Addend) >> 12) & 0x3ff
static inline void
m44(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -850,7 +850,7 @@ public:
// R_SPARC_L44: (Symbol + Addend) & 0xfff
static inline void
l44(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -860,7 +860,7 @@ public:
// R_SPARC_HH22: (Symbol + Addend) >> 42
static inline void
hh22(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -870,7 +870,7 @@ public:
// R_SPARC_PC_HH22: (Symbol + Addend - Address) >> 42
static inline void
pc_hh22(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -882,7 +882,7 @@ public:
// R_SPARC_HM10: ((Symbol + Addend) >> 32) & 0x3ff
static inline void
hm10(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -892,7 +892,7 @@ public:
// R_SPARC_PC_HM10: ((Symbol + Addend - Address) >> 32) & 0x3ff
static inline void
pc_hm10(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend,
typename elfcpp::Elf_types<size>::Elf_Addr address)
@ -904,7 +904,7 @@ public:
// R_SPARC_11: (Symbol + Addend)
static inline void
rela32_11(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -914,7 +914,7 @@ public:
// R_SPARC_10: (Symbol + Addend)
static inline void
rela32_10(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -924,7 +924,7 @@ public:
// R_SPARC_7: (Symbol + Addend)
static inline void
rela32_7(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -934,7 +934,7 @@ public:
// R_SPARC_6: (Symbol + Addend)
static inline void
rela32_6(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -944,7 +944,7 @@ public:
// R_SPARC_5: (Symbol + Addend)
static inline void
rela32_5(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -1001,7 +1001,7 @@ public:
// R_SPARC_HIX22: ((Symbol + Addend) ^ 0xffffffffffffffff) >> 10
static inline void
hix22(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -1042,7 +1042,7 @@ public:
// R_SPARC_LOX10: ((Symbol + Addend) & 0x3ff) | 0x1c00
static inline void
lox10(unsigned char* view,
const Sized_relobj<size, big_endian>* object,
const Sized_relobj_file<size, big_endian>* object,
const Symbol_value<size>* psymval,
typename elfcpp::Elf_types<size>::Elf_Addr addend)
{
@ -1490,9 +1490,10 @@ Target_sparc<size, big_endian>::plt_entry_size() const
template<int size, bool big_endian>
unsigned int
Target_sparc<size, big_endian>::got_mod_index_entry(Symbol_table* symtab,
Layout* layout,
Sized_relobj<size, big_endian>* object)
Target_sparc<size, big_endian>::got_mod_index_entry(
Symbol_table* symtab,
Layout* layout,
Sized_relobj_file<size, big_endian>* object)
{
if (this->got_mod_index_offset_ == -1U)
{
@ -1709,7 +1710,7 @@ Target_sparc<size, big_endian>::Scan::generate_tls_call(Symbol_table* symtab,
template<int size, bool big_endian>
void
Target_sparc<size, big_endian>::Scan::unsupported_reloc_local(
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int r_type)
{
gold_error(_("%s: unsupported reloc %u against local symbol"),
@ -1816,7 +1817,7 @@ Target_sparc<size, big_endian>::Scan::local(
Symbol_table* symtab,
Layout* layout,
Target_sparc<size, big_endian>* target,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rela<size, big_endian>& reloc,
@ -2104,7 +2105,7 @@ Target_sparc<size, big_endian>::Scan::local(
template<int size, bool big_endian>
void
Target_sparc<size, big_endian>::Scan::unsupported_reloc_global(
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int r_type,
Symbol* gsym)
{
@ -2120,7 +2121,7 @@ Target_sparc<size, big_endian>::Scan::global(
Symbol_table* symtab,
Layout* layout,
Target_sparc<size, big_endian>* target,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rela<size, big_endian>& reloc,
@ -2498,7 +2499,7 @@ void
Target_sparc<size, big_endian>::gc_process_relocs(
Symbol_table* symtab,
Layout* layout,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
unsigned int,
const unsigned char* prelocs,
@ -2533,7 +2534,7 @@ void
Target_sparc<size, big_endian>::scan_relocs(
Symbol_table* symtab,
Layout* layout,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -2636,7 +2637,7 @@ Target_sparc<size, big_endian>::Relocate::relocate(
psymval = &symval;
}
const Sized_relobj<size, big_endian>* object = relinfo->object;
const Sized_relobj_file<size, big_endian>* object = relinfo->object;
const elfcpp::Elf_Xword addend = rela.get_r_addend();
// Get the GOT offset if needed. Unlike i386 and x86_64, our GOT
@ -2979,7 +2980,7 @@ Target_sparc<size, big_endian>::Relocate::relocate_tls(
{
Output_segment* tls_segment = relinfo->layout->tls_segment();
typedef Sparc_relocate_functions<size, big_endian> Reloc;
const Sized_relobj<size, big_endian>* object = relinfo->object;
const Sized_relobj_file<size, big_endian>* object = relinfo->object;
typedef typename elfcpp::Swap<32, true>::Valtype Insntype;
const elfcpp::Elf_Xword addend = rela.get_r_addend();
@ -3392,7 +3393,7 @@ void
Target_sparc<size, big_endian>::scan_relocatable_relocs(
Symbol_table* symtab,
Layout* layout,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,

View File

@ -1048,13 +1048,13 @@ Symbol_table::add_from_object(Object* object,
template<int size, bool big_endian>
void
Symbol_table::add_from_relobj(
Sized_relobj<size, big_endian>* relobj,
Sized_relobj_file<size, big_endian>* relobj,
const unsigned char* syms,
size_t count,
size_t symndx_offset,
const char* sym_names,
size_t sym_name_size,
typename Sized_relobj<size, big_endian>::Symbols* sympointers,
typename Sized_relobj_file<size, big_endian>::Symbols* sympointers,
size_t* defined)
{
*defined = 0;
@ -1304,7 +1304,7 @@ Symbol_table::add_from_dynobj(
const unsigned char* versym,
size_t versym_size,
const std::vector<const char*>* version_map,
typename Sized_relobj<size, big_endian>::Symbols* sympointers,
typename Sized_relobj_file<size, big_endian>::Symbols* sympointers,
size_t* defined)
{
*defined = 0;
@ -3295,13 +3295,13 @@ Sized_symbol<64>::allocate_common(Output_data*, Value_type);
template
void
Symbol_table::add_from_relobj<32, false>(
Sized_relobj<32, false>* relobj,
Sized_relobj_file<32, false>* relobj,
const unsigned char* syms,
size_t count,
size_t symndx_offset,
const char* sym_names,
size_t sym_name_size,
Sized_relobj<32, false>::Symbols* sympointers,
Sized_relobj_file<32, false>::Symbols* sympointers,
size_t* defined);
#endif
@ -3309,13 +3309,13 @@ Symbol_table::add_from_relobj<32, false>(
template
void
Symbol_table::add_from_relobj<32, true>(
Sized_relobj<32, true>* relobj,
Sized_relobj_file<32, true>* relobj,
const unsigned char* syms,
size_t count,
size_t symndx_offset,
const char* sym_names,
size_t sym_name_size,
Sized_relobj<32, true>::Symbols* sympointers,
Sized_relobj_file<32, true>::Symbols* sympointers,
size_t* defined);
#endif
@ -3323,13 +3323,13 @@ Symbol_table::add_from_relobj<32, true>(
template
void
Symbol_table::add_from_relobj<64, false>(
Sized_relobj<64, false>* relobj,
Sized_relobj_file<64, false>* relobj,
const unsigned char* syms,
size_t count,
size_t symndx_offset,
const char* sym_names,
size_t sym_name_size,
Sized_relobj<64, false>::Symbols* sympointers,
Sized_relobj_file<64, false>::Symbols* sympointers,
size_t* defined);
#endif
@ -3337,13 +3337,13 @@ Symbol_table::add_from_relobj<64, false>(
template
void
Symbol_table::add_from_relobj<64, true>(
Sized_relobj<64, true>* relobj,
Sized_relobj_file<64, true>* relobj,
const unsigned char* syms,
size_t count,
size_t symndx_offset,
const char* sym_names,
size_t sym_name_size,
Sized_relobj<64, true>::Symbols* sympointers,
Sized_relobj_file<64, true>::Symbols* sympointers,
size_t* defined);
#endif
@ -3399,7 +3399,7 @@ Symbol_table::add_from_dynobj<32, false>(
const unsigned char* versym,
size_t versym_size,
const std::vector<const char*>* version_map,
Sized_relobj<32, false>::Symbols* sympointers,
Sized_relobj_file<32, false>::Symbols* sympointers,
size_t* defined);
#endif
@ -3415,7 +3415,7 @@ Symbol_table::add_from_dynobj<32, true>(
const unsigned char* versym,
size_t versym_size,
const std::vector<const char*>* version_map,
Sized_relobj<32, true>::Symbols* sympointers,
Sized_relobj_file<32, true>::Symbols* sympointers,
size_t* defined);
#endif
@ -3431,7 +3431,7 @@ Symbol_table::add_from_dynobj<64, false>(
const unsigned char* versym,
size_t versym_size,
const std::vector<const char*>* version_map,
Sized_relobj<64, false>::Symbols* sympointers,
Sized_relobj_file<64, false>::Symbols* sympointers,
size_t* defined);
#endif
@ -3447,7 +3447,7 @@ Symbol_table::add_from_dynobj<64, true>(
const unsigned char* versym,
size_t versym_size,
const std::vector<const char*>* version_map,
Sized_relobj<64, true>::Symbols* sympointers,
Sized_relobj_file<64, true>::Symbols* sympointers,
size_t* defined);
#endif

View File

@ -42,7 +42,7 @@ class Mapfile;
class Object;
class Relobj;
template<int size, bool big_endian>
class Sized_relobj;
class Sized_relobj_file;
template<int size, bool big_endian>
class Sized_pluginobj;
class Dynobj;
@ -1309,11 +1309,11 @@ class Symbol_table
// *DEFINED to the number of defined symbols.
template<int size, bool big_endian>
void
add_from_relobj(Sized_relobj<size, big_endian>* relobj,
add_from_relobj(Sized_relobj_file<size, big_endian>* relobj,
const unsigned char* syms, size_t count,
size_t symndx_offset, const char* sym_names,
size_t sym_name_size,
typename Sized_relobj<size, big_endian>::Symbols*,
typename Sized_relobj_file<size, big_endian>::Symbols*,
size_t* defined);
// Add one external symbol from the plugin object OBJ to the symbol table.
@ -1335,7 +1335,7 @@ class Symbol_table
const char* sym_names, size_t sym_name_size,
const unsigned char* versym, size_t versym_size,
const std::vector<const char*>*,
typename Sized_relobj<size, big_endian>::Symbols*,
typename Sized_relobj_file<size, big_endian>::Symbols*,
size_t* defined);
// Add one external symbol from the incremental object OBJ to the symbol

View File

@ -46,7 +46,7 @@ scan_relocs(
Symbol_table* symtab,
Layout* layout,
Target_type* target,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
const unsigned char* prelocs,
size_t reloc_count,
@ -213,7 +213,7 @@ relocate_section(
const int reloc_size = Reloc_types<sh_type, size, big_endian>::reloc_size;
Relocate relocate;
Sized_relobj<size, big_endian>* object = relinfo->object;
Sized_relobj_file<size, big_endian>* object = relinfo->object;
unsigned int local_count = object->local_symbol_count();
Comdat_behavior comdat_behavior = CB_UNDETERMINED;
@ -475,7 +475,7 @@ void
scan_relocatable_relocs(
Symbol_table*,
Layout*,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
const unsigned char* prelocs,
size_t reloc_count,
@ -570,7 +570,7 @@ relocate_for_relocatable(
const int reloc_size = Reloc_types<sh_type, size, big_endian>::reloc_size;
const Address invalid_address = static_cast<Address>(0) - 1;
Sized_relobj<size, big_endian>* const object = relinfo->object;
Sized_relobj_file<size, big_endian>* const object = relinfo->object;
const unsigned int local_count = object->local_symbol_count();
unsigned char* pwrite = reloc_view;

View File

@ -74,8 +74,8 @@ Target::do_make_elf_object_implementation(
int et = ehdr.get_e_type();
if (et == elfcpp::ET_REL)
{
Sized_relobj<size, big_endian>* obj =
new Sized_relobj<size, big_endian>(name, input_file, offset, ehdr);
Sized_relobj_file<size, big_endian>* obj =
new Sized_relobj_file<size, big_endian>(name, input_file, offset, ehdr);
obj->setup();
return obj;
}

View File

@ -45,6 +45,8 @@ class Object;
class Relobj;
template<int size, bool big_endian>
class Sized_relobj;
template<int size, bool big_endian>
class Sized_relobj_file;
class Relocatable_relocs;
template<int size, bool big_endian>
class Relocate_info;
@ -642,7 +644,7 @@ class Sized_target : public Target
virtual void
gc_process_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -667,7 +669,7 @@ class Sized_target : public Target
virtual void
scan_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -706,7 +708,7 @@ class Sized_target : public Target
virtual void
scan_relocatable_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<size, big_endian>* object,
Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -807,6 +809,22 @@ class Sized_target : public Target
unsigned int /* plt_count */)
{ gold_unreachable(); }
// Reserve a GOT entry for a local symbol, and regenerate any
// necessary dynamic relocations.
virtual void
reserve_local_got_entry(unsigned int /* got_index */,
Sized_relobj<size, big_endian>* /* obj */,
unsigned int /* r_sym */,
unsigned int /* got_type */)
{ gold_unreachable(); }
// Reserve a GOT entry for a global symbol, and regenerate any
// necessary dynamic relocations.
virtual void
reserve_global_got_entry(unsigned int /* got_index */, Symbol* /* gsym */,
unsigned int /* got_type */)
{ gold_unreachable(); }
// Register an existing PLT entry for a global symbol.
// A target needs to implement this to support incremental linking.

View File

@ -95,9 +95,9 @@ Sized_binary_test()
delete sd.symbol_names;
sd.symbol_names = NULL;
Sized_relobj<size, big_endian>* relobj =
static_cast<Sized_relobj<size, big_endian>*>(object);
typename Sized_relobj<size, big_endian>::Address value;
Sized_relobj_file<size, big_endian>* relobj =
static_cast<Sized_relobj_file<size, big_endian>*>(object);
typename Sized_relobj_file<size, big_endian>::Address value;
bool is_ordinary;
CHECK(relobj->symbol_section_and_value(0, &value, &is_ordinary) == 0);
CHECK(is_ordinary);

View File

@ -44,13 +44,14 @@ class Target_test : public Sized_target<size, big_endian>
{ }
void
gc_process_relocs(Symbol_table*, Layout*, Sized_relobj<size, big_endian>*,
gc_process_relocs(Symbol_table*, Layout*,
Sized_relobj_file<size, big_endian>*,
unsigned int, unsigned int, const unsigned char*, size_t,
Output_section*, bool, size_t, const unsigned char*)
{ ERROR("call to Target_test::gc_process_relocs"); }
void
scan_relocs(Symbol_table*, Layout*, Sized_relobj<size, big_endian>*,
scan_relocs(Symbol_table*, Layout*, Sized_relobj_file<size, big_endian>*,
unsigned int, unsigned int, const unsigned char*, size_t,
Output_section*, bool, size_t, const unsigned char*)
{ ERROR("call to Target_test::scan_relocs"); }
@ -64,7 +65,7 @@ class Target_test : public Sized_target<size, big_endian>
void
scan_relocatable_relocs(Symbol_table*, Layout*,
Sized_relobj<size, big_endian>*, unsigned int,
Sized_relobj_file<size, big_endian>*, unsigned int,
unsigned int, const unsigned char*,
size_t, Output_section*, bool, size_t,
const unsigned char*, Relocatable_relocs*)

View File

@ -85,7 +85,7 @@ class Output_data_plt_x86_64 : public Output_section_data
// Add an entry to the PLT for a local STT_GNU_IFUNC symbol.
unsigned int
add_local_ifunc_entry(Sized_relobj<64, false>* relobj,
add_local_ifunc_entry(Sized_relobj_file<64, false>* relobj,
unsigned int local_sym_index);
// Add the relocation for a PLT entry.
@ -239,7 +239,7 @@ class Target_x86_64 : public Target_freebsd<64, false>
void
gc_process_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<64, false>* object,
Sized_relobj_file<64, false>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -253,7 +253,7 @@ class Target_x86_64 : public Target_freebsd<64, false>
void
scan_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<64, false>* object,
Sized_relobj_file<64, false>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -289,7 +289,7 @@ class Target_x86_64 : public Target_freebsd<64, false>
void
scan_relocatable_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<64, false>* object,
Sized_relobj_file<64, false>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -390,6 +390,20 @@ class Target_x86_64 : public Target_freebsd<64, false>
unsigned int got_count,
unsigned int plt_count);
// Reserve a GOT entry for a local symbol, and regenerate any
// necessary dynamic relocations.
void
reserve_local_got_entry(unsigned int got_index,
Sized_relobj<64, false>* obj,
unsigned int r_sym,
unsigned int got_type);
// Reserve a GOT entry for a global symbol, and regenerate any
// necessary dynamic relocations.
void
reserve_global_got_entry(unsigned int got_index, Symbol* gsym,
unsigned int got_type);
// Register an existing PLT entry for a global symbol.
// A target needs to implement this to support incremental linking.
void
@ -408,7 +422,7 @@ class Target_x86_64 : public Target_freebsd<64, false>
// Add a new reloc argument, returning the index in the vector.
size_t
add_tlsdesc_info(Sized_relobj<64, false>* object, unsigned int r_sym)
add_tlsdesc_info(Sized_relobj_file<64, false>* object, unsigned int r_sym)
{
this->tlsdesc_reloc_info_.push_back(Tlsdesc_info(object, r_sym));
return this->tlsdesc_reloc_info_.size() - 1;
@ -428,7 +442,7 @@ class Target_x86_64 : public Target_freebsd<64, false>
inline void
local(Symbol_table* symtab, Layout* layout, Target_x86_64* target,
Sized_relobj<64, false>* object,
Sized_relobj_file<64, false>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rela<64, false>& reloc, unsigned int r_type,
@ -436,7 +450,7 @@ class Target_x86_64 : public Target_freebsd<64, false>
inline void
global(Symbol_table* symtab, Layout* layout, Target_x86_64* target,
Sized_relobj<64, false>* object,
Sized_relobj_file<64, false>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rela<64, false>& reloc, unsigned int r_type,
@ -445,7 +459,7 @@ class Target_x86_64 : public Target_freebsd<64, false>
inline bool
local_reloc_may_be_function_pointer(Symbol_table* symtab, Layout* layout,
Target_x86_64* target,
Sized_relobj<64, false>* object,
Sized_relobj_file<64, false>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rela<64, false>& reloc,
@ -455,7 +469,7 @@ class Target_x86_64 : public Target_freebsd<64, false>
inline bool
global_reloc_may_be_function_pointer(Symbol_table* symtab, Layout* layout,
Target_x86_64* target,
Sized_relobj<64, false>* object,
Sized_relobj_file<64, false>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rela<64, false>& reloc,
@ -464,10 +478,10 @@ class Target_x86_64 : public Target_freebsd<64, false>
private:
static void
unsupported_reloc_local(Sized_relobj<64, false>*, unsigned int r_type);
unsupported_reloc_local(Sized_relobj_file<64, false>*, unsigned int r_type);
static void
unsupported_reloc_global(Sized_relobj<64, false>*, unsigned int r_type,
unsupported_reloc_global(Sized_relobj_file<64, false>*, unsigned int r_type,
Symbol*);
void
@ -477,7 +491,8 @@ class Target_x86_64 : public Target_freebsd<64, false>
possible_function_pointer_reloc(unsigned int r_type);
bool
reloc_needs_plt_for_ifunc(Sized_relobj<64, false>*, unsigned int r_type);
reloc_needs_plt_for_ifunc(Sized_relobj_file<64, false>*,
unsigned int r_type);
// Whether we have issued an error about a non-PIC compilation.
bool issued_non_pic_error_;
@ -626,7 +641,7 @@ class Target_x86_64 : public Target_freebsd<64, false>
// Create a PLT entry for a local STT_GNU_IFUNC symbol.
void
make_local_ifunc_plt_entry(Symbol_table*, Layout*,
Sized_relobj<64, false>* relobj,
Sized_relobj_file<64, false>* relobj,
unsigned int local_sym_index);
// Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
@ -640,7 +655,7 @@ class Target_x86_64 : public Target_freebsd<64, false>
// Create a GOT entry for the TLS module index.
unsigned int
got_mod_index_entry(Symbol_table* symtab, Layout* layout,
Sized_relobj<64, false>* object);
Sized_relobj_file<64, false>* object);
// Get the PLT section.
Output_data_plt_x86_64*
@ -661,7 +676,7 @@ class Target_x86_64 : public Target_freebsd<64, false>
// Add a potential copy relocation.
void
copy_reloc(Symbol_table* symtab, Layout* layout,
Sized_relobj<64, false>* object,
Sized_relobj_file<64, false>* object,
unsigned int shndx, Output_section* output_section,
Symbol* sym, const elfcpp::Rela<64, false>& reloc)
{
@ -692,12 +707,12 @@ class Target_x86_64 : public Target_freebsd<64, false>
// R_X86_64_TLSDESC against a local symbol.
struct Tlsdesc_info
{
Tlsdesc_info(Sized_relobj<64, false>* a_object, unsigned int a_r_sym)
Tlsdesc_info(Sized_relobj_file<64, false>* a_object, unsigned int a_r_sym)
: object(a_object), r_sym(a_r_sym)
{ }
// The object in which the local symbol is defined.
Sized_relobj<64, false>* object;
Sized_relobj_file<64, false>* object;
// The local symbol index in the object.
unsigned int r_sym;
};
@ -921,8 +936,9 @@ Output_data_plt_x86_64::add_entry(Symbol* gsym)
// the PLT offset.
unsigned int
Output_data_plt_x86_64::add_local_ifunc_entry(Sized_relobj<64, false>* relobj,
unsigned int local_sym_index)
Output_data_plt_x86_64::add_local_ifunc_entry(
Sized_relobj_file<64, false>* relobj,
unsigned int local_sym_index)
{
unsigned int plt_offset = (this->count_ + 1) * plt_entry_size;
++this->count_;
@ -1168,7 +1184,7 @@ Target_x86_64::make_plt_entry(Symbol_table* symtab, Layout* layout,
void
Target_x86_64::make_local_ifunc_plt_entry(Symbol_table* symtab, Layout* layout,
Sized_relobj<64, false>* relobj,
Sized_relobj_file<64, false>* relobj,
unsigned int local_sym_index)
{
if (relobj->local_has_plt_offset(local_sym_index))
@ -1261,9 +1277,101 @@ Target_x86_64::init_got_plt_for_update(Symbol_table* symtab,
Output_section* rela_plt_os = this->plt_->rela_plt()->output_section();
rela_plt_os->set_info_section(this->plt_->output_section());
// Create the rela_dyn section.
this->rela_dyn_section(layout);
return this->got_;
}
// Reserve a GOT entry for a local symbol, and regenerate any
// necessary dynamic relocations.
void
Target_x86_64::reserve_local_got_entry(
unsigned int got_index,
Sized_relobj<64, false>* obj,
unsigned int r_sym,
unsigned int got_type)
{
unsigned int got_offset = got_index * 8;
Reloc_section* rela_dyn = this->rela_dyn_section(NULL);
this->got_->reserve_local(got_index, obj, r_sym, got_type);
switch (got_type)
{
case GOT_TYPE_STANDARD:
if (parameters->options().output_is_position_independent())
rela_dyn->add_local_relative(obj, r_sym, elfcpp::R_X86_64_RELATIVE,
this->got_, got_offset, 0);
break;
case GOT_TYPE_TLS_OFFSET:
rela_dyn->add_local(obj, r_sym, elfcpp::R_X86_64_TPOFF64,
this->got_, got_offset, 0);
break;
case GOT_TYPE_TLS_PAIR:
this->got_->reserve_slot(got_index + 1);
rela_dyn->add_local(obj, r_sym, elfcpp::R_X86_64_DTPMOD64,
this->got_, got_offset, 0);
break;
case GOT_TYPE_TLS_DESC:
gold_fatal(_("TLS_DESC not yet supported for incremental linking"));
// this->got_->reserve_slot(got_index + 1);
// rela_dyn->add_target_specific(elfcpp::R_X86_64_TLSDESC, arg,
// this->got_, got_offset, 0);
break;
default:
gold_unreachable();
}
}
// Reserve a GOT entry for a global symbol, and regenerate any
// necessary dynamic relocations.
void
Target_x86_64::reserve_global_got_entry(unsigned int got_index, Symbol* gsym,
unsigned int got_type)
{
unsigned int got_offset = got_index * 8;
Reloc_section* rela_dyn = this->rela_dyn_section(NULL);
this->got_->reserve_global(got_index, gsym, got_type);
switch (got_type)
{
case GOT_TYPE_STANDARD:
if (!gsym->final_value_is_known())
{
if (gsym->is_from_dynobj()
|| gsym->is_undefined()
|| gsym->is_preemptible()
|| gsym->type() == elfcpp::STT_GNU_IFUNC)
rela_dyn->add_global(gsym, elfcpp::R_X86_64_GLOB_DAT,
this->got_, got_offset, 0);
else
rela_dyn->add_global_relative(gsym, elfcpp::R_X86_64_RELATIVE,
this->got_, got_offset, 0);
}
break;
case GOT_TYPE_TLS_OFFSET:
rela_dyn->add_global_relative(gsym, elfcpp::R_X86_64_TPOFF64,
this->got_, got_offset, 0);
break;
case GOT_TYPE_TLS_PAIR:
this->got_->reserve_slot(got_index + 1);
rela_dyn->add_global_relative(gsym, elfcpp::R_X86_64_DTPMOD64,
this->got_, got_offset, 0);
rela_dyn->add_global_relative(gsym, elfcpp::R_X86_64_DTPOFF64,
this->got_, got_offset + 8, 0);
break;
case GOT_TYPE_TLS_DESC:
this->got_->reserve_slot(got_index + 1);
rela_dyn->add_global_relative(gsym, elfcpp::R_X86_64_TLSDESC,
this->got_, got_offset, 0);
break;
default:
gold_unreachable();
}
}
// Register an existing PLT entry for a global symbol.
void
@ -1331,7 +1439,7 @@ Target_x86_64::reserve_tlsdesc_entries(Symbol_table* symtab,
unsigned int
Target_x86_64::got_mod_index_entry(Symbol_table* symtab, Layout* layout,
Sized_relobj<64, false>* object)
Sized_relobj_file<64, false>* object)
{
if (this->got_mod_index_offset_ == -1U)
{
@ -1472,8 +1580,9 @@ Target_x86_64::Scan::get_reference_flags(unsigned int r_type)
// Report an unsupported relocation against a local symbol.
void
Target_x86_64::Scan::unsupported_reloc_local(Sized_relobj<64, false>* object,
unsigned int r_type)
Target_x86_64::Scan::unsupported_reloc_local(
Sized_relobj_file<64, false>* object,
unsigned int r_type)
{
gold_error(_("%s: unsupported reloc %u against local symbol"),
object->name().c_str(), r_type);
@ -1537,8 +1646,9 @@ Target_x86_64::Scan::check_non_pic(Relobj* object, unsigned int r_type)
// given type against a STT_GNU_IFUNC symbol.
bool
Target_x86_64::Scan::reloc_needs_plt_for_ifunc(Sized_relobj<64, false>* object,
unsigned int r_type)
Target_x86_64::Scan::reloc_needs_plt_for_ifunc(
Sized_relobj_file<64, false>* object,
unsigned int r_type)
{
int flags = Scan::get_reference_flags(r_type);
if (flags & Symbol::TLS_REF)
@ -1553,7 +1663,7 @@ inline void
Target_x86_64::Scan::local(Symbol_table* symtab,
Layout* layout,
Target_x86_64* target,
Sized_relobj<64, false>* object,
Sized_relobj_file<64, false>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rela<64, false>& reloc,
@ -1848,9 +1958,10 @@ Target_x86_64::Scan::local(Symbol_table* symtab,
// Report an unsupported relocation against a global symbol.
void
Target_x86_64::Scan::unsupported_reloc_global(Sized_relobj<64, false>* object,
unsigned int r_type,
Symbol* gsym)
Target_x86_64::Scan::unsupported_reloc_global(
Sized_relobj_file<64, false>* object,
unsigned int r_type,
Symbol* gsym)
{
gold_error(_("%s: unsupported reloc %u against global symbol %s"),
object->name().c_str(), r_type, gsym->demangled_name().c_str());
@ -1888,7 +1999,7 @@ Target_x86_64::Scan::local_reloc_may_be_function_pointer(
Symbol_table* ,
Layout* ,
Target_x86_64* ,
Sized_relobj<64, false>* ,
Sized_relobj_file<64, false>* ,
unsigned int ,
Output_section* ,
const elfcpp::Rela<64, false>& ,
@ -1911,7 +2022,7 @@ Target_x86_64::Scan::global_reloc_may_be_function_pointer(
Symbol_table*,
Layout* ,
Target_x86_64* ,
Sized_relobj<64, false>* ,
Sized_relobj_file<64, false>* ,
unsigned int ,
Output_section* ,
const elfcpp::Rela<64, false>& ,
@ -1933,7 +2044,7 @@ inline void
Target_x86_64::Scan::global(Symbol_table* symtab,
Layout* layout,
Target_x86_64* target,
Sized_relobj<64, false>* object,
Sized_relobj_file<64, false>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rela<64, false>& reloc,
@ -2277,7 +2388,7 @@ Target_x86_64::Scan::global(Symbol_table* symtab,
void
Target_x86_64::gc_process_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<64, false>* object,
Sized_relobj_file<64, false>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -2314,7 +2425,7 @@ Target_x86_64::gc_process_relocs(Symbol_table* symtab,
void
Target_x86_64::scan_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<64, false>* object,
Sized_relobj_file<64, false>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@ -2425,7 +2536,7 @@ Target_x86_64::Relocate::relocate(const Relocate_info<64, false>* relinfo,
}
}
const Sized_relobj<64, false>* object = relinfo->object;
const Sized_relobj_file<64, false>* object = relinfo->object;
// Pick the value to use for symbols defined in the PLT.
Symbol_value<64> symval;
@ -2673,7 +2784,7 @@ Target_x86_64::Relocate::relocate_tls(const Relocate_info<64, false>* relinfo,
{
Output_segment* tls_segment = relinfo->layout->tls_segment();
const Sized_relobj<64, false>* object = relinfo->object;
const Sized_relobj_file<64, false>* object = relinfo->object;
const elfcpp::Elf_Xword addend = rela.get_r_addend();
elfcpp::Shdr<64, false> data_shdr(relinfo->data_shdr);
bool is_executable = (data_shdr.get_sh_flags() & elfcpp::SHF_EXECINSTR) != 0;
@ -3278,7 +3389,7 @@ Target_x86_64::Relocatable_size_for_reloc::get_size_for_reloc(
void
Target_x86_64::scan_relocatable_relocs(Symbol_table* symtab,
Layout* layout,
Sized_relobj<64, false>* object,
Sized_relobj_file<64, false>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,