]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
* incremental-dump.cc (dump_incremental_inputs): Print dynamic reloc
authorCary Coutant <ccoutant@google.com>
Tue, 24 May 2011 21:41:10 +0000 (21:41 +0000)
committerCary Coutant <ccoutant@google.com>
Tue, 24 May 2011 21:41:10 +0000 (21:41 +0000)
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.

32 files changed:
gold/ChangeLog
gold/arm.cc
gold/copy-relocs.cc
gold/copy-relocs.h
gold/dynobj.h
gold/ehframe.cc
gold/ehframe.h
gold/gc.h
gold/i386.cc
gold/incremental-dump.cc
gold/incremental.cc
gold/incremental.h
gold/layout.cc
gold/layout.h
gold/mapfile.cc
gold/mapfile.h
gold/object.cc
gold/object.h
gold/output.cc
gold/output.h
gold/powerpc.cc
gold/reloc.cc
gold/reloc.h
gold/sparc.cc
gold/symtab.cc
gold/symtab.h
gold/target-reloc.h
gold/target.cc
gold/target.h
gold/testsuite/binary_unittest.cc
gold/testsuite/testfile.cc
gold/x86_64.cc

index 315b670643064bc22676fdd2d42c58500c175f35..2cdc2738c3ed8f238935919fca7c52128ec8af01 100644 (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.
index 541ff59ef6a379364c684ccf82564c43be8eb2e4..9af0e21193a0a8d119eabd3880a6b37286905f58 100644 (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); 
index 4931aa06b659c1694d929a21433a951b2240322e..bfdbb90ce382c2a5d957c47ac36d41cffe92dc10 100644 (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)
index 2fe6a245e072f0295ee6b394f67260c33d55d5cb..3fa2a6110e042948be5a411f573f30c6e4e7b279 100644 (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.
index 7a626c027b10eb01d78d3a2b2386675f959f285e..c96ee2c2e374e2568cb31e34192f0ba2360237f1 100644 (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>&);
index 2c470b060c818466965740eebc67082dfad66566..fbeb8a3787ffb43fd5617a2144666822e1ae5150 100644 (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,
index 16902454dd1a777f9e2378940816df7fbf0d0dad..f626b1f1696e701c604c655de7c0cf1c375dbe43 100644 (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,
index 10cdd5f25787d920c3b1969fe62d9584703017cb..4688781fd7a65b4475995c0700f3a18ab7bd2bd5 100644 (file)
--- a/gold/gc.h
+++ b/gold/gc.h
@@ -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,
index a137b2ef1f44c192193b795706bbb565973bd965..d60ac22a13035bf5ee187f3f9c951894de2f420d 100644 (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,
index eecf8a876dc7e4ad9e133390346cea3731349c8e..c1e253038ccba873be04dd203afd74ab9a59bc14 100644 (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");
     }
index b831b97562b6e62313ea2026feee710cb274bdde..d49c8a5df4e062d66550b4407c56f6cf86814c9a 100644 (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>;
index 5c0f937dc128ce63ac9625ab2c3955f23e7fa3bf..3935186e5b7f1219a16155123825d6bc9c1fb8e2 100644 (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_symndx(unsigned int n)
+  {
+    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_desc(unsigned int n)
+  get_got_input_index(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 + 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.
index 66d30d9ee800d3915abd0640819eab9387a4a591..d4b9f18a8fa643437b799ccc4e7eed09f09fe590 100644 (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,
index 907181f0a34f350b24b3c6ce3938751614ba26f3..ced07b5c606a8f60cf706e870a27be8d048a21f7 100644 (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
index 0cde51e21465a947a1eb6f43050c06c3b117989a..2062ae4089b94055124edccb321626c07cf836e8 100644 (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;
index 908a208ed5ce44c9584efe1d602de0f26b36cafe..808fc665c7663e21c9453eddf9f0d8beb2474ea9 100644 (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.
index a39a37c9a4f190d8cc7f6dd1ebddefc6fa6ab10c..1160f0cf6afc12ad77041f0b91e88be9416eaa1e 100644 (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
index dc56136c18bf6b9d7f4a5648438d71ad41b03fb8..d9be4b52e3e920ebe8370adee6556e182c7dd3f5 100644 (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();
+  Sized_relobj_file(const std::string& name,
+                   Input_file* input_file,
+                   off_t offset,
+                   const typename elfcpp::Ehdr<size, big_endian>&);
 
-  // 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.
index c3053db0282c3609fce751f22d5d5f794e3bd77d..6555830fe9ef9727ef0715d3dbafc1f3d389fe82 100644 (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,
index 418f016605be1928644661b67d79204b4d2cebca..8ca3598ab0cd98c6b94cfed51f66cee1d6888d66 100644 (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)
+  { this->free_list_.remove(i * size / 8, (i + 1) * size / 8); }
+
+  // Reserve a slot in the GOT for a local symbol.
   void
-  reserve_slot(unsigned int i);
+  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);
index 661477a899855acf858fbe608cc74aa225859ca4..c113bd2a7462d1814c492036a8002a58e3c10fd0 100644 (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,
index c58e42b5a549e12451908d2250d1c7cca296c7a4..97ed33715a791d61b7544da0f195b9a130bb24c8 100644 (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,
-                                            Layout* layout,
-                                            Read_relocs_data* rd);
+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<64, false>::do_gc_process_relocs(Symbol_table* symtab,
-                                             Layout* layout,
-                                             Read_relocs_data* rd);
+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<64, true>::do_gc_process_relocs(Symbol_table* symtab,
-                                            Layout* layout,
-                                            Read_relocs_data* rd);
+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<32, false>::do_scan_relocs(Symbol_table* symtab,
-                                       Layout* layout,
-                                       Read_relocs_data* rd);
+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<32, true>::do_scan_relocs(Symbol_table* symtab,
-                                      Layout* layout,
-                                      Read_relocs_data* rd);
+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_scan_relocs(Symbol_table* symtab,
-                                       Layout* layout,
-                                       Read_relocs_data* rd);
+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<64, true>::do_scan_relocs(Symbol_table* symtab,
-                                      Layout* layout,
-                                      Read_relocs_data* rd);
+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_relocate(const Symbol_table* symtab,
-                                    const Layout* layout,
-                                    Output_file* of);
+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_relocate(const Symbol_table* symtab,
-                                   const Layout* layout,
-                                   Output_file* of);
+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_relocate(const Symbol_table* symtab,
-                                    const Layout* layout,
-                                    Output_file* of);
+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_relocate(const Symbol_table* symtab,
-                                   const Layout* layout,
-                                   Output_file* of);
+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_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)
index 87e70cc3cda0957fabb03dc5650e3a8a6a92d650..3a33c9b01ba40bd60a8e1cfdfa61056debc2ef64 100644 (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)
index 84614bd7a28f9c33f336efdd53c981aef31c940f..080a480651748af6c0faa22950cec2943cb3f89c 100644 (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,
index 3880ce17e2066ac6d72aeaca80fdbf2ce12b6b55..a1ce3b754ef1bcf91c64eb2143a796cfd7113455 100644 (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
 
index 419613810450b340b62c2a33b8efd8ee047e5cf4..87e70990d1dc4c54273bcbe8852f7867ed277518 100644 (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
index 17c9c99fb2380a8cdd55da4b2095a40543a82579..fc832dc6d2da049275db96f7d7f2126ea6fc7dcb 100644 (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;
index 2c0cbbf16d8945ffb4299edc730a65c95358cf4c..0e329cdd0b38e6c5507c713fae273031f2f42c06 100644 (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;
     }
index 6b25d5f18f6ec8d75277df9627c9c4dd0e1acfd9..19e975d7b1b90e3ad8d86d160936fdedbe9ce00a 100644 (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.
 
index 8e950620c94b32da00ff6547e822626eae5f256e..a9f47c20fcbeddcbc75d67cbc7821cd3110b0f11 100644 (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);
index 7f53792669f17ada74abe4f395c6bb5aa0cd2a04..228077ae90f518e06d957223221b2a873c9b380e 100644 (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*)
index 9b9a3b19a358a937489c7a4721c89de33923c0d3..a447d38c07715364ea74ac0e3f0f02c6b2c4e4c9 100644 (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,