Home | History | Annotate | Download | only in gold
      1 // reloc.h -- relocate input files for gold   -*- C++ -*-
      2 
      3 // Copyright (C) 2006-2016 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 #ifndef GOLD_RELOC_H
     24 #define GOLD_RELOC_H
     25 
     26 #include <vector>
     27 #ifdef HAVE_BYTESWAP_H
     28 #include <byteswap.h>
     29 #endif
     30 
     31 #include "elfcpp.h"
     32 #include "workqueue.h"
     33 
     34 namespace gold
     35 {
     36 
     37 class General_options;
     38 class Object;
     39 class Relobj;
     40 struct Read_relocs_data;
     41 class Symbol;
     42 class Layout;
     43 class Output_data;
     44 class Output_section;
     45 
     46 template<int size>
     47 class Sized_symbol;
     48 
     49 template<int size, bool big_endian>
     50 class Sized_relobj_file;
     51 
     52 template<int size>
     53 class Symbol_value;
     54 
     55 template<int sh_type, bool dynamic, int size, bool big_endian>
     56 class Output_data_reloc;
     57 
     58 // A class to read the relocations for an object file, and then queue
     59 // up a task to see if they require any GOT/PLT/COPY relocations in
     60 // the symbol table.
     61 
     62 class Read_relocs : public Task
     63 {
     64  public:
     65   //   THIS_BLOCKER and NEXT_BLOCKER are passed along to a Scan_relocs
     66   // or Gc_process_relocs task, so that they run in a deterministic
     67   // order.
     68   Read_relocs(Symbol_table* symtab, Layout* layout, Relobj* object,
     69 	      Task_token* this_blocker, Task_token* next_blocker)
     70     : symtab_(symtab), layout_(layout), object_(object),
     71       this_blocker_(this_blocker), next_blocker_(next_blocker)
     72   { }
     73 
     74   // The standard Task methods.
     75 
     76   Task_token*
     77   is_runnable();
     78 
     79   void
     80   locks(Task_locker*);
     81 
     82   void
     83   run(Workqueue*);
     84 
     85   std::string
     86   get_name() const;
     87 
     88  private:
     89   Symbol_table* symtab_;
     90   Layout* layout_;
     91   Relobj* object_;
     92   Task_token* this_blocker_;
     93   Task_token* next_blocker_;
     94 };
     95 
     96 // Process the relocs to figure out which sections are garbage.
     97 // Very similar to scan relocs.
     98 
     99 class Gc_process_relocs : public Task
    100 {
    101  public:
    102   // THIS_BLOCKER prevents this task from running until the previous
    103   // one is finished.  NEXT_BLOCKER prevents the next task from
    104   // running.
    105   Gc_process_relocs(Symbol_table* symtab, Layout* layout, Relobj* object,
    106 		    Read_relocs_data* rd, Task_token* this_blocker,
    107 		    Task_token* next_blocker)
    108     : symtab_(symtab), layout_(layout), object_(object), rd_(rd),
    109       this_blocker_(this_blocker), next_blocker_(next_blocker)
    110   { }
    111 
    112   ~Gc_process_relocs();
    113 
    114   // The standard Task methods.
    115 
    116   Task_token*
    117   is_runnable();
    118 
    119   void
    120   locks(Task_locker*);
    121 
    122   void
    123   run(Workqueue*);
    124 
    125   std::string
    126   get_name() const;
    127 
    128  private:
    129   Symbol_table* symtab_;
    130   Layout* layout_;
    131   Relobj* object_;
    132   Read_relocs_data* rd_;
    133   Task_token* this_blocker_;
    134   Task_token* next_blocker_;
    135 };
    136 
    137 // Scan the relocations for an object to see if they require any
    138 // GOT/PLT/COPY relocations.
    139 
    140 class Scan_relocs : public Task
    141 {
    142  public:
    143   // THIS_BLOCKER prevents this task from running until the previous
    144   // one is finished.  NEXT_BLOCKER prevents the next task from
    145   // running.
    146   Scan_relocs(Symbol_table* symtab, Layout* layout, Relobj* object,
    147 	      Read_relocs_data* rd, Task_token* this_blocker,
    148 	      Task_token* next_blocker)
    149     : symtab_(symtab), layout_(layout), object_(object), rd_(rd),
    150       this_blocker_(this_blocker), next_blocker_(next_blocker)
    151   { }
    152 
    153   ~Scan_relocs();
    154 
    155   // The standard Task methods.
    156 
    157   Task_token*
    158   is_runnable();
    159 
    160   void
    161   locks(Task_locker*);
    162 
    163   void
    164   run(Workqueue*);
    165 
    166   std::string
    167   get_name() const;
    168 
    169  private:
    170   Symbol_table* symtab_;
    171   Layout* layout_;
    172   Relobj* object_;
    173   Read_relocs_data* rd_;
    174   Task_token* this_blocker_;
    175   Task_token* next_blocker_;
    176 };
    177 
    178 // A class to perform all the relocations for an object file.
    179 
    180 class Relocate_task : public Task
    181 {
    182  public:
    183   Relocate_task(const Symbol_table* symtab, const Layout* layout,
    184 		Relobj* object, Output_file* of,
    185 		Task_token* input_sections_blocker,
    186 		Task_token* output_sections_blocker, Task_token* final_blocker)
    187     : symtab_(symtab), layout_(layout), object_(object), of_(of),
    188       input_sections_blocker_(input_sections_blocker),
    189       output_sections_blocker_(output_sections_blocker),
    190       final_blocker_(final_blocker)
    191   { }
    192 
    193   // The standard Task methods.
    194 
    195   Task_token*
    196   is_runnable();
    197 
    198   void
    199   locks(Task_locker*);
    200 
    201   void
    202   run(Workqueue*);
    203 
    204   std::string
    205   get_name() const;
    206 
    207  private:
    208   const Symbol_table* symtab_;
    209   const Layout* layout_;
    210   Relobj* object_;
    211   Output_file* of_;
    212   Task_token* input_sections_blocker_;
    213   Task_token* output_sections_blocker_;
    214   Task_token* final_blocker_;
    215 };
    216 
    217 // During a relocatable link, this class records how relocations
    218 // should be handled for a single input reloc section.  An instance of
    219 // this class is created while scanning relocs, and it is used while
    220 // processing relocs.
    221 
    222 class Relocatable_relocs
    223 {
    224  public:
    225   // We use a vector of unsigned char to indicate how the input relocs
    226   // should be handled.  Each element is one of the following values.
    227   // We create this vector when we initially scan the relocations.
    228   enum Reloc_strategy
    229   {
    230     // Copy the input reloc.  Don't modify it other than updating the
    231     // r_offset field and the r_sym part of the r_info field.
    232     RELOC_COPY,
    233     // Copy the input reloc which is against an STT_SECTION symbol.
    234     // Update the r_offset and r_sym part of the r_info field.  Adjust
    235     // the addend by subtracting the value of the old local symbol and
    236     // adding the value of the new local symbol.  The addend is in the
    237     // SHT_RELA reloc and the contents of the data section do not need
    238     // to be changed.
    239     RELOC_ADJUST_FOR_SECTION_RELA,
    240     // Like RELOC_ADJUST_FOR_SECTION_RELA but the addend should not be
    241     // adjusted.
    242     RELOC_ADJUST_FOR_SECTION_0,
    243     // Like RELOC_ADJUST_FOR_SECTION_RELA but the contents of the
    244     // section need to be changed.  The number indicates the number of
    245     // bytes in the addend in the section contents.
    246     RELOC_ADJUST_FOR_SECTION_1,
    247     RELOC_ADJUST_FOR_SECTION_2,
    248     RELOC_ADJUST_FOR_SECTION_4,
    249     RELOC_ADJUST_FOR_SECTION_8,
    250     // Like RELOC_ADJUST_FOR_SECTION_4 but for unaligned relocs.
    251     RELOC_ADJUST_FOR_SECTION_4_UNALIGNED,
    252     // Discard the input reloc--process it completely when relocating
    253     // the data section contents.
    254     RELOC_DISCARD,
    255     // An input reloc which is not discarded, but which requires
    256     // target specific processing in order to update it.
    257     RELOC_SPECIAL
    258   };
    259 
    260   Relocatable_relocs()
    261     : reloc_strategies_(), output_reloc_count_(0), posd_(NULL)
    262   { }
    263 
    264   // Record the number of relocs.
    265   void
    266   set_reloc_count(size_t reloc_count)
    267   { this->reloc_strategies_.reserve(reloc_count); }
    268 
    269   // Record what to do for the next reloc.
    270   void
    271   set_next_reloc_strategy(Reloc_strategy strategy)
    272   {
    273     this->reloc_strategies_.push_back(static_cast<unsigned char>(strategy));
    274     if (strategy != RELOC_DISCARD)
    275       ++this->output_reloc_count_;
    276   }
    277 
    278   // Record the Output_data associated with this reloc section.
    279   void
    280   set_output_data(Output_data* posd)
    281   {
    282     gold_assert(this->posd_ == NULL);
    283     this->posd_ = posd;
    284   }
    285 
    286   // Return the Output_data associated with this reloc section.
    287   Output_data*
    288   output_data() const
    289   { return this->posd_; }
    290 
    291   // Return what to do for reloc I.
    292   Reloc_strategy
    293   strategy(unsigned int i) const
    294   {
    295     gold_assert(i < this->reloc_strategies_.size());
    296     return static_cast<Reloc_strategy>(this->reloc_strategies_[i]);
    297   }
    298 
    299   // Set the strategy for reloc I.
    300   void
    301   set_strategy(unsigned int i, Reloc_strategy strategy)
    302   {
    303     gold_assert(i < this->reloc_strategies_.size());
    304     this->reloc_strategies_[i] = strategy;
    305   }
    306 
    307   // Return the number of relocations to create in the output file.
    308   size_t
    309   output_reloc_count() const
    310   { return this->output_reloc_count_; }
    311 
    312  private:
    313   typedef std::vector<unsigned char> Reloc_strategies;
    314 
    315   // The strategies for the input reloc.  There is one entry in this
    316   // vector for each relocation in the input section.
    317   Reloc_strategies reloc_strategies_;
    318   // The number of relocations to be created in the output file.
    319   size_t output_reloc_count_;
    320   // The output data structure associated with this relocation.
    321   Output_data* posd_;
    322 };
    323 
    324 template<int valsize>
    325 class Bits;
    326 
    327 // Standard relocation routines which are used on many targets.  Here
    328 // SIZE and BIG_ENDIAN refer to the target, not the relocation type.
    329 
    330 template<int size, bool big_endian>
    331 class Relocate_functions
    332 {
    333  public:
    334   typedef typename elfcpp::Elf_types<size>::Elf_Addr Address;
    335   typedef typename elfcpp::Elf_types<size>::Elf_Swxword Addendtype;
    336 
    337   enum Overflow_check
    338   {
    339     // No overflow checking.
    340     CHECK_NONE,
    341     // Check for overflow of a signed value.
    342     CHECK_SIGNED,
    343     // Check for overflow of an unsigned value.
    344     CHECK_UNSIGNED,
    345     // Check for overflow of a signed or unsigned value.
    346     // (i.e., no error if either signed or unsigned fits.)
    347     CHECK_SIGNED_OR_UNSIGNED
    348   };
    349 
    350   enum Reloc_status
    351   {
    352     RELOC_OK,
    353     RELOC_OVERFLOW
    354   };
    355 
    356  private:
    357   // Check for overflow.
    358   template<int valsize>
    359   static inline Reloc_status
    360   check_overflow(Address value, Overflow_check check)
    361   {
    362     switch (check)
    363       {
    364       case CHECK_SIGNED:
    365         if (size == 32)
    366 	  return (Bits<valsize>::has_overflow32(value)
    367 		  ? RELOC_OVERFLOW
    368 		  : RELOC_OK);
    369 	else
    370 	  return (Bits<valsize>::has_overflow(value)
    371 		  ? RELOC_OVERFLOW
    372 		  : RELOC_OK);
    373       case CHECK_UNSIGNED:
    374         if (size == 32)
    375 	  return (Bits<valsize>::has_unsigned_overflow32(value)
    376 		  ? RELOC_OVERFLOW
    377 		  : RELOC_OK);
    378 	else
    379 	  return (Bits<valsize>::has_unsigned_overflow(value)
    380 		  ? RELOC_OVERFLOW
    381 		  : RELOC_OK);
    382       case CHECK_SIGNED_OR_UNSIGNED:
    383         if (size == 32)
    384 	  return (Bits<valsize>::has_signed_unsigned_overflow32(value)
    385 		  ? RELOC_OVERFLOW
    386 		  : RELOC_OK);
    387 	else
    388 	  return (Bits<valsize>::has_signed_unsigned_overflow64(value)
    389 		  ? RELOC_OVERFLOW
    390 		  : RELOC_OK);
    391       case CHECK_NONE:
    392       default:
    393         return RELOC_OK;
    394       }
    395   }
    396 
    397   // Do a simple relocation with the addend in the section contents.
    398   // VALSIZE is the size of the value.
    399   template<int valsize>
    400   static inline Reloc_status
    401   rel(unsigned char* view, Address value, Overflow_check check)
    402   {
    403     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
    404     Valtype* wv = reinterpret_cast<Valtype*>(view);
    405     Valtype addend = elfcpp::Swap<valsize, big_endian>::readval(wv);
    406     value += addend;
    407     elfcpp::Swap<valsize, big_endian>::
    408 	writeval(wv, static_cast<Valtype>(value));
    409     return check_overflow<valsize>(value, check);
    410   }
    411 
    412   // Like the above but for relocs at unaligned addresses.
    413   template<int valsize>
    414   static inline Reloc_status
    415   rel_unaligned(unsigned char* view, Address value, Overflow_check check)
    416   {
    417     typedef typename elfcpp::Swap_unaligned<valsize, big_endian>::Valtype
    418 	Valtype;
    419     Valtype addend = elfcpp::Swap_unaligned<valsize, big_endian>::readval(view);
    420     value += addend;
    421     elfcpp::Swap_unaligned<valsize, big_endian>::
    422 	writeval(view, static_cast<Valtype>(value));
    423     return check_overflow<valsize>(value, check);
    424   }
    425 
    426   // Do a simple relocation using a Symbol_value with the addend in
    427   // the section contents.  VALSIZE is the size of the value to
    428   // relocate.
    429   template<int valsize>
    430   static inline Reloc_status
    431   rel(unsigned char* view,
    432       const Sized_relobj_file<size, big_endian>* object,
    433       const Symbol_value<size>* psymval,
    434       Overflow_check check)
    435   {
    436     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
    437     Valtype* wv = reinterpret_cast<Valtype*>(view);
    438     Valtype addend = elfcpp::Swap<valsize, big_endian>::readval(wv);
    439     Address value = psymval->value(object, addend);
    440     elfcpp::Swap<valsize, big_endian>::
    441 	writeval(wv, static_cast<Valtype>(value));
    442     return check_overflow<valsize>(value, check);
    443   }
    444 
    445   // Like the above but for relocs at unaligned addresses.
    446   template<int valsize>
    447   static inline Reloc_status
    448   rel_unaligned(unsigned char* view,
    449                 const Sized_relobj_file<size, big_endian>* object,
    450                 const Symbol_value<size>* psymval,
    451                 Overflow_check check)
    452   {
    453     typedef typename elfcpp::Swap_unaligned<valsize, big_endian>::Valtype
    454         Valtype;
    455     Valtype addend = elfcpp::Swap_unaligned<valsize, big_endian>::readval(view);
    456     Address value = psymval->value(object, addend);
    457     elfcpp::Swap_unaligned<valsize, big_endian>::writeval(view, value);
    458     return check_overflow<valsize>(value, check);
    459   }
    460 
    461   // Do a simple relocation with the addend in the relocation.
    462   // VALSIZE is the size of the value.
    463   template<int valsize>
    464   static inline Reloc_status
    465   rela(unsigned char* view, Address value, Addendtype addend,
    466        Overflow_check check)
    467   {
    468     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
    469     Valtype* wv = reinterpret_cast<Valtype*>(view);
    470     value += addend;
    471     elfcpp::Swap<valsize, big_endian>::writeval(wv, value);
    472     return check_overflow<valsize>(value, check);
    473   }
    474 
    475   // Do a simple relocation using a symbol value with the addend in
    476   // the relocation.  VALSIZE is the size of the value.
    477   template<int valsize>
    478   static inline Reloc_status
    479   rela(unsigned char* view,
    480        const Sized_relobj_file<size, big_endian>* object,
    481        const Symbol_value<size>* psymval,
    482        Addendtype addend,
    483        Overflow_check check)
    484   {
    485     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
    486     Valtype* wv = reinterpret_cast<Valtype*>(view);
    487     Address value = psymval->value(object, addend);
    488     elfcpp::Swap<valsize, big_endian>::writeval(wv, value);
    489     return check_overflow<valsize>(value, check);
    490   }
    491 
    492   // Do a simple PC relative relocation with the addend in the section
    493   // contents.  VALSIZE is the size of the value.
    494   template<int valsize>
    495   static inline Reloc_status
    496   pcrel(unsigned char* view, Address value, Address address,
    497 	Overflow_check check)
    498   {
    499     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
    500     Valtype* wv = reinterpret_cast<Valtype*>(view);
    501     Valtype addend = elfcpp::Swap<valsize, big_endian>::readval(wv);
    502     value = value + addend - address;
    503     elfcpp::Swap<valsize, big_endian>::writeval(wv, value);
    504     return check_overflow<valsize>(value, check);
    505   }
    506 
    507   // Like the above but for relocs at unaligned addresses.
    508   template<int valsize>
    509   static inline Reloc_status
    510   pcrel_unaligned(unsigned char* view, Address value, Address address,
    511 		  Overflow_check check)
    512   {
    513     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
    514     Valtype addend = elfcpp::Swap_unaligned<valsize, big_endian>::readval(view);
    515     value = value + addend - address;
    516     elfcpp::Swap_unaligned<valsize, big_endian>::writeval(view, value);
    517     return check_overflow<valsize>(value, check);
    518   }
    519 
    520   // Do a simple PC relative relocation with a Symbol_value with the
    521   // addend in the section contents.  VALSIZE is the size of the
    522   // value.
    523   template<int valsize>
    524   static inline Reloc_status
    525   pcrel(unsigned char* view,
    526 	const Sized_relobj_file<size, big_endian>* object,
    527 	const Symbol_value<size>* psymval,
    528 	Address address,
    529 	Overflow_check check)
    530   {
    531     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
    532     Valtype* wv = reinterpret_cast<Valtype*>(view);
    533     Valtype addend = elfcpp::Swap<valsize, big_endian>::readval(wv);
    534     Address value = psymval->value(object, addend) - address;
    535     elfcpp::Swap<valsize, big_endian>::writeval(wv, value);
    536     return check_overflow<valsize>(value, check);
    537   }
    538 
    539   // Do a simple PC relative relocation with the addend in the
    540   // relocation.  VALSIZE is the size of the value.
    541   template<int valsize>
    542   static inline Reloc_status
    543   pcrela(unsigned char* view, Address value, Addendtype addend, Address address,
    544 	 Overflow_check check)
    545   {
    546     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
    547     Valtype* wv = reinterpret_cast<Valtype*>(view);
    548     value = value + addend - address;
    549     elfcpp::Swap<valsize, big_endian>::writeval(wv, value);
    550     return check_overflow<valsize>(value, check);
    551   }
    552 
    553   // Do a simple PC relative relocation with a Symbol_value with the
    554   // addend in the relocation.  VALSIZE is the size of the value.
    555   template<int valsize>
    556   static inline Reloc_status
    557   pcrela(unsigned char* view,
    558 	 const Sized_relobj_file<size, big_endian>* object,
    559 	 const Symbol_value<size>* psymval,
    560 	 Addendtype addend,
    561 	 Address address,
    562 	 Overflow_check check)
    563   {
    564     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
    565     Valtype* wv = reinterpret_cast<Valtype*>(view);
    566     Address value = psymval->value(object, addend) - address;
    567     elfcpp::Swap<valsize, big_endian>::writeval(wv, value);
    568     return check_overflow<valsize>(value, check);
    569   }
    570 
    571   typedef Relocate_functions<size, big_endian> This;
    572 
    573  public:
    574   // Do a simple 8-bit REL relocation with the addend in the section
    575   // contents.
    576   static inline void
    577   rel8(unsigned char* view, Address value)
    578   { This::template rel<8>(view, value, CHECK_NONE); }
    579 
    580   static inline Reloc_status
    581   rel8_check(unsigned char* view, Address value, Overflow_check check)
    582   { return This::template rel<8>(view, value, check); }
    583 
    584   static inline void
    585   rel8(unsigned char* view,
    586        const Sized_relobj_file<size, big_endian>* object,
    587        const Symbol_value<size>* psymval)
    588   { This::template rel<8>(view, object, psymval, CHECK_NONE); }
    589 
    590   static inline Reloc_status
    591   rel8_check(unsigned char* view,
    592 	     const Sized_relobj_file<size, big_endian>* object,
    593 	     const Symbol_value<size>* psymval,
    594 	     Overflow_check check)
    595   { return This::template rel<8>(view, object, psymval, check); }
    596 
    597   // Do an 8-bit RELA relocation with the addend in the relocation.
    598   static inline void
    599   rela8(unsigned char* view, Address value, Addendtype addend)
    600   { This::template rela<8>(view, value, addend, CHECK_NONE); }
    601 
    602   static inline Reloc_status
    603   rela8_check(unsigned char* view, Address value, Addendtype addend,
    604 	      Overflow_check check)
    605   { return This::template rela<8>(view, value, addend, check); }
    606 
    607   static inline void
    608   rela8(unsigned char* view,
    609 	const Sized_relobj_file<size, big_endian>* object,
    610 	const Symbol_value<size>* psymval,
    611 	Addendtype addend)
    612   { This::template rela<8>(view, object, psymval, addend, CHECK_NONE); }
    613 
    614   static inline Reloc_status
    615   rela8_check(unsigned char* view,
    616 	      const Sized_relobj_file<size, big_endian>* object,
    617 	      const Symbol_value<size>* psymval,
    618 	      Addendtype addend,
    619 	      Overflow_check check)
    620   { return This::template rela<8>(view, object, psymval, addend, check); }
    621 
    622   // Do a simple 8-bit PC relative relocation with the addend in the
    623   // section contents.
    624   static inline void
    625   pcrel8(unsigned char* view, unsigned char value, Address address)
    626   { This::template pcrel<8>(view, value, address, CHECK_NONE); }
    627 
    628   static inline Reloc_status
    629   pcrel8_check(unsigned char* view, unsigned char value, Address address,
    630 	       Overflow_check check)
    631   { return This::template pcrel<8>(view, value, address, check); }
    632 
    633   static inline void
    634   pcrel8(unsigned char* view,
    635 	 const Sized_relobj_file<size, big_endian>* object,
    636 	 const Symbol_value<size>* psymval,
    637 	 Address address)
    638   { This::template pcrel<8>(view, object, psymval, address, CHECK_NONE); }
    639 
    640   static inline Reloc_status
    641   pcrel8_check(unsigned char* view,
    642 	       const Sized_relobj_file<size, big_endian>* object,
    643 	       const Symbol_value<size>* psymval,
    644 	       Address address,
    645 	       Overflow_check check)
    646   { return This::template pcrel<8>(view, object, psymval, address, check); }
    647 
    648   // Do a simple 8-bit PC relative RELA relocation with the addend in
    649   // the reloc.
    650   static inline void
    651   pcrela8(unsigned char* view, Address value, Addendtype addend,
    652 	  Address address)
    653   { This::template pcrela<8>(view, value, addend, address, CHECK_NONE); }
    654 
    655   static inline Reloc_status
    656   pcrela8_check(unsigned char* view, Address value, Addendtype addend,
    657 		Address address, Overflow_check check)
    658   { return This::template pcrela<8>(view, value, addend, address, check); }
    659 
    660   static inline void
    661   pcrela8(unsigned char* view,
    662 	  const Sized_relobj_file<size, big_endian>* object,
    663 	  const Symbol_value<size>* psymval,
    664 	  Addendtype addend,
    665 	  Address address)
    666   { This::template pcrela<8>(view, object, psymval, addend, address,
    667 			     CHECK_NONE); }
    668 
    669   static inline Reloc_status
    670   pcrela8_check(unsigned char* view,
    671 		const Sized_relobj_file<size, big_endian>* object,
    672 		const Symbol_value<size>* psymval,
    673 		Addendtype addend,
    674 		Address address,
    675 		Overflow_check check)
    676   { return This::template pcrela<8>(view, object, psymval, addend, address,
    677 				    check); }
    678 
    679   // Do a simple 16-bit REL relocation with the addend in the section
    680   // contents.
    681   static inline void
    682   rel16(unsigned char* view, Address value)
    683   { This::template rel<16>(view, value, CHECK_NONE); }
    684 
    685   static inline Reloc_status
    686   rel16_check(unsigned char* view, Address value, Overflow_check check)
    687   { return This::template rel<16>(view, value, check); }
    688 
    689   static inline void
    690   rel16(unsigned char* view,
    691 	const Sized_relobj_file<size, big_endian>* object,
    692 	const Symbol_value<size>* psymval)
    693   { This::template rel<16>(view, object, psymval, CHECK_NONE); }
    694 
    695   static inline Reloc_status
    696   rel16_check(unsigned char* view,
    697 	      const Sized_relobj_file<size, big_endian>* object,
    698 	      const Symbol_value<size>* psymval,
    699 	      Overflow_check check)
    700   { return This::template rel<16>(view, object, psymval, check); }
    701 
    702   // Do an 16-bit RELA relocation with the addend in the relocation.
    703   static inline void
    704   rela16(unsigned char* view, Address value, Addendtype addend)
    705   { This::template rela<16>(view, value, addend, CHECK_NONE); }
    706 
    707   static inline Reloc_status
    708   rela16_check(unsigned char* view, Address value, Addendtype addend,
    709 	       Overflow_check check)
    710   { return This::template rela<16>(view, value, addend, check); }
    711 
    712   static inline void
    713   rela16(unsigned char* view,
    714 	 const Sized_relobj_file<size, big_endian>* object,
    715 	 const Symbol_value<size>* psymval,
    716 	 Addendtype addend)
    717   { This::template rela<16>(view, object, psymval, addend, CHECK_NONE); }
    718 
    719   static inline Reloc_status
    720   rela16_check(unsigned char* view,
    721 	       const Sized_relobj_file<size, big_endian>* object,
    722 	       const Symbol_value<size>* psymval,
    723 	       Addendtype addend,
    724 	       Overflow_check check)
    725   { return This::template rela<16>(view, object, psymval, addend, check); }
    726 
    727   // Do a simple 16-bit PC relative REL relocation with the addend in
    728   // the section contents.
    729   static inline void
    730   pcrel16(unsigned char* view, Address value, Address address)
    731   { This::template pcrel<16>(view, value, address, CHECK_NONE); }
    732 
    733   static inline Reloc_status
    734   pcrel16_check(unsigned char* view, Address value, Address address,
    735 		Overflow_check check)
    736   { return This::template pcrel<16>(view, value, address, check); }
    737 
    738   static inline void
    739   pcrel16(unsigned char* view,
    740 	  const Sized_relobj_file<size, big_endian>* object,
    741 	  const Symbol_value<size>* psymval,
    742 	  Address address)
    743   { This::template pcrel<16>(view, object, psymval, address, CHECK_NONE); }
    744 
    745   static inline Reloc_status
    746   pcrel16_check(unsigned char* view,
    747 		const Sized_relobj_file<size, big_endian>* object,
    748 		const Symbol_value<size>* psymval,
    749 		Address address,
    750 		Overflow_check check)
    751   { return This::template pcrel<16>(view, object, psymval, address, check); }
    752 
    753   // Do a simple 16-bit PC relative RELA relocation with the addend in
    754   // the reloc.
    755   static inline void
    756   pcrela16(unsigned char* view, Address value, Addendtype addend,
    757 	   Address address)
    758   { This::template pcrela<16>(view, value, addend, address, CHECK_NONE); }
    759 
    760   static inline Reloc_status
    761   pcrela16_check(unsigned char* view, Address value, Addendtype addend,
    762 		 Address address, Overflow_check check)
    763   { return This::template pcrela<16>(view, value, addend, address, check); }
    764 
    765   static inline void
    766   pcrela16(unsigned char* view,
    767 	   const Sized_relobj_file<size, big_endian>* object,
    768 	   const Symbol_value<size>* psymval,
    769 	   Addendtype addend,
    770 	   Address address)
    771   { This::template pcrela<16>(view, object, psymval, addend, address,
    772 			      CHECK_NONE); }
    773 
    774   static inline Reloc_status
    775   pcrela16_check(unsigned char* view,
    776 		 const Sized_relobj_file<size, big_endian>* object,
    777 		 const Symbol_value<size>* psymval,
    778 		 Addendtype addend,
    779 		 Address address,
    780 		 Overflow_check check)
    781   { return This::template pcrela<16>(view, object, psymval, addend, address,
    782 				     check); }
    783 
    784   // Do a simple 32-bit REL relocation with the addend in the section
    785   // contents.
    786   static inline void
    787   rel32(unsigned char* view, Address value)
    788   { This::template rel<32>(view, value, CHECK_NONE); }
    789 
    790   static inline Reloc_status
    791   rel32_check(unsigned char* view, Address value, Overflow_check check)
    792   { return This::template rel<32>(view, value, check); }
    793 
    794   // Like above but for relocs at unaligned addresses.
    795   static inline void
    796   rel32_unaligned(unsigned char* view, Address value)
    797   { This::template rel_unaligned<32>(view, value, CHECK_NONE); }
    798 
    799   static inline Reloc_status
    800   rel32_unaligned_check(unsigned char* view, Address value,
    801 			Overflow_check check)
    802   { return This::template rel_unaligned<32>(view, value, check); }
    803 
    804   static inline void
    805   rel32(unsigned char* view,
    806 	const Sized_relobj_file<size, big_endian>* object,
    807 	const Symbol_value<size>* psymval)
    808   { This::template rel<32>(view, object, psymval, CHECK_NONE); }
    809 
    810   static inline Reloc_status
    811   rel32_check(unsigned char* view,
    812 	      const Sized_relobj_file<size, big_endian>* object,
    813 	      const Symbol_value<size>* psymval,
    814 	      Overflow_check check)
    815   { return This::template rel<32>(view, object, psymval, check); }
    816 
    817   // Like above but for relocs at unaligned addresses.
    818   static inline void
    819   rel32_unaligned(unsigned char* view,
    820 	          const Sized_relobj_file<size, big_endian>* object,
    821 	          const Symbol_value<size>* psymval)
    822   { This::template rel_unaligned<32>(view, object, psymval, CHECK_NONE); }
    823 
    824   static inline Reloc_status
    825   rel32_unaligned_check(unsigned char* view,
    826 			const Sized_relobj_file<size, big_endian>* object,
    827 			const Symbol_value<size>* psymval,
    828 			Overflow_check check)
    829   { return This::template rel_unaligned<32>(view, object, psymval, check); }
    830 
    831   // Do a 32-bit RELA relocation with the addend in the relocation.
    832   static inline void
    833   rela32(unsigned char* view, Address value, Addendtype addend)
    834   { This::template rela<32>(view, value, addend, CHECK_NONE); }
    835 
    836   static inline Reloc_status
    837   rela32(unsigned char* view, Address value, Addendtype addend,
    838 	 Overflow_check check)
    839   { return This::template rela<32>(view, value, addend, check); }
    840 
    841   static inline void
    842   rela32(unsigned char* view,
    843 	 const Sized_relobj_file<size, big_endian>* object,
    844 	 const Symbol_value<size>* psymval,
    845 	 Addendtype addend)
    846   { This::template rela<32>(view, object, psymval, addend, CHECK_NONE); }
    847 
    848   static inline Reloc_status
    849   rela32_check(unsigned char* view,
    850 	       const Sized_relobj_file<size, big_endian>* object,
    851 	       const Symbol_value<size>* psymval,
    852 	       Addendtype addend,
    853 	       Overflow_check check)
    854   { return This::template rela<32>(view, object, psymval, addend, check); }
    855 
    856   // Do a simple 32-bit PC relative REL relocation with the addend in
    857   // the section contents.
    858   static inline void
    859   pcrel32(unsigned char* view, Address value, Address address)
    860   { This::template pcrel<32>(view, value, address, CHECK_NONE); }
    861 
    862   static inline Reloc_status
    863   pcrel32_check(unsigned char* view, Address value, Address address,
    864 		Overflow_check check)
    865   { return This::template pcrel<32>(view, value, address, check); }
    866 
    867   // Unaligned version of the above.
    868   static inline void
    869   pcrel32_unaligned(unsigned char* view, Address value, Address address)
    870   { This::template pcrel_unaligned<32>(view, value, address, CHECK_NONE); }
    871 
    872   static inline Reloc_status
    873   pcrel32_unaligned_check(unsigned char* view, Address value, Address address,
    874 			  Overflow_check check)
    875   { return This::template pcrel_unaligned<32>(view, value, address, check); }
    876 
    877   static inline void
    878   pcrel32(unsigned char* view,
    879 	  const Sized_relobj_file<size, big_endian>* object,
    880 	  const Symbol_value<size>* psymval,
    881 	  Address address)
    882   { This::template pcrel<32>(view, object, psymval, address, CHECK_NONE); }
    883 
    884   static inline Reloc_status
    885   pcrel32_check(unsigned char* view,
    886 		const Sized_relobj_file<size, big_endian>* object,
    887 		const Symbol_value<size>* psymval,
    888 		Address address,
    889 		Overflow_check check)
    890   { return This::template pcrel<32>(view, object, psymval, address, check); }
    891 
    892   // Do a simple 32-bit PC relative RELA relocation with the addend in
    893   // the relocation.
    894   static inline void
    895   pcrela32(unsigned char* view, Address value, Addendtype addend,
    896            Address address)
    897   { This::template pcrela<32>(view, value, addend, address, CHECK_NONE); }
    898 
    899   static inline Reloc_status
    900   pcrela32_check(unsigned char* view, Address value, Addendtype addend,
    901            Address address, Overflow_check check)
    902   { return This::template pcrela<32>(view, value, addend, address, check); }
    903 
    904   static inline void
    905   pcrela32(unsigned char* view,
    906 	   const Sized_relobj_file<size, big_endian>* object,
    907 	   const Symbol_value<size>* psymval,
    908 	   Addendtype addend,
    909 	   Address address)
    910   { This::template pcrela<32>(view, object, psymval, addend, address,
    911 			      CHECK_NONE); }
    912 
    913   static inline Reloc_status
    914   pcrela32_check(unsigned char* view,
    915 	   const Sized_relobj_file<size, big_endian>* object,
    916 	   const Symbol_value<size>* psymval,
    917 	   Addendtype addend,
    918 	   Address address,
    919 	   Overflow_check check)
    920   { return This::template pcrela<32>(view, object, psymval, addend, address,
    921 				     check); }
    922 
    923   // Do a simple 64-bit REL relocation with the addend in the section
    924   // contents.
    925   static inline void
    926   rel64(unsigned char* view, Address value)
    927   { This::template rel<64>(view, value, CHECK_NONE); }
    928 
    929   static inline void
    930   rel64(unsigned char* view,
    931 	const Sized_relobj_file<size, big_endian>* object,
    932 	const Symbol_value<size>* psymval)
    933   { This::template rel<64>(view, object, psymval, CHECK_NONE); }
    934 
    935   // Do a 64-bit RELA relocation with the addend in the relocation.
    936   static inline void
    937   rela64(unsigned char* view, Address value, Addendtype addend)
    938   { This::template rela<64>(view, value, addend, CHECK_NONE); }
    939 
    940   static inline void
    941   rela64(unsigned char* view,
    942 	 const Sized_relobj_file<size, big_endian>* object,
    943 	 const Symbol_value<size>* psymval,
    944 	 Addendtype addend)
    945   { This::template rela<64>(view, object, psymval, addend, CHECK_NONE); }
    946 
    947   // Do a simple 64-bit PC relative REL relocation with the addend in
    948   // the section contents.
    949   static inline void
    950   pcrel64(unsigned char* view, Address value, Address address)
    951   { This::template pcrel<64>(view, value, address, CHECK_NONE); }
    952 
    953   static inline void
    954   pcrel64(unsigned char* view,
    955 	  const Sized_relobj_file<size, big_endian>* object,
    956 	  const Symbol_value<size>* psymval,
    957 	  Address address)
    958   { This::template pcrel<64>(view, object, psymval, address, CHECK_NONE); }
    959 
    960   // Do a simple 64-bit PC relative RELA relocation with the addend in
    961   // the relocation.
    962   static inline void
    963   pcrela64(unsigned char* view, Address value, Addendtype addend,
    964 	   Address address)
    965   { This::template pcrela<64>(view, value, addend, address, CHECK_NONE); }
    966 
    967   static inline void
    968   pcrela64(unsigned char* view,
    969 	   const Sized_relobj_file<size, big_endian>* object,
    970 	   const Symbol_value<size>* psymval,
    971 	   Addendtype addend,
    972 	   Address address)
    973   { This::template pcrela<64>(view, object, psymval, addend, address,
    974 			      CHECK_NONE); }
    975 };
    976 
    977 // Convenience class for min and max values of a given BITS length.
    978 
    979 template<int bits>
    980 class Limits
    981 {
    982  public:
    983   static const uint64_t MAX_UNSIGNED = (1ULL << bits) - 1;
    984   static const int64_t MAX_SIGNED = MAX_UNSIGNED >> 1;
    985   static const int64_t MIN_SIGNED = -MAX_SIGNED - 1;
    986 };
    987 
    988 template<>
    989 class Limits<64>
    990 {
    991  public:
    992   static const uint64_t MAX_UNSIGNED = ~0ULL;
    993   static const int64_t MAX_SIGNED = MAX_UNSIGNED >> 1;
    994   static const int64_t MIN_SIGNED = -MAX_SIGNED - 1;
    995 };
    996 
    997 // Integer manipulation functions used by various targets when
    998 // performing relocations.
    999 
   1000 template<int bits>
   1001 class Bits
   1002 {
   1003  public:
   1004   // Sign extend an n-bit unsigned integer stored in a uint32_t into
   1005   // an int32_t.  BITS must be between 1 and 32.
   1006   static inline int32_t
   1007   sign_extend32(uint32_t val)
   1008   {
   1009     gold_assert(bits > 0 && bits <= 32);
   1010     if (bits == 32)
   1011       return static_cast<int32_t>(val);
   1012     uint32_t mask = (~static_cast<uint32_t>(0)) >> (32 - bits);
   1013     val &= mask;
   1014     uint32_t top_bit = 1U << (bits - 1);
   1015     int32_t as_signed = static_cast<int32_t>(val);
   1016     if ((val & top_bit) != 0)
   1017       as_signed -= static_cast<int32_t>(top_bit * 2);
   1018     return as_signed;
   1019   }
   1020 
   1021   // Return true if VAL (stored in a uint32_t) has overflowed a signed
   1022   // value with BITS bits.
   1023   static inline bool
   1024   has_overflow32(uint32_t val)
   1025   {
   1026     gold_assert(bits > 0 && bits <= 32);
   1027     if (bits == 32)
   1028       return false;
   1029     const int32_t max = static_cast<int32_t>(Limits<bits>::MAX_SIGNED);
   1030     const int32_t min = static_cast<int32_t>(Limits<bits>::MIN_SIGNED);
   1031     int32_t as_signed = static_cast<int32_t>(val);
   1032     return as_signed > max || as_signed < min;
   1033   }
   1034 
   1035   // Return true if VAL (stored in a uint32_t) has overflowed an unsigned
   1036   // value with BITS bits.
   1037   static inline bool
   1038   has_unsigned_overflow32(uint32_t val)
   1039   {
   1040     gold_assert(bits > 0 && bits <= 32);
   1041     if (bits == 32)
   1042       return false;
   1043     const uint32_t max = static_cast<uint32_t>(Limits<bits>::MAX_UNSIGNED);
   1044     return val > max;
   1045   }
   1046 
   1047   // Return true if VAL (stored in a uint32_t) has overflowed both a
   1048   // signed and an unsigned value.  E.g.,
   1049   // Bits<8>::has_signed_unsigned_overflow32 would check -128 <= VAL <
   1050   // 255.
   1051   static inline bool
   1052   has_signed_unsigned_overflow32(uint32_t val)
   1053   {
   1054     gold_assert(bits > 0 && bits <= 32);
   1055     if (bits == 32)
   1056       return false;
   1057     const int32_t max = static_cast<int32_t>(Limits<bits>::MAX_UNSIGNED);
   1058     const int32_t min = static_cast<int32_t>(Limits<bits>::MIN_SIGNED);
   1059     int32_t as_signed = static_cast<int32_t>(val);
   1060     return as_signed > max || as_signed < min;
   1061   }
   1062 
   1063   // Select bits from A and B using bits in MASK.  For each n in
   1064   // [0..31], the n-th bit in the result is chosen from the n-th bits
   1065   // of A and B.  A zero selects A and a one selects B.
   1066   static inline uint32_t
   1067   bit_select32(uint32_t a, uint32_t b, uint32_t mask)
   1068   { return (a & ~mask) | (b & mask); }
   1069 
   1070   // Sign extend an n-bit unsigned integer stored in a uint64_t into
   1071   // an int64_t.  BITS must be between 1 and 64.
   1072   static inline int64_t
   1073   sign_extend(uint64_t val)
   1074   {
   1075     gold_assert(bits > 0 && bits <= 64);
   1076     if (bits == 64)
   1077       return static_cast<int64_t>(val);
   1078     uint64_t mask = (~static_cast<uint64_t>(0)) >> (64 - bits);
   1079     val &= mask;
   1080     uint64_t top_bit = static_cast<uint64_t>(1) << (bits - 1);
   1081     int64_t as_signed = static_cast<int64_t>(val);
   1082     if ((val & top_bit) != 0)
   1083       as_signed -= static_cast<int64_t>(top_bit * 2);
   1084     return as_signed;
   1085   }
   1086 
   1087   // Return true if VAL (stored in a uint64_t) has overflowed a signed
   1088   // value with BITS bits.
   1089   static inline bool
   1090   has_overflow(uint64_t val)
   1091   {
   1092     gold_assert(bits > 0 && bits <= 64);
   1093     if (bits == 64)
   1094       return false;
   1095     const int64_t max = Limits<bits>::MAX_SIGNED;
   1096     const int64_t min = Limits<bits>::MIN_SIGNED;
   1097     int64_t as_signed = static_cast<int64_t>(val);
   1098     return as_signed > max || as_signed < min;
   1099   }
   1100 
   1101   // Return true if VAL (stored in a uint64_t) has overflowed an unsigned
   1102   // value with BITS bits.
   1103   static inline bool
   1104   has_unsigned_overflow(uint64_t val)
   1105   {
   1106     gold_assert(bits > 0 && bits <= 64);
   1107     if (bits == 64)
   1108       return false;
   1109     const uint64_t max = Limits<bits>::MAX_UNSIGNED;
   1110     return val > max;
   1111   }
   1112 
   1113   // Return true if VAL (stored in a uint64_t) has overflowed both a
   1114   // signed and an unsigned value.  E.g.,
   1115   // Bits<8>::has_signed_unsigned_overflow would check -128 <= VAL <
   1116   // 255.
   1117   static inline bool
   1118   has_signed_unsigned_overflow64(uint64_t val)
   1119   {
   1120     gold_assert(bits > 0 && bits <= 64);
   1121     if (bits == 64)
   1122       return false;
   1123     const int64_t max = static_cast<int64_t>(Limits<bits>::MAX_UNSIGNED);
   1124     const int64_t min = Limits<bits>::MIN_SIGNED;
   1125     int64_t as_signed = static_cast<int64_t>(val);
   1126     return as_signed > max || as_signed < min;
   1127   }
   1128 
   1129   // Select bits from A and B using bits in MASK.  For each n in
   1130   // [0..31], the n-th bit in the result is chosen from the n-th bits
   1131   // of A and B.  A zero selects A and a one selects B.
   1132   static inline uint64_t
   1133   bit_select64(uint64_t a, uint64_t b, uint64_t mask)
   1134   { return (a & ~mask) | (b & mask); }
   1135 };
   1136 
   1137 // Track relocations while reading a section.  This lets you ask for
   1138 // the relocation at a certain offset, and see how relocs occur
   1139 // between points of interest.
   1140 
   1141 template<int size, bool big_endian>
   1142 class Track_relocs
   1143 {
   1144  public:
   1145   Track_relocs()
   1146     : prelocs_(NULL), len_(0), pos_(0), reloc_size_(0)
   1147   { }
   1148 
   1149   // Initialize the Track_relocs object.  OBJECT is the object holding
   1150   // the reloc section, RELOC_SHNDX is the section index of the reloc
   1151   // section, and RELOC_TYPE is the type of the reloc section
   1152   // (elfcpp::SHT_REL or elfcpp::SHT_RELA).  This returns false if
   1153   // something went wrong.
   1154   bool
   1155   initialize(Object* object, unsigned int reloc_shndx,
   1156 	     unsigned int reloc_type);
   1157 
   1158   // Return the offset in the data section to which the next reloc
   1159   // applies.  This returns -1 if there is no next reloc.
   1160   off_t
   1161   next_offset() const;
   1162 
   1163   // Return the symbol index of the next reloc.  This returns -1U if
   1164   // there is no next reloc.
   1165   unsigned int
   1166   next_symndx() const;
   1167 
   1168   // Return the addend of the next reloc.  This returns 0 if there is
   1169   // no next reloc.
   1170   uint64_t
   1171   next_addend() const;
   1172 
   1173   // Advance to OFFSET within the data section, and return the number
   1174   // of relocs which would be skipped.
   1175   int
   1176   advance(off_t offset);
   1177 
   1178   // Checkpoint the current position in the reloc section.
   1179   section_size_type
   1180   checkpoint() const
   1181   { return this->pos_; }
   1182 
   1183   // Reset the position to CHECKPOINT.
   1184   void
   1185   reset(section_size_type checkpoint)
   1186   { this->pos_ = checkpoint; }
   1187 
   1188  private:
   1189   // The contents of the input object's reloc section.
   1190   const unsigned char* prelocs_;
   1191   // The length of the reloc section.
   1192   section_size_type len_;
   1193   // Our current position in the reloc section.
   1194   section_size_type pos_;
   1195   // The size of the relocs in the section.
   1196   int reloc_size_;
   1197 };
   1198 
   1199 } // End namespace gold.
   1200 
   1201 #endif // !defined(GOLD_RELOC_H)
   1202