Home | History | Annotate | Download | only in gold
      1 // reloc.cc -- relocate input files for gold.
      2 
      3 // Copyright (C) 2006-2014 Free Software Foundation, Inc.
      4 // Written by Ian Lance Taylor <iant (at) google.com>.
      5 
      6 // This file is part of gold.
      7 
      8 // This program is free software; you can redistribute it and/or modify
      9 // it under the terms of the GNU General Public License as published by
     10 // the Free Software Foundation; either version 3 of the License, or
     11 // (at your option) any later version.
     12 
     13 // This program is distributed in the hope that it will be useful,
     14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16 // GNU General Public License for more details.
     17 
     18 // You should have received a copy of the GNU General Public License
     19 // along with this program; if not, write to the Free Software
     20 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     21 // MA 02110-1301, USA.
     22 
     23 #include "gold.h"
     24 
     25 #include <algorithm>
     26 
     27 #include "workqueue.h"
     28 #include "layout.h"
     29 #include "symtab.h"
     30 #include "output.h"
     31 #include "merge.h"
     32 #include "object.h"
     33 #include "target-reloc.h"
     34 #include "reloc.h"
     35 #include "icf.h"
     36 #include "compressed_output.h"
     37 #include "incremental.h"
     38 
     39 namespace gold
     40 {
     41 
     42 // Read_relocs methods.
     43 
     44 // These tasks just read the relocation information from the file.
     45 // After reading it, the start another task to process the
     46 // information.  These tasks requires access to the file.
     47 
     48 Task_token*
     49 Read_relocs::is_runnable()
     50 {
     51   return this->object_->is_locked() ? this->object_->token() : NULL;
     52 }
     53 
     54 // Lock the file.
     55 
     56 void
     57 Read_relocs::locks(Task_locker* tl)
     58 {
     59   Task_token* token = this->object_->token();
     60   if (token != NULL)
     61     tl->add(this, token);
     62 }
     63 
     64 // Read the relocations and then start a Scan_relocs_task.
     65 
     66 void
     67 Read_relocs::run(Workqueue* workqueue)
     68 {
     69   Read_relocs_data* rd = new Read_relocs_data;
     70   this->object_->read_relocs(rd);
     71   this->object_->set_relocs_data(rd);
     72   this->object_->release();
     73 
     74   // If garbage collection or identical comdat folding is desired, we
     75   // process the relocs first before scanning them.  Scanning of relocs is
     76   // done only after garbage or identical sections is identified.
     77   if (parameters->options().gc_sections()
     78       || parameters->options().icf_enabled())
     79     {
     80       workqueue->queue_next(new Gc_process_relocs(this->symtab_,
     81                                                   this->layout_,
     82                                                   this->object_, rd,
     83                                                   this->this_blocker_,
     84 						  this->next_blocker_));
     85     }
     86   else
     87     {
     88       workqueue->queue_next(new Scan_relocs(this->symtab_, this->layout_,
     89 					    this->object_, rd,
     90                                             this->this_blocker_,
     91 					    this->next_blocker_));
     92     }
     93 }
     94 
     95 // Return a debugging name for the task.
     96 
     97 std::string
     98 Read_relocs::get_name() const
     99 {
    100   return "Read_relocs " + this->object_->name();
    101 }
    102 
    103 // Gc_process_relocs methods.
    104 
    105 Gc_process_relocs::~Gc_process_relocs()
    106 {
    107   if (this->this_blocker_ != NULL)
    108     delete this->this_blocker_;
    109 }
    110 
    111 // These tasks process the relocations read by Read_relocs and
    112 // determine which sections are referenced and which are garbage.
    113 // This task is done only when --gc-sections is used.  This is blocked
    114 // by THIS_BLOCKER_.  It unblocks NEXT_BLOCKER_.
    115 
    116 Task_token*
    117 Gc_process_relocs::is_runnable()
    118 {
    119   if (this->this_blocker_ != NULL && this->this_blocker_->is_blocked())
    120     return this->this_blocker_;
    121   if (this->object_->is_locked())
    122     return this->object_->token();
    123   return NULL;
    124 }
    125 
    126 void
    127 Gc_process_relocs::locks(Task_locker* tl)
    128 {
    129   tl->add(this, this->object_->token());
    130   tl->add(this, this->next_blocker_);
    131 }
    132 
    133 void
    134 Gc_process_relocs::run(Workqueue*)
    135 {
    136   this->object_->gc_process_relocs(this->symtab_, this->layout_, this->rd_);
    137   this->object_->release();
    138 }
    139 
    140 // Return a debugging name for the task.
    141 
    142 std::string
    143 Gc_process_relocs::get_name() const
    144 {
    145   return "Gc_process_relocs " + this->object_->name();
    146 }
    147 
    148 // Scan_relocs methods.
    149 
    150 Scan_relocs::~Scan_relocs()
    151 {
    152   if (this->this_blocker_ != NULL)
    153     delete this->this_blocker_;
    154 }
    155 
    156 // These tasks scan the relocations read by Read_relocs and mark up
    157 // the symbol table to indicate which relocations are required.  We
    158 // use a lock on the symbol table to keep them from interfering with
    159 // each other.
    160 
    161 Task_token*
    162 Scan_relocs::is_runnable()
    163 {
    164   if (this->this_blocker_ != NULL && this->this_blocker_->is_blocked())
    165     return this->this_blocker_;
    166   if (this->object_->is_locked())
    167     return this->object_->token();
    168   return NULL;
    169 }
    170 
    171 // Return the locks we hold: one on the file, one on the symbol table
    172 // and one blocker.
    173 
    174 void
    175 Scan_relocs::locks(Task_locker* tl)
    176 {
    177   Task_token* token = this->object_->token();
    178   if (token != NULL)
    179     tl->add(this, token);
    180   tl->add(this, this->next_blocker_);
    181 }
    182 
    183 // Scan the relocs.
    184 
    185 void
    186 Scan_relocs::run(Workqueue*)
    187 {
    188   this->object_->scan_relocs(this->symtab_, this->layout_, this->rd_);
    189   delete this->rd_;
    190   this->rd_ = NULL;
    191   this->object_->release();
    192 }
    193 
    194 // Return a debugging name for the task.
    195 
    196 std::string
    197 Scan_relocs::get_name() const
    198 {
    199   return "Scan_relocs " + this->object_->name();
    200 }
    201 
    202 // Relocate_task methods.
    203 
    204 // We may have to wait for the output sections to be written.
    205 
    206 Task_token*
    207 Relocate_task::is_runnable()
    208 {
    209   if (this->object_->relocs_must_follow_section_writes()
    210       && this->output_sections_blocker_->is_blocked())
    211     return this->output_sections_blocker_;
    212 
    213   if (this->object_->is_locked())
    214     return this->object_->token();
    215 
    216   return NULL;
    217 }
    218 
    219 // We want to lock the file while we run.  We want to unblock
    220 // INPUT_SECTIONS_BLOCKER and FINAL_BLOCKER when we are done.
    221 // INPUT_SECTIONS_BLOCKER may be NULL.
    222 
    223 void
    224 Relocate_task::locks(Task_locker* tl)
    225 {
    226   if (this->input_sections_blocker_ != NULL)
    227     tl->add(this, this->input_sections_blocker_);
    228   tl->add(this, this->final_blocker_);
    229   Task_token* token = this->object_->token();
    230   if (token != NULL)
    231     tl->add(this, token);
    232 }
    233 
    234 // Run the task.
    235 
    236 void
    237 Relocate_task::run(Workqueue*)
    238 {
    239   this->object_->relocate(this->symtab_, this->layout_, this->of_);
    240 
    241   // This is normally the last thing we will do with an object, so
    242   // uncache all views.
    243   this->object_->clear_view_cache_marks();
    244 
    245   this->object_->release();
    246 }
    247 
    248 // Return a debugging name for the task.
    249 
    250 std::string
    251 Relocate_task::get_name() const
    252 {
    253   return "Relocate_task " + this->object_->name();
    254 }
    255 
    256 // Read the relocs and local symbols from the object file and store
    257 // the information in RD.
    258 
    259 template<int size, bool big_endian>
    260 void
    261 Sized_relobj_file<size, big_endian>::do_read_relocs(Read_relocs_data* rd)
    262 {
    263   rd->relocs.clear();
    264 
    265   unsigned int shnum = this->shnum();
    266   if (shnum == 0)
    267     return;
    268 
    269   rd->relocs.reserve(shnum / 2);
    270 
    271   const Output_sections& out_sections(this->output_sections());
    272   const std::vector<Address>& out_offsets(this->section_offsets());
    273 
    274   const unsigned char* pshdrs = this->get_view(this->elf_file_.shoff(),
    275 					       shnum * This::shdr_size,
    276 					       true, true);
    277   // Skip the first, dummy, section.
    278   const unsigned char* ps = pshdrs + This::shdr_size;
    279   for (unsigned int i = 1; i < shnum; ++i, ps += This::shdr_size)
    280     {
    281       typename This::Shdr shdr(ps);
    282 
    283       unsigned int sh_type = shdr.get_sh_type();
    284       if (sh_type != elfcpp::SHT_REL && sh_type != elfcpp::SHT_RELA)
    285 	continue;
    286 
    287       unsigned int shndx = this->adjust_shndx(shdr.get_sh_info());
    288       if (shndx >= shnum)
    289 	{
    290 	  this->error(_("relocation section %u has bad info %u"),
    291 		      i, shndx);
    292 	  continue;
    293 	}
    294 
    295       Output_section* os = out_sections[shndx];
    296       if (os == NULL)
    297 	continue;
    298 
    299       // We are scanning relocations in order to fill out the GOT and
    300       // PLT sections.  Relocations for sections which are not
    301       // allocated (typically debugging sections) should not add new
    302       // GOT and PLT entries.  So we skip them unless this is a
    303       // relocatable link or we need to emit relocations.  FIXME: What
    304       // should we do if a linker script maps a section with SHF_ALLOC
    305       // clear to a section with SHF_ALLOC set?
    306       typename This::Shdr secshdr(pshdrs + shndx * This::shdr_size);
    307       bool is_section_allocated = ((secshdr.get_sh_flags() & elfcpp::SHF_ALLOC)
    308 				   != 0);
    309       if (!is_section_allocated
    310 	  && !parameters->options().relocatable()
    311 	  && !parameters->options().emit_relocs()
    312 	  && !parameters->incremental())
    313 	continue;
    314 
    315       if (this->adjust_shndx(shdr.get_sh_link()) != this->symtab_shndx_)
    316 	{
    317 	  this->error(_("relocation section %u uses unexpected "
    318 			"symbol table %u"),
    319 		      i, this->adjust_shndx(shdr.get_sh_link()));
    320 	  continue;
    321 	}
    322 
    323       off_t sh_size = shdr.get_sh_size();
    324 
    325       if (sh_size == 0)
    326 	continue;
    327 
    328       unsigned int reloc_size;
    329       if (sh_type == elfcpp::SHT_REL)
    330 	reloc_size = elfcpp::Elf_sizes<size>::rel_size;
    331       else
    332 	reloc_size = elfcpp::Elf_sizes<size>::rela_size;
    333       if (reloc_size != shdr.get_sh_entsize())
    334 	{
    335 	  this->error(_("unexpected entsize for reloc section %u: %lu != %u"),
    336 		      i, static_cast<unsigned long>(shdr.get_sh_entsize()),
    337 		      reloc_size);
    338 	  continue;
    339 	}
    340 
    341       size_t reloc_count = sh_size / reloc_size;
    342       if (static_cast<off_t>(reloc_count * reloc_size) != sh_size)
    343 	{
    344 	  this->error(_("reloc section %u size %lu uneven"),
    345 		      i, static_cast<unsigned long>(sh_size));
    346 	  continue;
    347 	}
    348 
    349       rd->relocs.push_back(Section_relocs());
    350       Section_relocs& sr(rd->relocs.back());
    351       sr.reloc_shndx = i;
    352       sr.data_shndx = shndx;
    353       sr.contents = this->get_lasting_view(shdr.get_sh_offset(), sh_size,
    354 					   true, true);
    355       sr.sh_type = sh_type;
    356       sr.reloc_count = reloc_count;
    357       sr.output_section = os;
    358       sr.needs_special_offset_handling = out_offsets[shndx] == invalid_address;
    359       sr.is_data_section_allocated = is_section_allocated;
    360     }
    361 
    362   // Read the local symbols.
    363   gold_assert(this->symtab_shndx_ != -1U);
    364   if (this->symtab_shndx_ == 0 || this->local_symbol_count_ == 0)
    365     rd->local_symbols = NULL;
    366   else
    367     {
    368       typename This::Shdr symtabshdr(pshdrs
    369 				     + this->symtab_shndx_ * This::shdr_size);
    370       gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
    371       const int sym_size = This::sym_size;
    372       const unsigned int loccount = this->local_symbol_count_;
    373       gold_assert(loccount == symtabshdr.get_sh_info());
    374       off_t locsize = loccount * sym_size;
    375       rd->local_symbols = this->get_lasting_view(symtabshdr.get_sh_offset(),
    376 						 locsize, true, true);
    377     }
    378 }
    379 
    380 // Process the relocs to generate mappings from source sections to referenced
    381 // sections.  This is used during garbage collection to determine garbage
    382 // sections.
    383 
    384 template<int size, bool big_endian>
    385 void
    386 Sized_relobj_file<size, big_endian>::do_gc_process_relocs(Symbol_table* symtab,
    387 							  Layout* layout,
    388 							  Read_relocs_data* rd)
    389 {
    390   Sized_target<size, big_endian>* target =
    391     parameters->sized_target<size, big_endian>();
    392 
    393   const unsigned char* local_symbols;
    394   if (rd->local_symbols == NULL)
    395     local_symbols = NULL;
    396   else
    397     local_symbols = rd->local_symbols->data();
    398 
    399   for (Read_relocs_data::Relocs_list::iterator p = rd->relocs.begin();
    400        p != rd->relocs.end();
    401        ++p)
    402     {
    403       if (!parameters->options().relocatable())
    404 	  {
    405 	    // As noted above, when not generating an object file, we
    406 	    // only scan allocated sections.  We may see a non-allocated
    407 	    // section here if we are emitting relocs.
    408 	    if (p->is_data_section_allocated)
    409               target->gc_process_relocs(symtab, layout, this,
    410                                         p->data_shndx, p->sh_type,
    411                                         p->contents->data(), p->reloc_count,
    412                                         p->output_section,
    413                                         p->needs_special_offset_handling,
    414                                         this->local_symbol_count_,
    415                                         local_symbols);
    416         }
    417     }
    418 }
    419 
    420 
    421 // Scan the relocs and adjust the symbol table.  This looks for
    422 // relocations which require GOT/PLT/COPY relocations.
    423 
    424 template<int size, bool big_endian>
    425 void
    426 Sized_relobj_file<size, big_endian>::do_scan_relocs(Symbol_table* symtab,
    427 					       Layout* layout,
    428 					       Read_relocs_data* rd)
    429 {
    430   Sized_target<size, big_endian>* target =
    431     parameters->sized_target<size, big_endian>();
    432 
    433   const unsigned char* local_symbols;
    434   if (rd->local_symbols == NULL)
    435     local_symbols = NULL;
    436   else
    437     local_symbols = rd->local_symbols->data();
    438 
    439   // For incremental links, allocate the counters for incremental relocations.
    440   if (layout->incremental_inputs() != NULL)
    441     this->allocate_incremental_reloc_counts();
    442 
    443   for (Read_relocs_data::Relocs_list::iterator p = rd->relocs.begin();
    444        p != rd->relocs.end();
    445        ++p)
    446     {
    447       // When garbage collection is on, unreferenced sections are not included
    448       // in the link that would have been included normally. This is known only
    449       // after Read_relocs hence this check has to be done again.
    450       if (parameters->options().gc_sections()
    451 	  || parameters->options().icf_enabled())
    452         {
    453           if (p->output_section == NULL)
    454             continue;
    455         }
    456       if (!parameters->options().relocatable())
    457 	{
    458 	  // As noted above, when not generating an object file, we
    459 	  // only scan allocated sections.  We may see a non-allocated
    460 	  // section here if we are emitting relocs.
    461 	  if (p->is_data_section_allocated)
    462 	    target->scan_relocs(symtab, layout, this, p->data_shndx,
    463 				p->sh_type, p->contents->data(),
    464 				p->reloc_count, p->output_section,
    465 				p->needs_special_offset_handling,
    466 				this->local_symbol_count_,
    467 				local_symbols);
    468 	  if (parameters->options().emit_relocs())
    469 	    this->emit_relocs_scan(symtab, layout, local_symbols, p);
    470 	  if (layout->incremental_inputs() != NULL)
    471 	    this->incremental_relocs_scan(p);
    472 	}
    473       else
    474 	{
    475 	  Relocatable_relocs* rr = this->relocatable_relocs(p->reloc_shndx);
    476 	  gold_assert(rr != NULL);
    477 	  rr->set_reloc_count(p->reloc_count);
    478 	  target->scan_relocatable_relocs(symtab, layout, this,
    479 					  p->data_shndx, p->sh_type,
    480 					  p->contents->data(),
    481 					  p->reloc_count,
    482 					  p->output_section,
    483 					  p->needs_special_offset_handling,
    484 					  this->local_symbol_count_,
    485 					  local_symbols,
    486 					  rr);
    487 	}
    488 
    489       delete p->contents;
    490       p->contents = NULL;
    491     }
    492 
    493   // For incremental links, finalize the allocation of relocations.
    494   if (layout->incremental_inputs() != NULL)
    495     this->finalize_incremental_relocs(layout, true);
    496 
    497   if (rd->local_symbols != NULL)
    498     {
    499       delete rd->local_symbols;
    500       rd->local_symbols = NULL;
    501     }
    502 }
    503 
    504 // This is a strategy class we use when scanning for --emit-relocs.
    505 
    506 template<int sh_type>
    507 class Emit_relocs_strategy
    508 {
    509  public:
    510   // A local non-section symbol.
    511   inline Relocatable_relocs::Reloc_strategy
    512   local_non_section_strategy(unsigned int, Relobj*, unsigned int)
    513   { return Relocatable_relocs::RELOC_COPY; }
    514 
    515   // A local section symbol.
    516   inline Relocatable_relocs::Reloc_strategy
    517   local_section_strategy(unsigned int, Relobj*)
    518   {
    519     if (sh_type == elfcpp::SHT_RELA)
    520       return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_RELA;
    521     else
    522       {
    523 	// The addend is stored in the section contents.  Since this
    524 	// is not a relocatable link, we are going to apply the
    525 	// relocation contents to the section as usual.  This means
    526 	// that we have no way to record the original addend.  If the
    527 	// original addend is not zero, there is basically no way for
    528 	// the user to handle this correctly.  Caveat emptor.
    529 	return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_0;
    530       }
    531   }
    532 
    533   // A global symbol.
    534   inline Relocatable_relocs::Reloc_strategy
    535   global_strategy(unsigned int, Relobj*, unsigned int)
    536   { return Relocatable_relocs::RELOC_COPY; }
    537 };
    538 
    539 // Scan the input relocations for --emit-relocs.
    540 
    541 template<int size, bool big_endian>
    542 void
    543 Sized_relobj_file<size, big_endian>::emit_relocs_scan(
    544     Symbol_table* symtab,
    545     Layout* layout,
    546     const unsigned char* plocal_syms,
    547     const Read_relocs_data::Relocs_list::iterator& p)
    548 {
    549   Relocatable_relocs* rr = this->relocatable_relocs(p->reloc_shndx);
    550   gold_assert(rr != NULL);
    551   rr->set_reloc_count(p->reloc_count);
    552 
    553   if (p->sh_type == elfcpp::SHT_REL)
    554     this->emit_relocs_scan_reltype<elfcpp::SHT_REL>(symtab, layout,
    555 						    plocal_syms, p, rr);
    556   else
    557     {
    558       gold_assert(p->sh_type == elfcpp::SHT_RELA);
    559       this->emit_relocs_scan_reltype<elfcpp::SHT_RELA>(symtab, layout,
    560 						       plocal_syms, p, rr);
    561     }
    562 }
    563 
    564 // Scan the input relocation for --emit-relocs, templatized on the
    565 // type of the relocation section.
    566 
    567 template<int size, bool big_endian>
    568 template<int sh_type>
    569 void
    570 Sized_relobj_file<size, big_endian>::emit_relocs_scan_reltype(
    571     Symbol_table* symtab,
    572     Layout* layout,
    573     const unsigned char* plocal_syms,
    574     const Read_relocs_data::Relocs_list::iterator& p,
    575     Relocatable_relocs* rr)
    576 {
    577   scan_relocatable_relocs<size, big_endian, sh_type,
    578 			  Emit_relocs_strategy<sh_type> >(
    579     symtab,
    580     layout,
    581     this,
    582     p->data_shndx,
    583     p->contents->data(),
    584     p->reloc_count,
    585     p->output_section,
    586     p->needs_special_offset_handling,
    587     this->local_symbol_count_,
    588     plocal_syms,
    589     rr);
    590 }
    591 
    592 // Scan the input relocations for --incremental.
    593 
    594 template<int size, bool big_endian>
    595 void
    596 Sized_relobj_file<size, big_endian>::incremental_relocs_scan(
    597     const Read_relocs_data::Relocs_list::iterator& p)
    598 {
    599   if (p->sh_type == elfcpp::SHT_REL)
    600     this->incremental_relocs_scan_reltype<elfcpp::SHT_REL>(p);
    601   else
    602     {
    603       gold_assert(p->sh_type == elfcpp::SHT_RELA);
    604       this->incremental_relocs_scan_reltype<elfcpp::SHT_RELA>(p);
    605     }
    606 }
    607 
    608 // Scan the input relocation for --incremental, templatized on the
    609 // type of the relocation section.
    610 
    611 template<int size, bool big_endian>
    612 template<int sh_type>
    613 void
    614 Sized_relobj_file<size, big_endian>::incremental_relocs_scan_reltype(
    615     const Read_relocs_data::Relocs_list::iterator& p)
    616 {
    617   typedef typename Reloc_types<sh_type, size, big_endian>::Reloc Reltype;
    618   const int reloc_size = Reloc_types<sh_type, size, big_endian>::reloc_size;
    619   const unsigned char* prelocs = p->contents->data();
    620   size_t reloc_count = p->reloc_count;
    621 
    622   for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
    623     {
    624       Reltype reloc(prelocs);
    625 
    626       if (p->needs_special_offset_handling
    627 	  && !p->output_section->is_input_address_mapped(this, p->data_shndx,
    628 						         reloc.get_r_offset()))
    629 	continue;
    630 
    631       typename elfcpp::Elf_types<size>::Elf_WXword r_info =
    632 	  reloc.get_r_info();
    633       const unsigned int r_sym = elfcpp::elf_r_sym<size>(r_info);
    634 
    635       if (r_sym >= this->local_symbol_count_)
    636 	this->count_incremental_reloc(r_sym - this->local_symbol_count_);
    637     }
    638 }
    639 
    640 // Relocate the input sections and write out the local symbols.
    641 
    642 template<int size, bool big_endian>
    643 void
    644 Sized_relobj_file<size, big_endian>::do_relocate(const Symbol_table* symtab,
    645 						 const Layout* layout,
    646 						 Output_file* of)
    647 {
    648   unsigned int shnum = this->shnum();
    649 
    650   // Read the section headers.
    651   const unsigned char* pshdrs = this->get_view(this->elf_file_.shoff(),
    652 					       shnum * This::shdr_size,
    653 					       true, true);
    654 
    655   Views views;
    656   views.resize(shnum);
    657 
    658   // Make two passes over the sections.  The first one copies the
    659   // section data to the output file.  The second one applies
    660   // relocations.
    661 
    662   this->write_sections(layout, pshdrs, of, &views);
    663 
    664   // To speed up relocations, we set up hash tables for fast lookup of
    665   // input offsets to output addresses.
    666   this->initialize_input_to_output_maps();
    667 
    668   // Apply relocations.
    669 
    670   this->relocate_sections(symtab, layout, pshdrs, of, &views);
    671 
    672   // After we've done the relocations, we release the hash tables,
    673   // since we no longer need them.
    674   this->free_input_to_output_maps();
    675 
    676   // Write out the accumulated views.
    677   for (unsigned int i = 1; i < shnum; ++i)
    678     {
    679       if (views[i].view != NULL)
    680 	{
    681 	  if (views[i].is_ctors_reverse_view)
    682 	    this->reverse_words(views[i].view, views[i].view_size);
    683 	  if (!views[i].is_postprocessing_view)
    684 	    {
    685 	      if (views[i].is_input_output_view)
    686 		of->write_input_output_view(views[i].offset,
    687 					    views[i].view_size,
    688 					    views[i].view);
    689 	      else
    690 		of->write_output_view(views[i].offset, views[i].view_size,
    691 				      views[i].view);
    692 	    }
    693 	}
    694     }
    695 
    696   // Write out the local symbols.
    697   this->write_local_symbols(of, layout->sympool(), layout->dynpool(),
    698 			    layout->symtab_xindex(), layout->dynsym_xindex(),
    699 			    layout->symtab_section_offset());
    700 }
    701 
    702 // Sort a Read_multiple vector by file offset.
    703 struct Read_multiple_compare
    704 {
    705   inline bool
    706   operator()(const File_read::Read_multiple_entry& rme1,
    707 	     const File_read::Read_multiple_entry& rme2) const
    708   { return rme1.file_offset < rme2.file_offset; }
    709 };
    710 
    711 // Write section data to the output file.  PSHDRS points to the
    712 // section headers.  Record the views in *PVIEWS for use when
    713 // relocating.
    714 
    715 template<int size, bool big_endian>
    716 void
    717 Sized_relobj_file<size, big_endian>::write_sections(const Layout* layout,
    718 						    const unsigned char* pshdrs,
    719 						    Output_file* of,
    720 						    Views* pviews)
    721 {
    722   unsigned int shnum = this->shnum();
    723   const Output_sections& out_sections(this->output_sections());
    724   const std::vector<Address>& out_offsets(this->section_offsets());
    725 
    726   File_read::Read_multiple rm;
    727   bool is_sorted = true;
    728 
    729   const unsigned char* p = pshdrs + This::shdr_size;
    730   for (unsigned int i = 1; i < shnum; ++i, p += This::shdr_size)
    731     {
    732       View_size* pvs = &(*pviews)[i];
    733 
    734       pvs->view = NULL;
    735 
    736       const Output_section* os = out_sections[i];
    737       if (os == NULL)
    738 	continue;
    739       Address output_offset = out_offsets[i];
    740 
    741       typename This::Shdr shdr(p);
    742 
    743       if (shdr.get_sh_type() == elfcpp::SHT_NOBITS)
    744 	continue;
    745 
    746       if ((parameters->options().relocatable()
    747 	   || parameters->options().emit_relocs())
    748 	  && (shdr.get_sh_type() == elfcpp::SHT_REL
    749 	      || shdr.get_sh_type() == elfcpp::SHT_RELA)
    750 	  && (shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0)
    751 	{
    752 	  // This is a reloc section in a relocatable link or when
    753 	  // emitting relocs.  We don't need to read the input file.
    754 	  // The size and file offset are stored in the
    755 	  // Relocatable_relocs structure.
    756 	  Relocatable_relocs* rr = this->relocatable_relocs(i);
    757 	  gold_assert(rr != NULL);
    758 	  Output_data* posd = rr->output_data();
    759 	  gold_assert(posd != NULL);
    760 
    761 	  pvs->offset = posd->offset();
    762 	  pvs->view_size = posd->data_size();
    763 	  pvs->view = of->get_output_view(pvs->offset, pvs->view_size);
    764 	  pvs->address = posd->address();
    765 	  pvs->is_input_output_view = false;
    766 	  pvs->is_postprocessing_view = false;
    767 	  pvs->is_ctors_reverse_view = false;
    768 
    769 	  continue;
    770 	}
    771 
    772       // In the normal case, this input section is simply mapped to
    773       // the output section at offset OUTPUT_OFFSET.
    774 
    775       // However, if OUTPUT_OFFSET == INVALID_ADDRESS, then input data is
    776       // handled specially--e.g., a .eh_frame section.  The relocation
    777       // routines need to check for each reloc where it should be
    778       // applied.  For this case, we need an input/output view for the
    779       // entire contents of the section in the output file.  We don't
    780       // want to copy the contents of the input section to the output
    781       // section; the output section contents were already written,
    782       // and we waited for them in Relocate_task::is_runnable because
    783       // relocs_must_follow_section_writes is set for the object.
    784 
    785       // Regardless of which of the above cases is true, we have to
    786       // check requires_postprocessing of the output section.  If that
    787       // is false, then we work with views of the output file
    788       // directly.  If it is true, then we work with a separate
    789       // buffer, and the output section is responsible for writing the
    790       // final data to the output file.
    791 
    792       off_t output_section_offset;
    793       Address output_section_size;
    794       if (!os->requires_postprocessing())
    795 	{
    796 	  output_section_offset = os->offset();
    797 	  output_section_size = convert_types<Address, off_t>(os->data_size());
    798 	}
    799       else
    800 	{
    801 	  output_section_offset = 0;
    802 	  output_section_size =
    803               convert_types<Address, off_t>(os->postprocessing_buffer_size());
    804 	}
    805 
    806       off_t view_start;
    807       section_size_type view_size;
    808       bool must_decompress = false;
    809       if (output_offset != invalid_address)
    810 	{
    811 	  view_start = output_section_offset + output_offset;
    812 	  view_size = convert_to_section_size_type(shdr.get_sh_size());
    813 	  section_size_type uncompressed_size;
    814 	  if (this->section_is_compressed(i, &uncompressed_size))
    815 	    {
    816 	      view_size = uncompressed_size;
    817 	      must_decompress = true;
    818 	    }
    819 	}
    820       else
    821 	{
    822 	  view_start = output_section_offset;
    823 	  view_size = convert_to_section_size_type(output_section_size);
    824 	}
    825 
    826       if (view_size == 0)
    827 	continue;
    828 
    829       gold_assert(output_offset == invalid_address
    830 		  || output_offset + view_size <= output_section_size);
    831 
    832       unsigned char* view;
    833       if (os->requires_postprocessing())
    834 	{
    835 	  unsigned char* buffer = os->postprocessing_buffer();
    836 	  view = buffer + view_start;
    837 	  if (output_offset != invalid_address && !must_decompress)
    838 	    {
    839 	      off_t sh_offset = shdr.get_sh_offset();
    840 	      if (!rm.empty() && rm.back().file_offset > sh_offset)
    841 		is_sorted = false;
    842 	      rm.push_back(File_read::Read_multiple_entry(sh_offset,
    843 							  view_size, view));
    844 	    }
    845 	}
    846       else
    847 	{
    848 	  if (output_offset == invalid_address)
    849 	    view = of->get_input_output_view(view_start, view_size);
    850 	  else
    851 	    {
    852 	      view = of->get_output_view(view_start, view_size);
    853 	      if (!must_decompress)
    854 		{
    855 		  off_t sh_offset = shdr.get_sh_offset();
    856 		  if (!rm.empty() && rm.back().file_offset > sh_offset)
    857 		    is_sorted = false;
    858 		  rm.push_back(File_read::Read_multiple_entry(sh_offset,
    859 							      view_size, view));
    860 		}
    861 	    }
    862 	}
    863 
    864       if (must_decompress)
    865         {
    866 	  // Read and decompress the section.
    867           section_size_type len;
    868 	  const unsigned char* p = this->section_contents(i, &len, false);
    869 	  if (!decompress_input_section(p, len, view, view_size))
    870 	    this->error(_("could not decompress section %s"),
    871 			this->section_name(i).c_str());
    872         }
    873 
    874       pvs->view = view;
    875       pvs->address = os->address();
    876       if (output_offset != invalid_address)
    877 	pvs->address += output_offset;
    878       pvs->offset = view_start;
    879       pvs->view_size = view_size;
    880       pvs->is_input_output_view = output_offset == invalid_address;
    881       pvs->is_postprocessing_view = os->requires_postprocessing();
    882       pvs->is_ctors_reverse_view =
    883 	(!parameters->options().relocatable()
    884 	 && view_size > size / 8
    885 	 && (strcmp(os->name(), ".init_array") == 0
    886 	     || strcmp(os->name(), ".fini_array") == 0)
    887 	 && layout->is_ctors_in_init_array(this, i));
    888     }
    889 
    890   // Actually read the data.
    891   if (!rm.empty())
    892     {
    893       if (!is_sorted)
    894 	std::sort(rm.begin(), rm.end(), Read_multiple_compare());
    895       this->read_multiple(rm);
    896     }
    897 }
    898 
    899 // Relocate section data.  VIEWS points to the section data as views
    900 // in the output file.
    901 
    902 template<int size, bool big_endian>
    903 void
    904 Sized_relobj_file<size, big_endian>::do_relocate_sections(
    905     const Symbol_table* symtab,
    906     const Layout* layout,
    907     const unsigned char* pshdrs,
    908     Output_file* of,
    909     Views* pviews)
    910 {
    911   unsigned int shnum = this->shnum();
    912   Sized_target<size, big_endian>* target =
    913     parameters->sized_target<size, big_endian>();
    914 
    915   const Output_sections& out_sections(this->output_sections());
    916   const std::vector<Address>& out_offsets(this->section_offsets());
    917 
    918   Relocate_info<size, big_endian> relinfo;
    919   relinfo.symtab = symtab;
    920   relinfo.layout = layout;
    921   relinfo.object = this;
    922 
    923   const unsigned char* p = pshdrs + This::shdr_size;
    924   for (unsigned int i = 1; i < shnum; ++i, p += This::shdr_size)
    925     {
    926       typename This::Shdr shdr(p);
    927 
    928       unsigned int sh_type = shdr.get_sh_type();
    929       if (sh_type != elfcpp::SHT_REL && sh_type != elfcpp::SHT_RELA)
    930 	continue;
    931 
    932       off_t sh_size = shdr.get_sh_size();
    933       if (sh_size == 0)
    934 	continue;
    935 
    936       unsigned int index = this->adjust_shndx(shdr.get_sh_info());
    937       if (index >= this->shnum())
    938 	{
    939 	  this->error(_("relocation section %u has bad info %u"),
    940 		      i, index);
    941 	  continue;
    942 	}
    943 
    944       Output_section* os = out_sections[index];
    945       if (os == NULL)
    946 	{
    947 	  // This relocation section is against a section which we
    948 	  // discarded.
    949 	  continue;
    950 	}
    951       Address output_offset = out_offsets[index];
    952 
    953       gold_assert((*pviews)[index].view != NULL);
    954       if (parameters->options().relocatable())
    955 	gold_assert((*pviews)[i].view != NULL);
    956 
    957       if (this->adjust_shndx(shdr.get_sh_link()) != this->symtab_shndx_)
    958 	{
    959 	  gold_error(_("relocation section %u uses unexpected "
    960 		       "symbol table %u"),
    961 		     i, this->adjust_shndx(shdr.get_sh_link()));
    962 	  continue;
    963 	}
    964 
    965       const unsigned char* prelocs = this->get_view(shdr.get_sh_offset(),
    966 						    sh_size, true, false);
    967 
    968       unsigned int reloc_size;
    969       if (sh_type == elfcpp::SHT_REL)
    970 	reloc_size = elfcpp::Elf_sizes<size>::rel_size;
    971       else
    972 	reloc_size = elfcpp::Elf_sizes<size>::rela_size;
    973 
    974       if (reloc_size != shdr.get_sh_entsize())
    975 	{
    976 	  gold_error(_("unexpected entsize for reloc section %u: %lu != %u"),
    977 		     i, static_cast<unsigned long>(shdr.get_sh_entsize()),
    978 		     reloc_size);
    979 	  continue;
    980 	}
    981 
    982       size_t reloc_count = sh_size / reloc_size;
    983       if (static_cast<off_t>(reloc_count * reloc_size) != sh_size)
    984 	{
    985 	  gold_error(_("reloc section %u size %lu uneven"),
    986 		     i, static_cast<unsigned long>(sh_size));
    987 	  continue;
    988 	}
    989 
    990       gold_assert(output_offset != invalid_address
    991 		  || this->relocs_must_follow_section_writes());
    992 
    993       relinfo.reloc_shndx = i;
    994       relinfo.reloc_shdr = p;
    995       relinfo.data_shndx = index;
    996       relinfo.data_shdr = pshdrs + index * This::shdr_size;
    997       unsigned char* view = (*pviews)[index].view;
    998       Address address = (*pviews)[index].address;
    999       section_size_type view_size = (*pviews)[index].view_size;
   1000 
   1001       Reloc_symbol_changes* reloc_map = NULL;
   1002       if (this->uses_split_stack() && output_offset != invalid_address)
   1003 	{
   1004 	  typename This::Shdr data_shdr(pshdrs + index * This::shdr_size);
   1005 	  if ((data_shdr.get_sh_flags() & elfcpp::SHF_EXECINSTR) != 0)
   1006 	    this->split_stack_adjust(symtab, pshdrs, sh_type, index,
   1007 				     prelocs, reloc_count, view, view_size,
   1008 				     &reloc_map);
   1009 	}
   1010 
   1011       if (!parameters->options().relocatable())
   1012 	{
   1013 	  target->relocate_section(&relinfo, sh_type, prelocs, reloc_count, os,
   1014 				   output_offset == invalid_address,
   1015 				   view, address, view_size, reloc_map);
   1016 	  if (parameters->options().emit_relocs())
   1017 	    {
   1018 	      Relocatable_relocs* rr = this->relocatable_relocs(i);
   1019 	      target->relocate_relocs(&relinfo, sh_type, prelocs, reloc_count,
   1020 				      os, output_offset, rr,
   1021 				      view, address, view_size,
   1022 				      (*pviews)[i].view,
   1023 				      (*pviews)[i].view_size);
   1024 	    }
   1025 	  if (parameters->incremental())
   1026 	    this->incremental_relocs_write(&relinfo, sh_type, prelocs,
   1027 					   reloc_count, os, output_offset, of);
   1028 	}
   1029       else
   1030 	{
   1031 	  Relocatable_relocs* rr = this->relocatable_relocs(i);
   1032 	  target->relocate_relocs(&relinfo, sh_type, prelocs, reloc_count,
   1033 				  os, output_offset, rr,
   1034 				  view, address, view_size,
   1035 				  (*pviews)[i].view,
   1036 				  (*pviews)[i].view_size);
   1037 	}
   1038     }
   1039 }
   1040 
   1041 // Write the incremental relocs.
   1042 
   1043 template<int size, bool big_endian>
   1044 void
   1045 Sized_relobj_file<size, big_endian>::incremental_relocs_write(
   1046     const Relocate_info<size, big_endian>* relinfo,
   1047     unsigned int sh_type,
   1048     const unsigned char* prelocs,
   1049     size_t reloc_count,
   1050     Output_section* output_section,
   1051     Address output_offset,
   1052     Output_file* of)
   1053 {
   1054   if (sh_type == elfcpp::SHT_REL)
   1055     this->incremental_relocs_write_reltype<elfcpp::SHT_REL>(
   1056 	relinfo,
   1057 	prelocs,
   1058 	reloc_count,
   1059 	output_section,
   1060 	output_offset,
   1061 	of);
   1062   else
   1063     {
   1064       gold_assert(sh_type == elfcpp::SHT_RELA);
   1065       this->incremental_relocs_write_reltype<elfcpp::SHT_RELA>(
   1066 	  relinfo,
   1067 	  prelocs,
   1068 	  reloc_count,
   1069 	  output_section,
   1070 	  output_offset,
   1071 	  of);
   1072     }
   1073 }
   1074 
   1075 // Write the incremental relocs, templatized on the type of the
   1076 // relocation section.
   1077 
   1078 template<int size, bool big_endian>
   1079 template<int sh_type>
   1080 void
   1081 Sized_relobj_file<size, big_endian>::incremental_relocs_write_reltype(
   1082     const Relocate_info<size, big_endian>* relinfo,
   1083     const unsigned char* prelocs,
   1084     size_t reloc_count,
   1085     Output_section* output_section,
   1086     Address output_offset,
   1087     Output_file* of)
   1088 {
   1089   typedef typename Reloc_types<sh_type, size, big_endian>::Reloc Reloc;
   1090   const unsigned int reloc_size =
   1091       Reloc_types<sh_type, size, big_endian>::reloc_size;
   1092   const unsigned int sizeof_addr = size / 8;
   1093   const unsigned int incr_reloc_size =
   1094       Incremental_relocs_reader<size, big_endian>::reloc_size;
   1095 
   1096   unsigned int out_shndx = output_section->out_shndx();
   1097 
   1098   // Get a view for the .gnu_incremental_relocs section.
   1099 
   1100   Incremental_inputs* inputs = relinfo->layout->incremental_inputs();
   1101   gold_assert(inputs != NULL);
   1102   const off_t relocs_off = inputs->relocs_section()->offset();
   1103   const off_t relocs_size = inputs->relocs_section()->data_size();
   1104   unsigned char* const view = of->get_output_view(relocs_off, relocs_size);
   1105 
   1106   for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
   1107     {
   1108       Reloc reloc(prelocs);
   1109 
   1110       typename elfcpp::Elf_types<size>::Elf_WXword r_info = reloc.get_r_info();
   1111       const unsigned int r_sym = elfcpp::elf_r_sym<size>(r_info);
   1112       const unsigned int r_type = elfcpp::elf_r_type<size>(r_info);
   1113 
   1114       if (r_sym < this->local_symbol_count_)
   1115         continue;
   1116 
   1117       // Get the new offset--the location in the output section where
   1118       // this relocation should be applied.
   1119 
   1120       Address offset = reloc.get_r_offset();
   1121       if (output_offset != invalid_address)
   1122 	offset += output_offset;
   1123       else
   1124 	{
   1125           section_offset_type sot_offset =
   1126               convert_types<section_offset_type, Address>(offset);
   1127 	  section_offset_type new_sot_offset =
   1128 	      output_section->output_offset(relinfo->object,
   1129 					    relinfo->data_shndx,
   1130 					    sot_offset);
   1131 	  gold_assert(new_sot_offset != -1);
   1132 	  offset += new_sot_offset;
   1133 	}
   1134 
   1135       // Get the addend.
   1136       typename elfcpp::Elf_types<size>::Elf_Swxword addend;
   1137       if (sh_type == elfcpp::SHT_RELA)
   1138 	addend =
   1139 	    Reloc_types<sh_type, size, big_endian>::get_reloc_addend(&reloc);
   1140       else
   1141         {
   1142           // FIXME: Get the addend for SHT_REL.
   1143           addend = 0;
   1144         }
   1145 
   1146       // Get the index of the output relocation.
   1147 
   1148       unsigned int reloc_index =
   1149           this->next_incremental_reloc_index(r_sym - this->local_symbol_count_);
   1150 
   1151       // Write the relocation.
   1152 
   1153       unsigned char* pov = view + reloc_index * incr_reloc_size;
   1154       elfcpp::Swap<32, big_endian>::writeval(pov, r_type);
   1155       elfcpp::Swap<32, big_endian>::writeval(pov + 4, out_shndx);
   1156       elfcpp::Swap<size, big_endian>::writeval(pov + 8, offset);
   1157       elfcpp::Swap<size, big_endian>::writeval(pov + 8 + sizeof_addr, addend);
   1158       of->write_output_view(pov - view, incr_reloc_size, view);
   1159     }
   1160 }
   1161 
   1162 // Create merge hash tables for the local symbols.  These are used to
   1163 // speed up relocations.
   1164 
   1165 template<int size, bool big_endian>
   1166 void
   1167 Sized_relobj_file<size, big_endian>::initialize_input_to_output_maps()
   1168 {
   1169   const unsigned int loccount = this->local_symbol_count_;
   1170   for (unsigned int i = 1; i < loccount; ++i)
   1171     {
   1172       Symbol_value<size>& lv(this->local_values_[i]);
   1173       lv.initialize_input_to_output_map(this);
   1174     }
   1175 }
   1176 
   1177 // Free merge hash tables for the local symbols.
   1178 
   1179 template<int size, bool big_endian>
   1180 void
   1181 Sized_relobj_file<size, big_endian>::free_input_to_output_maps()
   1182 {
   1183   const unsigned int loccount = this->local_symbol_count_;
   1184   for (unsigned int i = 1; i < loccount; ++i)
   1185     {
   1186       Symbol_value<size>& lv(this->local_values_[i]);
   1187       lv.free_input_to_output_map();
   1188     }
   1189 }
   1190 
   1191 // If an object was compiled with -fsplit-stack, this is called to
   1192 // check whether any relocations refer to functions defined in objects
   1193 // which were not compiled with -fsplit-stack.  If they were, then we
   1194 // need to apply some target-specific adjustments to request
   1195 // additional stack space.
   1196 
   1197 template<int size, bool big_endian>
   1198 void
   1199 Sized_relobj_file<size, big_endian>::split_stack_adjust(
   1200     const Symbol_table* symtab,
   1201     const unsigned char* pshdrs,
   1202     unsigned int sh_type,
   1203     unsigned int shndx,
   1204     const unsigned char* prelocs,
   1205     size_t reloc_count,
   1206     unsigned char* view,
   1207     section_size_type view_size,
   1208     Reloc_symbol_changes** reloc_map)
   1209 {
   1210   if (sh_type == elfcpp::SHT_REL)
   1211     this->split_stack_adjust_reltype<elfcpp::SHT_REL>(symtab, pshdrs, shndx,
   1212 						      prelocs, reloc_count,
   1213 						      view, view_size,
   1214 						      reloc_map);
   1215   else
   1216     {
   1217       gold_assert(sh_type == elfcpp::SHT_RELA);
   1218       this->split_stack_adjust_reltype<elfcpp::SHT_RELA>(symtab, pshdrs, shndx,
   1219 							 prelocs, reloc_count,
   1220 							 view, view_size,
   1221 							 reloc_map);
   1222     }
   1223 }
   1224 
   1225 // Adjust for -fsplit-stack, templatized on the type of the relocation
   1226 // section.
   1227 
   1228 template<int size, bool big_endian>
   1229 template<int sh_type>
   1230 void
   1231 Sized_relobj_file<size, big_endian>::split_stack_adjust_reltype(
   1232     const Symbol_table* symtab,
   1233     const unsigned char* pshdrs,
   1234     unsigned int shndx,
   1235     const unsigned char* prelocs,
   1236     size_t reloc_count,
   1237     unsigned char* view,
   1238     section_size_type view_size,
   1239     Reloc_symbol_changes** reloc_map)
   1240 {
   1241   typedef typename Reloc_types<sh_type, size, big_endian>::Reloc Reltype;
   1242   const int reloc_size = Reloc_types<sh_type, size, big_endian>::reloc_size;
   1243 
   1244   size_t local_count = this->local_symbol_count();
   1245 
   1246   std::vector<section_offset_type> non_split_refs;
   1247 
   1248   const unsigned char* pr = prelocs;
   1249   for (size_t i = 0; i < reloc_count; ++i, pr += reloc_size)
   1250     {
   1251       Reltype reloc(pr);
   1252 
   1253       typename elfcpp::Elf_types<size>::Elf_WXword r_info = reloc.get_r_info();
   1254       unsigned int r_sym = elfcpp::elf_r_sym<size>(r_info);
   1255       if (r_sym < local_count)
   1256 	continue;
   1257 
   1258       const Symbol* gsym = this->global_symbol(r_sym);
   1259       gold_assert(gsym != NULL);
   1260       if (gsym->is_forwarder())
   1261 	gsym = symtab->resolve_forwards(gsym);
   1262 
   1263       // See if this relocation refers to a function defined in an
   1264       // object compiled without -fsplit-stack.  Note that we don't
   1265       // care about the type of relocation--this means that in some
   1266       // cases we will ask for a large stack unnecessarily, but this
   1267       // is not fatal.  FIXME: Some targets have symbols which are
   1268       // functions but are not type STT_FUNC, e.g., STT_ARM_TFUNC.
   1269       if (!gsym->is_undefined()
   1270 	  && gsym->source() == Symbol::FROM_OBJECT
   1271 	  && !gsym->object()->uses_split_stack())
   1272 	{
   1273 	  unsigned int r_type = elfcpp::elf_r_type<size>(reloc.get_r_info());
   1274 	  if (parameters->target().is_call_to_non_split(gsym, r_type))
   1275 	    {
   1276 	      section_offset_type offset =
   1277 		convert_to_section_size_type(reloc.get_r_offset());
   1278 	      non_split_refs.push_back(offset);
   1279 	    }
   1280 	}
   1281     }
   1282 
   1283   if (non_split_refs.empty())
   1284     return;
   1285 
   1286   // At this point, every entry in NON_SPLIT_REFS indicates a
   1287   // relocation which refers to a function in an object compiled
   1288   // without -fsplit-stack.  We now have to convert that list into a
   1289   // set of offsets to functions.  First, we find all the functions.
   1290 
   1291   Function_offsets function_offsets;
   1292   this->find_functions(pshdrs, shndx, &function_offsets);
   1293   if (function_offsets.empty())
   1294     return;
   1295 
   1296   // Now get a list of the function with references to non split-stack
   1297   // code.
   1298 
   1299   Function_offsets calls_non_split;
   1300   for (std::vector<section_offset_type>::const_iterator p
   1301 	 = non_split_refs.begin();
   1302        p != non_split_refs.end();
   1303        ++p)
   1304     {
   1305       Function_offsets::const_iterator low = function_offsets.lower_bound(*p);
   1306       if (low == function_offsets.end())
   1307 	--low;
   1308       else if (low->first == *p)
   1309 	;
   1310       else if (low == function_offsets.begin())
   1311 	continue;
   1312       else
   1313 	--low;
   1314 
   1315       calls_non_split.insert(*low);
   1316     }
   1317   if (calls_non_split.empty())
   1318     return;
   1319 
   1320   // Now we have a set of functions to adjust.  The adjustments are
   1321   // target specific.  Besides changing the output section view
   1322   // however, it likes, the target may request a relocation change
   1323   // from one global symbol name to another.
   1324 
   1325   for (Function_offsets::const_iterator p = calls_non_split.begin();
   1326        p != calls_non_split.end();
   1327        ++p)
   1328     {
   1329       std::string from;
   1330       std::string to;
   1331       parameters->target().calls_non_split(this, shndx, p->first, p->second,
   1332 					   view, view_size, &from, &to);
   1333       if (!from.empty())
   1334 	{
   1335 	  gold_assert(!to.empty());
   1336 	  Symbol* tosym = NULL;
   1337 
   1338 	  // Find relocations in the relevant function which are for
   1339 	  // FROM.
   1340 	  pr = prelocs;
   1341 	  for (size_t i = 0; i < reloc_count; ++i, pr += reloc_size)
   1342 	    {
   1343 	      Reltype reloc(pr);
   1344 
   1345 	      typename elfcpp::Elf_types<size>::Elf_WXword r_info =
   1346 		reloc.get_r_info();
   1347 	      unsigned int r_sym = elfcpp::elf_r_sym<size>(r_info);
   1348 	      if (r_sym < local_count)
   1349 		continue;
   1350 
   1351 	      section_offset_type offset =
   1352 		convert_to_section_size_type(reloc.get_r_offset());
   1353 	      if (offset < p->first
   1354 		  || (offset
   1355 		      >= (p->first
   1356 			  + static_cast<section_offset_type>(p->second))))
   1357 		continue;
   1358 
   1359 	      const Symbol* gsym = this->global_symbol(r_sym);
   1360 	      if (from == gsym->name())
   1361 		{
   1362 		  if (tosym == NULL)
   1363 		    {
   1364 		      tosym = symtab->lookup(to.c_str());
   1365 		      if (tosym == NULL)
   1366 			{
   1367 			  this->error(_("could not convert call "
   1368 					"to '%s' to '%s'"),
   1369 				      from.c_str(), to.c_str());
   1370 			  break;
   1371 			}
   1372 		    }
   1373 
   1374 		  if (*reloc_map == NULL)
   1375 		    *reloc_map = new Reloc_symbol_changes(reloc_count);
   1376 		  (*reloc_map)->set(i, tosym);
   1377 		}
   1378 	    }
   1379 	}
   1380     }
   1381 }
   1382 
   1383 // Find all the function in this object defined in section SHNDX.
   1384 // Store their offsets in the section in FUNCTION_OFFSETS.
   1385 
   1386 template<int size, bool big_endian>
   1387 void
   1388 Sized_relobj_file<size, big_endian>::find_functions(
   1389     const unsigned char* pshdrs,
   1390     unsigned int shndx,
   1391     Sized_relobj_file<size, big_endian>::Function_offsets* function_offsets)
   1392 {
   1393   // We need to read the symbols to find the functions.  If we wanted
   1394   // to, we could cache reading the symbols across all sections in the
   1395   // object.
   1396   const unsigned int symtab_shndx = this->symtab_shndx_;
   1397   typename This::Shdr symtabshdr(pshdrs + symtab_shndx * This::shdr_size);
   1398   gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
   1399 
   1400   typename elfcpp::Elf_types<size>::Elf_WXword sh_size =
   1401     symtabshdr.get_sh_size();
   1402   const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
   1403 					      sh_size, true, true);
   1404 
   1405   const int sym_size = This::sym_size;
   1406   const unsigned int symcount = sh_size / sym_size;
   1407   for (unsigned int i = 0; i < symcount; ++i, psyms += sym_size)
   1408     {
   1409       typename elfcpp::Sym<size, big_endian> isym(psyms);
   1410 
   1411       // FIXME: Some targets can have functions which do not have type
   1412       // STT_FUNC, e.g., STT_ARM_TFUNC.
   1413       if (isym.get_st_type() != elfcpp::STT_FUNC
   1414 	  || isym.get_st_size() == 0)
   1415 	continue;
   1416 
   1417       bool is_ordinary;
   1418       unsigned int sym_shndx = this->adjust_sym_shndx(i, isym.get_st_shndx(),
   1419 						      &is_ordinary);
   1420       if (!is_ordinary || sym_shndx != shndx)
   1421 	continue;
   1422 
   1423       section_offset_type value =
   1424 	convert_to_section_size_type(isym.get_st_value());
   1425       section_size_type fnsize =
   1426 	convert_to_section_size_type(isym.get_st_size());
   1427 
   1428       (*function_offsets)[value] = fnsize;
   1429     }
   1430 }
   1431 
   1432 // Reverse the words in a section.  Used for .ctors sections mapped to
   1433 // .init_array sections.  See ctors_sections_in_init_array in
   1434 // layout.cc.
   1435 
   1436 template<int size, bool big_endian>
   1437 void
   1438 Sized_relobj_file<size, big_endian>::reverse_words(unsigned char* view,
   1439 						   section_size_type view_size)
   1440 {
   1441   typedef typename elfcpp::Swap<size, big_endian>::Valtype Valtype;
   1442   Valtype* vview = reinterpret_cast<Valtype*>(view);
   1443   section_size_type vview_size = view_size / (size / 8);
   1444   for (section_size_type i = 0; i < vview_size / 2; ++i)
   1445     {
   1446       Valtype tmp = vview[i];
   1447       vview[i] = vview[vview_size - 1 - i];
   1448       vview[vview_size - 1 - i] = tmp;
   1449     }
   1450 }
   1451 
   1452 // Class Merged_symbol_value.
   1453 
   1454 template<int size>
   1455 void
   1456 Merged_symbol_value<size>::initialize_input_to_output_map(
   1457     const Relobj* object,
   1458     unsigned int input_shndx)
   1459 {
   1460   Object_merge_map* map = object->merge_map();
   1461   map->initialize_input_to_output_map<size>(input_shndx,
   1462 					    this->output_start_address_,
   1463 					    &this->output_addresses_);
   1464 }
   1465 
   1466 // Get the output value corresponding to an input offset if we
   1467 // couldn't find it in the hash table.
   1468 
   1469 template<int size>
   1470 typename elfcpp::Elf_types<size>::Elf_Addr
   1471 Merged_symbol_value<size>::value_from_output_section(
   1472     const Relobj* object,
   1473     unsigned int input_shndx,
   1474     typename elfcpp::Elf_types<size>::Elf_Addr input_offset) const
   1475 {
   1476   section_offset_type output_offset;
   1477   bool found = object->merge_map()->get_output_offset(NULL, input_shndx,
   1478 						      input_offset,
   1479 						      &output_offset);
   1480 
   1481   // If this assertion fails, it means that some relocation was
   1482   // against a portion of an input merge section which we didn't map
   1483   // to the output file and we didn't explicitly discard.  We should
   1484   // always map all portions of input merge sections.
   1485   gold_assert(found);
   1486 
   1487   if (output_offset == -1)
   1488     return 0;
   1489   else
   1490     return this->output_start_address_ + output_offset;
   1491 }
   1492 
   1493 // Track_relocs methods.
   1494 
   1495 // Initialize the class to track the relocs.  This gets the object,
   1496 // the reloc section index, and the type of the relocs.  This returns
   1497 // false if something goes wrong.
   1498 
   1499 template<int size, bool big_endian>
   1500 bool
   1501 Track_relocs<size, big_endian>::initialize(
   1502     Object* object,
   1503     unsigned int reloc_shndx,
   1504     unsigned int reloc_type)
   1505 {
   1506   // If RELOC_SHNDX is -1U, it means there is more than one reloc
   1507   // section for the .eh_frame section.  We can't handle that case.
   1508   if (reloc_shndx == -1U)
   1509     return false;
   1510 
   1511   // If RELOC_SHNDX is 0, there is no reloc section.
   1512   if (reloc_shndx == 0)
   1513     return true;
   1514 
   1515   // Get the contents of the reloc section.
   1516   this->prelocs_ = object->section_contents(reloc_shndx, &this->len_, false);
   1517 
   1518   if (reloc_type == elfcpp::SHT_REL)
   1519     this->reloc_size_ = elfcpp::Elf_sizes<size>::rel_size;
   1520   else if (reloc_type == elfcpp::SHT_RELA)
   1521     this->reloc_size_ = elfcpp::Elf_sizes<size>::rela_size;
   1522   else
   1523     gold_unreachable();
   1524 
   1525   if (this->len_ % this->reloc_size_ != 0)
   1526     {
   1527       object->error(_("reloc section size %zu is not a multiple of "
   1528 		      "reloc size %d\n"),
   1529 		    static_cast<size_t>(this->len_),
   1530 		    this->reloc_size_);
   1531       return false;
   1532     }
   1533 
   1534   return true;
   1535 }
   1536 
   1537 // Return the offset of the next reloc, or -1 if there isn't one.
   1538 
   1539 template<int size, bool big_endian>
   1540 off_t
   1541 Track_relocs<size, big_endian>::next_offset() const
   1542 {
   1543   if (this->pos_ >= this->len_)
   1544     return -1;
   1545 
   1546   // Rel and Rela start out the same, so we can always use Rel to find
   1547   // the r_offset value.
   1548   elfcpp::Rel<size, big_endian> rel(this->prelocs_ + this->pos_);
   1549   return rel.get_r_offset();
   1550 }
   1551 
   1552 // Return the index of the symbol referenced by the next reloc, or -1U
   1553 // if there aren't any more relocs.
   1554 
   1555 template<int size, bool big_endian>
   1556 unsigned int
   1557 Track_relocs<size, big_endian>::next_symndx() const
   1558 {
   1559   if (this->pos_ >= this->len_)
   1560     return -1U;
   1561 
   1562   // Rel and Rela start out the same, so we can use Rel to find the
   1563   // symbol index.
   1564   elfcpp::Rel<size, big_endian> rel(this->prelocs_ + this->pos_);
   1565   return elfcpp::elf_r_sym<size>(rel.get_r_info());
   1566 }
   1567 
   1568 // Return the addend of the next reloc, or 0 if there isn't one.
   1569 
   1570 template<int size, bool big_endian>
   1571 uint64_t
   1572 Track_relocs<size, big_endian>::next_addend() const
   1573 {
   1574   if (this->pos_ >= this->len_)
   1575     return 0;
   1576   if (this->reloc_size_ == elfcpp::Elf_sizes<size>::rel_size)
   1577     return 0;
   1578   elfcpp::Rela<size, big_endian> rela(this->prelocs_ + this->pos_);
   1579   return rela.get_r_addend();
   1580 }
   1581 
   1582 // Advance to the next reloc whose r_offset is greater than or equal
   1583 // to OFFSET.  Return the number of relocs we skip.
   1584 
   1585 template<int size, bool big_endian>
   1586 int
   1587 Track_relocs<size, big_endian>::advance(off_t offset)
   1588 {
   1589   int ret = 0;
   1590   while (this->pos_ < this->len_)
   1591     {
   1592       // Rel and Rela start out the same, so we can always use Rel to
   1593       // find the r_offset value.
   1594       elfcpp::Rel<size, big_endian> rel(this->prelocs_ + this->pos_);
   1595       if (static_cast<off_t>(rel.get_r_offset()) >= offset)
   1596 	break;
   1597       ++ret;
   1598       this->pos_ += this->reloc_size_;
   1599     }
   1600   return ret;
   1601 }
   1602 
   1603 // Instantiate the templates we need.
   1604 
   1605 #ifdef HAVE_TARGET_32_LITTLE
   1606 template
   1607 void
   1608 Sized_relobj_file<32, false>::do_read_relocs(Read_relocs_data* rd);
   1609 #endif
   1610 
   1611 #ifdef HAVE_TARGET_32_BIG
   1612 template
   1613 void
   1614 Sized_relobj_file<32, true>::do_read_relocs(Read_relocs_data* rd);
   1615 #endif
   1616 
   1617 #ifdef HAVE_TARGET_64_LITTLE
   1618 template
   1619 void
   1620 Sized_relobj_file<64, false>::do_read_relocs(Read_relocs_data* rd);
   1621 #endif
   1622 
   1623 #ifdef HAVE_TARGET_64_BIG
   1624 template
   1625 void
   1626 Sized_relobj_file<64, true>::do_read_relocs(Read_relocs_data* rd);
   1627 #endif
   1628 
   1629 #ifdef HAVE_TARGET_32_LITTLE
   1630 template
   1631 void
   1632 Sized_relobj_file<32, false>::do_gc_process_relocs(Symbol_table* symtab,
   1633 						   Layout* layout,
   1634 						   Read_relocs_data* rd);
   1635 #endif
   1636 
   1637 #ifdef HAVE_TARGET_32_BIG
   1638 template
   1639 void
   1640 Sized_relobj_file<32, true>::do_gc_process_relocs(Symbol_table* symtab,
   1641 						  Layout* layout,
   1642 						  Read_relocs_data* rd);
   1643 #endif
   1644 
   1645 #ifdef HAVE_TARGET_64_LITTLE
   1646 template
   1647 void
   1648 Sized_relobj_file<64, false>::do_gc_process_relocs(Symbol_table* symtab,
   1649 						   Layout* layout,
   1650 						   Read_relocs_data* rd);
   1651 #endif
   1652 
   1653 #ifdef HAVE_TARGET_64_BIG
   1654 template
   1655 void
   1656 Sized_relobj_file<64, true>::do_gc_process_relocs(Symbol_table* symtab,
   1657 						  Layout* layout,
   1658 						  Read_relocs_data* rd);
   1659 #endif
   1660 
   1661 #ifdef HAVE_TARGET_32_LITTLE
   1662 template
   1663 void
   1664 Sized_relobj_file<32, false>::do_scan_relocs(Symbol_table* symtab,
   1665 					     Layout* layout,
   1666 					     Read_relocs_data* rd);
   1667 #endif
   1668 
   1669 #ifdef HAVE_TARGET_32_BIG
   1670 template
   1671 void
   1672 Sized_relobj_file<32, true>::do_scan_relocs(Symbol_table* symtab,
   1673 					    Layout* layout,
   1674 					    Read_relocs_data* rd);
   1675 #endif
   1676 
   1677 #ifdef HAVE_TARGET_64_LITTLE
   1678 template
   1679 void
   1680 Sized_relobj_file<64, false>::do_scan_relocs(Symbol_table* symtab,
   1681 					     Layout* layout,
   1682 					     Read_relocs_data* rd);
   1683 #endif
   1684 
   1685 #ifdef HAVE_TARGET_64_BIG
   1686 template
   1687 void
   1688 Sized_relobj_file<64, true>::do_scan_relocs(Symbol_table* symtab,
   1689 					    Layout* layout,
   1690 					    Read_relocs_data* rd);
   1691 #endif
   1692 
   1693 #ifdef HAVE_TARGET_32_LITTLE
   1694 template
   1695 void
   1696 Sized_relobj_file<32, false>::do_relocate(const Symbol_table* symtab,
   1697 					  const Layout* layout,
   1698 					  Output_file* of);
   1699 #endif
   1700 
   1701 #ifdef HAVE_TARGET_32_BIG
   1702 template
   1703 void
   1704 Sized_relobj_file<32, true>::do_relocate(const Symbol_table* symtab,
   1705 					 const Layout* layout,
   1706 					 Output_file* of);
   1707 #endif
   1708 
   1709 #ifdef HAVE_TARGET_64_LITTLE
   1710 template
   1711 void
   1712 Sized_relobj_file<64, false>::do_relocate(const Symbol_table* symtab,
   1713 					  const Layout* layout,
   1714 					  Output_file* of);
   1715 #endif
   1716 
   1717 #ifdef HAVE_TARGET_64_BIG
   1718 template
   1719 void
   1720 Sized_relobj_file<64, true>::do_relocate(const Symbol_table* symtab,
   1721 					 const Layout* layout,
   1722 					 Output_file* of);
   1723 #endif
   1724 
   1725 #ifdef HAVE_TARGET_32_LITTLE
   1726 template
   1727 void
   1728 Sized_relobj_file<32, false>::do_relocate_sections(
   1729     const Symbol_table* symtab,
   1730     const Layout* layout,
   1731     const unsigned char* pshdrs,
   1732     Output_file* of,
   1733     Views* pviews);
   1734 #endif
   1735 
   1736 #ifdef HAVE_TARGET_32_BIG
   1737 template
   1738 void
   1739 Sized_relobj_file<32, true>::do_relocate_sections(
   1740     const Symbol_table* symtab,
   1741     const Layout* layout,
   1742     const unsigned char* pshdrs,
   1743     Output_file* of,
   1744     Views* pviews);
   1745 #endif
   1746 
   1747 #ifdef HAVE_TARGET_64_LITTLE
   1748 template
   1749 void
   1750 Sized_relobj_file<64, false>::do_relocate_sections(
   1751     const Symbol_table* symtab,
   1752     const Layout* layout,
   1753     const unsigned char* pshdrs,
   1754     Output_file* of,
   1755     Views* pviews);
   1756 #endif
   1757 
   1758 #ifdef HAVE_TARGET_64_BIG
   1759 template
   1760 void
   1761 Sized_relobj_file<64, true>::do_relocate_sections(
   1762     const Symbol_table* symtab,
   1763     const Layout* layout,
   1764     const unsigned char* pshdrs,
   1765     Output_file* of,
   1766     Views* pviews);
   1767 #endif
   1768 
   1769 #ifdef HAVE_TARGET_32_LITTLE
   1770 template
   1771 void
   1772 Sized_relobj_file<32, false>::initialize_input_to_output_maps();
   1773 
   1774 template
   1775 void
   1776 Sized_relobj_file<32, false>::free_input_to_output_maps();
   1777 #endif
   1778 
   1779 #ifdef HAVE_TARGET_32_BIG
   1780 template
   1781 void
   1782 Sized_relobj_file<32, true>::initialize_input_to_output_maps();
   1783 
   1784 template
   1785 void
   1786 Sized_relobj_file<32, true>::free_input_to_output_maps();
   1787 #endif
   1788 
   1789 #ifdef HAVE_TARGET_64_LITTLE
   1790 template
   1791 void
   1792 Sized_relobj_file<64, false>::initialize_input_to_output_maps();
   1793 
   1794 template
   1795 void
   1796 Sized_relobj_file<64, false>::free_input_to_output_maps();
   1797 #endif
   1798 
   1799 #ifdef HAVE_TARGET_64_BIG
   1800 template
   1801 void
   1802 Sized_relobj_file<64, true>::initialize_input_to_output_maps();
   1803 
   1804 template
   1805 void
   1806 Sized_relobj_file<64, true>::free_input_to_output_maps();
   1807 #endif
   1808 
   1809 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG)
   1810 template
   1811 class Merged_symbol_value<32>;
   1812 #endif
   1813 
   1814 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG)
   1815 template
   1816 class Merged_symbol_value<64>;
   1817 #endif
   1818 
   1819 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG)
   1820 template
   1821 class Symbol_value<32>;
   1822 #endif
   1823 
   1824 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG)
   1825 template
   1826 class Symbol_value<64>;
   1827 #endif
   1828 
   1829 #ifdef HAVE_TARGET_32_LITTLE
   1830 template
   1831 class Track_relocs<32, false>;
   1832 #endif
   1833 
   1834 #ifdef HAVE_TARGET_32_BIG
   1835 template
   1836 class Track_relocs<32, true>;
   1837 #endif
   1838 
   1839 #ifdef HAVE_TARGET_64_LITTLE
   1840 template
   1841 class Track_relocs<64, false>;
   1842 #endif
   1843 
   1844 #ifdef HAVE_TARGET_64_BIG
   1845 template
   1846 class Track_relocs<64, true>;
   1847 #endif
   1848 
   1849 } // End namespace gold.
   1850