Home | History | Annotate | Download | only in Object
      1 //===- ELF.h - ELF object file implementation -------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file declares the ELFObjectFile template class.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_OBJECT_ELF_H
     15 #define LLVM_OBJECT_ELF_H
     16 
     17 #include "llvm/ADT/SmallVector.h"
     18 #include "llvm/ADT/StringSwitch.h"
     19 #include "llvm/ADT/Triple.h"
     20 #include "llvm/ADT/DenseMap.h"
     21 #include "llvm/ADT/PointerIntPair.h"
     22 #include "llvm/Object/ObjectFile.h"
     23 #include "llvm/Support/Casting.h"
     24 #include "llvm/Support/ELF.h"
     25 #include "llvm/Support/Endian.h"
     26 #include "llvm/Support/ErrorHandling.h"
     27 #include "llvm/Support/MemoryBuffer.h"
     28 #include "llvm/Support/raw_ostream.h"
     29 #include <algorithm>
     30 #include <limits>
     31 #include <utility>
     32 
     33 namespace llvm {
     34 namespace object {
     35 
     36 // Subclasses of ELFObjectFile may need this for template instantiation
     37 inline std::pair<unsigned char, unsigned char>
     38 getElfArchType(MemoryBuffer *Object) {
     39   if (Object->getBufferSize() < ELF::EI_NIDENT)
     40     return std::make_pair((uint8_t)ELF::ELFCLASSNONE,(uint8_t)ELF::ELFDATANONE);
     41   return std::make_pair( (uint8_t)Object->getBufferStart()[ELF::EI_CLASS]
     42                        , (uint8_t)Object->getBufferStart()[ELF::EI_DATA]);
     43 }
     44 
     45 // Templates to choose Elf_Addr and Elf_Off depending on is64Bits.
     46 template<support::endianness target_endianness>
     47 struct ELFDataTypeTypedefHelperCommon {
     48   typedef support::detail::packed_endian_specific_integral
     49     <uint16_t, target_endianness, support::aligned> Elf_Half;
     50   typedef support::detail::packed_endian_specific_integral
     51     <uint32_t, target_endianness, support::aligned> Elf_Word;
     52   typedef support::detail::packed_endian_specific_integral
     53     <int32_t, target_endianness, support::aligned> Elf_Sword;
     54   typedef support::detail::packed_endian_specific_integral
     55     <uint64_t, target_endianness, support::aligned> Elf_Xword;
     56   typedef support::detail::packed_endian_specific_integral
     57     <int64_t, target_endianness, support::aligned> Elf_Sxword;
     58 };
     59 
     60 template<support::endianness target_endianness, bool is64Bits>
     61 struct ELFDataTypeTypedefHelper;
     62 
     63 /// ELF 32bit types.
     64 template<support::endianness target_endianness>
     65 struct ELFDataTypeTypedefHelper<target_endianness, false>
     66   : ELFDataTypeTypedefHelperCommon<target_endianness> {
     67   typedef uint32_t value_type;
     68   typedef support::detail::packed_endian_specific_integral
     69     <value_type, target_endianness, support::aligned> Elf_Addr;
     70   typedef support::detail::packed_endian_specific_integral
     71     <value_type, target_endianness, support::aligned> Elf_Off;
     72 };
     73 
     74 /// ELF 64bit types.
     75 template<support::endianness target_endianness>
     76 struct ELFDataTypeTypedefHelper<target_endianness, true>
     77   : ELFDataTypeTypedefHelperCommon<target_endianness>{
     78   typedef uint64_t value_type;
     79   typedef support::detail::packed_endian_specific_integral
     80     <value_type, target_endianness, support::aligned> Elf_Addr;
     81   typedef support::detail::packed_endian_specific_integral
     82     <value_type, target_endianness, support::aligned> Elf_Off;
     83 };
     84 
     85 // I really don't like doing this, but the alternative is copypasta.
     86 #define LLVM_ELF_IMPORT_TYPES(target_endianness, is64Bits) \
     87 typedef typename \
     88   ELFDataTypeTypedefHelper<target_endianness, is64Bits>::Elf_Addr Elf_Addr; \
     89 typedef typename \
     90   ELFDataTypeTypedefHelper<target_endianness, is64Bits>::Elf_Off Elf_Off; \
     91 typedef typename \
     92   ELFDataTypeTypedefHelper<target_endianness, is64Bits>::Elf_Half Elf_Half; \
     93 typedef typename \
     94   ELFDataTypeTypedefHelper<target_endianness, is64Bits>::Elf_Word Elf_Word; \
     95 typedef typename \
     96   ELFDataTypeTypedefHelper<target_endianness, is64Bits>::Elf_Sword Elf_Sword; \
     97 typedef typename \
     98   ELFDataTypeTypedefHelper<target_endianness, is64Bits>::Elf_Xword Elf_Xword; \
     99 typedef typename \
    100   ELFDataTypeTypedefHelper<target_endianness, is64Bits>::Elf_Sxword Elf_Sxword;
    101 
    102   // Section header.
    103 template<support::endianness target_endianness, bool is64Bits>
    104 struct Elf_Shdr_Base;
    105 
    106 template<support::endianness target_endianness>
    107 struct Elf_Shdr_Base<target_endianness, false> {
    108   LLVM_ELF_IMPORT_TYPES(target_endianness, false)
    109   Elf_Word sh_name;     // Section name (index into string table)
    110   Elf_Word sh_type;     // Section type (SHT_*)
    111   Elf_Word sh_flags;    // Section flags (SHF_*)
    112   Elf_Addr sh_addr;     // Address where section is to be loaded
    113   Elf_Off  sh_offset;   // File offset of section data, in bytes
    114   Elf_Word sh_size;     // Size of section, in bytes
    115   Elf_Word sh_link;     // Section type-specific header table index link
    116   Elf_Word sh_info;     // Section type-specific extra information
    117   Elf_Word sh_addralign;// Section address alignment
    118   Elf_Word sh_entsize;  // Size of records contained within the section
    119 };
    120 
    121 template<support::endianness target_endianness>
    122 struct Elf_Shdr_Base<target_endianness, true> {
    123   LLVM_ELF_IMPORT_TYPES(target_endianness, true)
    124   Elf_Word  sh_name;     // Section name (index into string table)
    125   Elf_Word  sh_type;     // Section type (SHT_*)
    126   Elf_Xword sh_flags;    // Section flags (SHF_*)
    127   Elf_Addr  sh_addr;     // Address where section is to be loaded
    128   Elf_Off   sh_offset;   // File offset of section data, in bytes
    129   Elf_Xword sh_size;     // Size of section, in bytes
    130   Elf_Word  sh_link;     // Section type-specific header table index link
    131   Elf_Word  sh_info;     // Section type-specific extra information
    132   Elf_Xword sh_addralign;// Section address alignment
    133   Elf_Xword sh_entsize;  // Size of records contained within the section
    134 };
    135 
    136 template<support::endianness target_endianness, bool is64Bits>
    137 struct Elf_Shdr_Impl : Elf_Shdr_Base<target_endianness, is64Bits> {
    138   using Elf_Shdr_Base<target_endianness, is64Bits>::sh_entsize;
    139   using Elf_Shdr_Base<target_endianness, is64Bits>::sh_size;
    140 
    141   /// @brief Get the number of entities this section contains if it has any.
    142   unsigned getEntityCount() const {
    143     if (sh_entsize == 0)
    144       return 0;
    145     return sh_size / sh_entsize;
    146   }
    147 };
    148 
    149 template<support::endianness target_endianness, bool is64Bits>
    150 struct Elf_Sym_Base;
    151 
    152 template<support::endianness target_endianness>
    153 struct Elf_Sym_Base<target_endianness, false> {
    154   LLVM_ELF_IMPORT_TYPES(target_endianness, false)
    155   Elf_Word      st_name;  // Symbol name (index into string table)
    156   Elf_Addr      st_value; // Value or address associated with the symbol
    157   Elf_Word      st_size;  // Size of the symbol
    158   unsigned char st_info;  // Symbol's type and binding attributes
    159   unsigned char st_other; // Must be zero; reserved
    160   Elf_Half      st_shndx; // Which section (header table index) it's defined in
    161 };
    162 
    163 template<support::endianness target_endianness>
    164 struct Elf_Sym_Base<target_endianness, true> {
    165   LLVM_ELF_IMPORT_TYPES(target_endianness, true)
    166   Elf_Word      st_name;  // Symbol name (index into string table)
    167   unsigned char st_info;  // Symbol's type and binding attributes
    168   unsigned char st_other; // Must be zero; reserved
    169   Elf_Half      st_shndx; // Which section (header table index) it's defined in
    170   Elf_Addr      st_value; // Value or address associated with the symbol
    171   Elf_Xword     st_size;  // Size of the symbol
    172 };
    173 
    174 template<support::endianness target_endianness, bool is64Bits>
    175 struct Elf_Sym_Impl : Elf_Sym_Base<target_endianness, is64Bits> {
    176   using Elf_Sym_Base<target_endianness, is64Bits>::st_info;
    177 
    178   // These accessors and mutators correspond to the ELF32_ST_BIND,
    179   // ELF32_ST_TYPE, and ELF32_ST_INFO macros defined in the ELF specification:
    180   unsigned char getBinding() const { return st_info >> 4; }
    181   unsigned char getType() const { return st_info & 0x0f; }
    182   void setBinding(unsigned char b) { setBindingAndType(b, getType()); }
    183   void setType(unsigned char t) { setBindingAndType(getBinding(), t); }
    184   void setBindingAndType(unsigned char b, unsigned char t) {
    185     st_info = (b << 4) + (t & 0x0f);
    186   }
    187 };
    188 
    189 /// Elf_Versym: This is the structure of entries in the SHT_GNU_versym section
    190 /// (.gnu.version). This structure is identical for ELF32 and ELF64.
    191 template<support::endianness target_endianness, bool is64Bits>
    192 struct Elf_Versym_Impl {
    193   LLVM_ELF_IMPORT_TYPES(target_endianness, is64Bits)
    194   Elf_Half vs_index;   // Version index with flags (e.g. VERSYM_HIDDEN)
    195 };
    196 
    197 template<support::endianness target_endianness, bool is64Bits>
    198 struct Elf_Verdaux_Impl;
    199 
    200 /// Elf_Verdef: This is the structure of entries in the SHT_GNU_verdef section
    201 /// (.gnu.version_d). This structure is identical for ELF32 and ELF64.
    202 template<support::endianness target_endianness, bool is64Bits>
    203 struct Elf_Verdef_Impl {
    204   LLVM_ELF_IMPORT_TYPES(target_endianness, is64Bits)
    205   typedef Elf_Verdaux_Impl<target_endianness, is64Bits> Elf_Verdaux;
    206   Elf_Half vd_version; // Version of this structure (e.g. VER_DEF_CURRENT)
    207   Elf_Half vd_flags;   // Bitwise flags (VER_DEF_*)
    208   Elf_Half vd_ndx;     // Version index, used in .gnu.version entries
    209   Elf_Half vd_cnt;     // Number of Verdaux entries
    210   Elf_Word vd_hash;    // Hash of name
    211   Elf_Word vd_aux;     // Offset to the first Verdaux entry (in bytes)
    212   Elf_Word vd_next;    // Offset to the next Verdef entry (in bytes)
    213 
    214   /// Get the first Verdaux entry for this Verdef.
    215   const Elf_Verdaux *getAux() const {
    216     return reinterpret_cast<const Elf_Verdaux*>((const char*)this + vd_aux);
    217   }
    218 };
    219 
    220 /// Elf_Verdaux: This is the structure of auxilary data in the SHT_GNU_verdef
    221 /// section (.gnu.version_d). This structure is identical for ELF32 and ELF64.
    222 template<support::endianness target_endianness, bool is64Bits>
    223 struct Elf_Verdaux_Impl {
    224   LLVM_ELF_IMPORT_TYPES(target_endianness, is64Bits)
    225   Elf_Word vda_name; // Version name (offset in string table)
    226   Elf_Word vda_next; // Offset to next Verdaux entry (in bytes)
    227 };
    228 
    229 /// Elf_Verneed: This is the structure of entries in the SHT_GNU_verneed
    230 /// section (.gnu.version_r). This structure is identical for ELF32 and ELF64.
    231 template<support::endianness target_endianness, bool is64Bits>
    232 struct Elf_Verneed_Impl {
    233   LLVM_ELF_IMPORT_TYPES(target_endianness, is64Bits)
    234   Elf_Half vn_version; // Version of this structure (e.g. VER_NEED_CURRENT)
    235   Elf_Half vn_cnt;     // Number of associated Vernaux entries
    236   Elf_Word vn_file;    // Library name (string table offset)
    237   Elf_Word vn_aux;     // Offset to first Vernaux entry (in bytes)
    238   Elf_Word vn_next;    // Offset to next Verneed entry (in bytes)
    239 };
    240 
    241 /// Elf_Vernaux: This is the structure of auxiliary data in SHT_GNU_verneed
    242 /// section (.gnu.version_r). This structure is identical for ELF32 and ELF64.
    243 template<support::endianness target_endianness, bool is64Bits>
    244 struct Elf_Vernaux_Impl {
    245   LLVM_ELF_IMPORT_TYPES(target_endianness, is64Bits)
    246   Elf_Word vna_hash;  // Hash of dependency name
    247   Elf_Half vna_flags; // Bitwise Flags (VER_FLAG_*)
    248   Elf_Half vna_other; // Version index, used in .gnu.version entries
    249   Elf_Word vna_name;  // Dependency name
    250   Elf_Word vna_next;  // Offset to next Vernaux entry (in bytes)
    251 };
    252 
    253 /// Elf_Dyn_Base: This structure matches the form of entries in the dynamic
    254 ///               table section (.dynamic) look like.
    255 template<support::endianness target_endianness, bool is64Bits>
    256 struct Elf_Dyn_Base;
    257 
    258 template<support::endianness target_endianness>
    259 struct Elf_Dyn_Base<target_endianness, false> {
    260   LLVM_ELF_IMPORT_TYPES(target_endianness, false)
    261   Elf_Sword d_tag;
    262   union {
    263     Elf_Word d_val;
    264     Elf_Addr d_ptr;
    265   } d_un;
    266 };
    267 
    268 template<support::endianness target_endianness>
    269 struct Elf_Dyn_Base<target_endianness, true> {
    270   LLVM_ELF_IMPORT_TYPES(target_endianness, true)
    271   Elf_Sxword d_tag;
    272   union {
    273     Elf_Xword d_val;
    274     Elf_Addr d_ptr;
    275   } d_un;
    276 };
    277 
    278 /// Elf_Dyn_Impl: This inherits from Elf_Dyn_Base, adding getters and setters.
    279 template<support::endianness target_endianness, bool is64Bits>
    280 struct Elf_Dyn_Impl : Elf_Dyn_Base<target_endianness, is64Bits> {
    281   using Elf_Dyn_Base<target_endianness, is64Bits>::d_tag;
    282   using Elf_Dyn_Base<target_endianness, is64Bits>::d_un;
    283   int64_t getTag() const { return d_tag; }
    284   uint64_t getVal() const { return d_un.d_val; }
    285   uint64_t getPtr() const { return d_un.ptr; }
    286 };
    287 
    288 template<support::endianness target_endianness, bool is64Bits>
    289 class ELFObjectFile;
    290 
    291 // DynRefImpl: Reference to an entry in the dynamic table
    292 // This is an ELF-specific interface.
    293 template<support::endianness target_endianness, bool is64Bits>
    294 class DynRefImpl {
    295   typedef Elf_Dyn_Impl<target_endianness, is64Bits> Elf_Dyn;
    296   typedef ELFObjectFile<target_endianness, is64Bits> OwningType;
    297 
    298   DataRefImpl DynPimpl;
    299   const OwningType *OwningObject;
    300 
    301 public:
    302   DynRefImpl() : OwningObject(NULL) { }
    303 
    304   DynRefImpl(DataRefImpl DynP, const OwningType *Owner);
    305 
    306   bool operator==(const DynRefImpl &Other) const;
    307   bool operator <(const DynRefImpl &Other) const;
    308 
    309   error_code getNext(DynRefImpl &Result) const;
    310   int64_t getTag() const;
    311   uint64_t getVal() const;
    312   uint64_t getPtr() const;
    313 
    314   DataRefImpl getRawDataRefImpl() const;
    315 };
    316 
    317 // Elf_Rel: Elf Relocation
    318 template<support::endianness target_endianness, bool is64Bits, bool isRela>
    319 struct Elf_Rel_Base;
    320 
    321 template<support::endianness target_endianness>
    322 struct Elf_Rel_Base<target_endianness, false, false> {
    323   LLVM_ELF_IMPORT_TYPES(target_endianness, false)
    324   Elf_Addr      r_offset; // Location (file byte offset, or program virtual addr)
    325   Elf_Word      r_info;  // Symbol table index and type of relocation to apply
    326 };
    327 
    328 template<support::endianness target_endianness>
    329 struct Elf_Rel_Base<target_endianness, true, false> {
    330   LLVM_ELF_IMPORT_TYPES(target_endianness, true)
    331   Elf_Addr      r_offset; // Location (file byte offset, or program virtual addr)
    332   Elf_Xword     r_info;   // Symbol table index and type of relocation to apply
    333 };
    334 
    335 template<support::endianness target_endianness>
    336 struct Elf_Rel_Base<target_endianness, false, true> {
    337   LLVM_ELF_IMPORT_TYPES(target_endianness, false)
    338   Elf_Addr      r_offset; // Location (file byte offset, or program virtual addr)
    339   Elf_Word      r_info;   // Symbol table index and type of relocation to apply
    340   Elf_Sword     r_addend; // Compute value for relocatable field by adding this
    341 };
    342 
    343 template<support::endianness target_endianness>
    344 struct Elf_Rel_Base<target_endianness, true, true> {
    345   LLVM_ELF_IMPORT_TYPES(target_endianness, true)
    346   Elf_Addr      r_offset; // Location (file byte offset, or program virtual addr)
    347   Elf_Xword     r_info;   // Symbol table index and type of relocation to apply
    348   Elf_Sxword    r_addend; // Compute value for relocatable field by adding this.
    349 };
    350 
    351 template<support::endianness target_endianness, bool is64Bits, bool isRela>
    352 struct Elf_Rel_Impl;
    353 
    354 template<support::endianness target_endianness, bool isRela>
    355 struct Elf_Rel_Impl<target_endianness, true, isRela>
    356        : Elf_Rel_Base<target_endianness, true, isRela> {
    357   using Elf_Rel_Base<target_endianness, true, isRela>::r_info;
    358   LLVM_ELF_IMPORT_TYPES(target_endianness, true)
    359 
    360   // These accessors and mutators correspond to the ELF64_R_SYM, ELF64_R_TYPE,
    361   // and ELF64_R_INFO macros defined in the ELF specification:
    362   uint64_t getSymbol() const { return (r_info >> 32); }
    363   unsigned char getType() const {
    364     return (unsigned char) (r_info & 0xffffffffL);
    365   }
    366   void setSymbol(uint64_t s) { setSymbolAndType(s, getType()); }
    367   void setType(unsigned char t) { setSymbolAndType(getSymbol(), t); }
    368   void setSymbolAndType(uint64_t s, unsigned char t) {
    369     r_info = (s << 32) + (t&0xffffffffL);
    370   }
    371 };
    372 
    373 template<support::endianness target_endianness, bool isRela>
    374 struct Elf_Rel_Impl<target_endianness, false, isRela>
    375        : Elf_Rel_Base<target_endianness, false, isRela> {
    376   using Elf_Rel_Base<target_endianness, false, isRela>::r_info;
    377   LLVM_ELF_IMPORT_TYPES(target_endianness, false)
    378 
    379   // These accessors and mutators correspond to the ELF32_R_SYM, ELF32_R_TYPE,
    380   // and ELF32_R_INFO macros defined in the ELF specification:
    381   uint32_t getSymbol() const { return (r_info >> 8); }
    382   unsigned char getType() const { return (unsigned char) (r_info & 0x0ff); }
    383   void setSymbol(uint32_t s) { setSymbolAndType(s, getType()); }
    384   void setType(unsigned char t) { setSymbolAndType(getSymbol(), t); }
    385   void setSymbolAndType(uint32_t s, unsigned char t) {
    386     r_info = (s << 8) + t;
    387   }
    388 };
    389 
    390 
    391 template<support::endianness target_endianness, bool is64Bits>
    392 class ELFObjectFile : public ObjectFile {
    393   LLVM_ELF_IMPORT_TYPES(target_endianness, is64Bits)
    394 
    395   typedef Elf_Shdr_Impl<target_endianness, is64Bits> Elf_Shdr;
    396   typedef Elf_Sym_Impl<target_endianness, is64Bits> Elf_Sym;
    397   typedef Elf_Dyn_Impl<target_endianness, is64Bits> Elf_Dyn;
    398   typedef Elf_Rel_Impl<target_endianness, is64Bits, false> Elf_Rel;
    399   typedef Elf_Rel_Impl<target_endianness, is64Bits, true> Elf_Rela;
    400   typedef Elf_Verdef_Impl<target_endianness, is64Bits> Elf_Verdef;
    401   typedef Elf_Verdaux_Impl<target_endianness, is64Bits> Elf_Verdaux;
    402   typedef Elf_Verneed_Impl<target_endianness, is64Bits> Elf_Verneed;
    403   typedef Elf_Vernaux_Impl<target_endianness, is64Bits> Elf_Vernaux;
    404   typedef Elf_Versym_Impl<target_endianness, is64Bits> Elf_Versym;
    405   typedef DynRefImpl<target_endianness, is64Bits> DynRef;
    406   typedef content_iterator<DynRef> dyn_iterator;
    407 
    408 protected:
    409   struct Elf_Ehdr {
    410     unsigned char e_ident[ELF::EI_NIDENT]; // ELF Identification bytes
    411     Elf_Half e_type;     // Type of file (see ET_*)
    412     Elf_Half e_machine;  // Required architecture for this file (see EM_*)
    413     Elf_Word e_version;  // Must be equal to 1
    414     Elf_Addr e_entry;    // Address to jump to in order to start program
    415     Elf_Off  e_phoff;    // Program header table's file offset, in bytes
    416     Elf_Off  e_shoff;    // Section header table's file offset, in bytes
    417     Elf_Word e_flags;    // Processor-specific flags
    418     Elf_Half e_ehsize;   // Size of ELF header, in bytes
    419     Elf_Half e_phentsize;// Size of an entry in the program header table
    420     Elf_Half e_phnum;    // Number of entries in the program header table
    421     Elf_Half e_shentsize;// Size of an entry in the section header table
    422     Elf_Half e_shnum;    // Number of entries in the section header table
    423     Elf_Half e_shstrndx; // Section header table index of section name
    424                                   // string table
    425     bool checkMagic() const {
    426       return (memcmp(e_ident, ELF::ElfMagic, strlen(ELF::ElfMagic))) == 0;
    427     }
    428     unsigned char getFileClass() const { return e_ident[ELF::EI_CLASS]; }
    429     unsigned char getDataEncoding() const { return e_ident[ELF::EI_DATA]; }
    430   };
    431   // This flag is used for classof, to distinguish ELFObjectFile from
    432   // its subclass. If more subclasses will be created, this flag will
    433   // have to become an enum.
    434   bool isDyldELFObject;
    435 
    436 private:
    437   typedef SmallVector<const Elf_Shdr*, 1> Sections_t;
    438   typedef DenseMap<unsigned, unsigned> IndexMap_t;
    439   typedef DenseMap<const Elf_Shdr*, SmallVector<uint32_t, 1> > RelocMap_t;
    440 
    441   const Elf_Ehdr *Header;
    442   const Elf_Shdr *SectionHeaderTable;
    443   const Elf_Shdr *dot_shstrtab_sec; // Section header string table.
    444   const Elf_Shdr *dot_strtab_sec;   // Symbol header string table.
    445   const Elf_Shdr *dot_dynstr_sec;   // Dynamic symbol string table.
    446 
    447   // SymbolTableSections[0] always points to the dynamic string table section
    448   // header, or NULL if there is no dynamic string table.
    449   Sections_t SymbolTableSections;
    450   IndexMap_t SymbolTableSectionsIndexMap;
    451   DenseMap<const Elf_Sym*, ELF::Elf64_Word> ExtendedSymbolTable;
    452 
    453   const Elf_Shdr *dot_dynamic_sec;       // .dynamic
    454   const Elf_Shdr *dot_gnu_version_sec;   // .gnu.version
    455   const Elf_Shdr *dot_gnu_version_r_sec; // .gnu.version_r
    456   const Elf_Shdr *dot_gnu_version_d_sec; // .gnu.version_d
    457 
    458   // Pointer to SONAME entry in dynamic string table
    459   // This is set the first time getLoadName is called.
    460   mutable const char *dt_soname;
    461 
    462   // Records for each version index the corresponding Verdef or Vernaux entry.
    463   // This is filled the first time LoadVersionMap() is called.
    464   class VersionMapEntry : public PointerIntPair<const void*, 1> {
    465     public:
    466     // If the integer is 0, this is an Elf_Verdef*.
    467     // If the integer is 1, this is an Elf_Vernaux*.
    468     VersionMapEntry() : PointerIntPair<const void*, 1>(NULL, 0) { }
    469     VersionMapEntry(const Elf_Verdef *verdef)
    470         : PointerIntPair<const void*, 1>(verdef, 0) { }
    471     VersionMapEntry(const Elf_Vernaux *vernaux)
    472         : PointerIntPair<const void*, 1>(vernaux, 1) { }
    473     bool isNull() const { return getPointer() == NULL; }
    474     bool isVerdef() const { return !isNull() && getInt() == 0; }
    475     bool isVernaux() const { return !isNull() && getInt() == 1; }
    476     const Elf_Verdef *getVerdef() const {
    477       return isVerdef() ? (const Elf_Verdef*)getPointer() : NULL;
    478     }
    479     const Elf_Vernaux *getVernaux() const {
    480       return isVernaux() ? (const Elf_Vernaux*)getPointer() : NULL;
    481     }
    482   };
    483   mutable SmallVector<VersionMapEntry, 16> VersionMap;
    484   void LoadVersionDefs(const Elf_Shdr *sec) const;
    485   void LoadVersionNeeds(const Elf_Shdr *ec) const;
    486   void LoadVersionMap() const;
    487 
    488   /// @brief Map sections to an array of relocation sections that reference
    489   ///        them sorted by section index.
    490   RelocMap_t SectionRelocMap;
    491 
    492   /// @brief Get the relocation section that contains \a Rel.
    493   const Elf_Shdr *getRelSection(DataRefImpl Rel) const {
    494     return getSection(Rel.w.b);
    495   }
    496 
    497   bool            isRelocationHasAddend(DataRefImpl Rel) const;
    498   template<typename T>
    499   const T        *getEntry(uint16_t Section, uint32_t Entry) const;
    500   template<typename T>
    501   const T        *getEntry(const Elf_Shdr *Section, uint32_t Entry) const;
    502   const Elf_Shdr *getSection(DataRefImpl index) const;
    503   const Elf_Shdr *getSection(uint32_t index) const;
    504   const Elf_Rel  *getRel(DataRefImpl Rel) const;
    505   const Elf_Rela *getRela(DataRefImpl Rela) const;
    506   const char     *getString(uint32_t section, uint32_t offset) const;
    507   const char     *getString(const Elf_Shdr *section, uint32_t offset) const;
    508   error_code      getSymbolName(const Elf_Shdr *section,
    509                                 const Elf_Sym *Symb,
    510                                 StringRef &Res) const;
    511   error_code      getSymbolVersion(const Elf_Shdr *section,
    512                                    const Elf_Sym *Symb,
    513                                    StringRef &Version,
    514                                    bool &IsDefault) const;
    515   void VerifyStrTab(const Elf_Shdr *sh) const;
    516 
    517 protected:
    518   const Elf_Sym  *getSymbol(DataRefImpl Symb) const; // FIXME: Should be private?
    519   void            validateSymbol(DataRefImpl Symb) const;
    520 
    521 public:
    522   const Elf_Dyn  *getDyn(DataRefImpl DynData) const;
    523   error_code getSymbolVersion(SymbolRef Symb, StringRef &Version,
    524                               bool &IsDefault) const;
    525 protected:
    526   virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const;
    527   virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const;
    528   virtual error_code getSymbolFileOffset(DataRefImpl Symb, uint64_t &Res) const;
    529   virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const;
    530   virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const;
    531   virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const;
    532   virtual error_code getSymbolFlags(DataRefImpl Symb, uint32_t &Res) const;
    533   virtual error_code getSymbolType(DataRefImpl Symb, SymbolRef::Type &Res) const;
    534   virtual error_code getSymbolSection(DataRefImpl Symb,
    535                                       section_iterator &Res) const;
    536 
    537   friend class DynRefImpl<target_endianness, is64Bits>;
    538   virtual error_code getDynNext(DataRefImpl DynData, DynRef &Result) const;
    539 
    540   virtual error_code getLibraryNext(DataRefImpl Data, LibraryRef &Result) const;
    541   virtual error_code getLibraryPath(DataRefImpl Data, StringRef &Res) const;
    542 
    543   virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const;
    544   virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const;
    545   virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const;
    546   virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const;
    547   virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res) const;
    548   virtual error_code getSectionAlignment(DataRefImpl Sec, uint64_t &Res) const;
    549   virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const;
    550   virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const;
    551   virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const;
    552   virtual error_code isSectionRequiredForExecution(DataRefImpl Sec,
    553                                                    bool &Res) const;
    554   virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const;
    555   virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const;
    556   virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
    557                                            bool &Result) const;
    558   virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const;
    559   virtual relocation_iterator getSectionRelEnd(DataRefImpl Sec) const;
    560 
    561   virtual error_code getRelocationNext(DataRefImpl Rel,
    562                                        RelocationRef &Res) const;
    563   virtual error_code getRelocationAddress(DataRefImpl Rel,
    564                                           uint64_t &Res) const;
    565   virtual error_code getRelocationOffset(DataRefImpl Rel,
    566                                          uint64_t &Res) const;
    567   virtual error_code getRelocationSymbol(DataRefImpl Rel,
    568                                          SymbolRef &Res) const;
    569   virtual error_code getRelocationType(DataRefImpl Rel,
    570                                        uint64_t &Res) const;
    571   virtual error_code getRelocationTypeName(DataRefImpl Rel,
    572                                            SmallVectorImpl<char> &Result) const;
    573   virtual error_code getRelocationAdditionalInfo(DataRefImpl Rel,
    574                                                  int64_t &Res) const;
    575   virtual error_code getRelocationValueString(DataRefImpl Rel,
    576                                            SmallVectorImpl<char> &Result) const;
    577 
    578 public:
    579   ELFObjectFile(MemoryBuffer *Object, error_code &ec);
    580   virtual symbol_iterator begin_symbols() const;
    581   virtual symbol_iterator end_symbols() const;
    582 
    583   virtual symbol_iterator begin_dynamic_symbols() const;
    584   virtual symbol_iterator end_dynamic_symbols() const;
    585 
    586   virtual section_iterator begin_sections() const;
    587   virtual section_iterator end_sections() const;
    588 
    589   virtual library_iterator begin_libraries_needed() const;
    590   virtual library_iterator end_libraries_needed() const;
    591 
    592   virtual dyn_iterator begin_dynamic_table() const;
    593   virtual dyn_iterator end_dynamic_table() const;
    594 
    595   virtual uint8_t getBytesInAddress() const;
    596   virtual StringRef getFileFormatName() const;
    597   virtual StringRef getObjectType() const { return "ELF"; }
    598   virtual unsigned getArch() const;
    599   virtual StringRef getLoadName() const;
    600 
    601   uint64_t getNumSections() const;
    602   uint64_t getStringTableIndex() const;
    603   ELF::Elf64_Word getSymbolTableIndex(const Elf_Sym *symb) const;
    604   const Elf_Shdr *getSection(const Elf_Sym *symb) const;
    605 
    606   // Methods for type inquiry through isa, cast, and dyn_cast
    607   bool isDyldType() const { return isDyldELFObject; }
    608   static inline bool classof(const Binary *v) {
    609     return v->getType() == getELFType(target_endianness == support::little,
    610                                       is64Bits);
    611   }
    612   static inline bool classof(const ELFObjectFile *v) { return true; }
    613 };
    614 
    615 // Iterate through the version definitions, and place each Elf_Verdef
    616 // in the VersionMap according to its index.
    617 template<support::endianness target_endianness, bool is64Bits>
    618 void ELFObjectFile<target_endianness, is64Bits>::
    619                   LoadVersionDefs(const Elf_Shdr *sec) const {
    620   unsigned vd_size = sec->sh_size; // Size of section in bytes
    621   unsigned vd_count = sec->sh_info; // Number of Verdef entries
    622   const char *sec_start = (const char*)base() + sec->sh_offset;
    623   const char *sec_end = sec_start + vd_size;
    624   // The first Verdef entry is at the start of the section.
    625   const char *p = sec_start;
    626   for (unsigned i = 0; i < vd_count; i++) {
    627     if (p + sizeof(Elf_Verdef) > sec_end)
    628       report_fatal_error("Section ended unexpectedly while scanning "
    629                          "version definitions.");
    630     const Elf_Verdef *vd = reinterpret_cast<const Elf_Verdef *>(p);
    631     if (vd->vd_version != ELF::VER_DEF_CURRENT)
    632       report_fatal_error("Unexpected verdef version");
    633     size_t index = vd->vd_ndx & ELF::VERSYM_VERSION;
    634     if (index >= VersionMap.size())
    635       VersionMap.resize(index+1);
    636     VersionMap[index] = VersionMapEntry(vd);
    637     p += vd->vd_next;
    638   }
    639 }
    640 
    641 // Iterate through the versions needed section, and place each Elf_Vernaux
    642 // in the VersionMap according to its index.
    643 template<support::endianness target_endianness, bool is64Bits>
    644 void ELFObjectFile<target_endianness, is64Bits>::
    645                   LoadVersionNeeds(const Elf_Shdr *sec) const {
    646   unsigned vn_size = sec->sh_size; // Size of section in bytes
    647   unsigned vn_count = sec->sh_info; // Number of Verneed entries
    648   const char *sec_start = (const char*)base() + sec->sh_offset;
    649   const char *sec_end = sec_start + vn_size;
    650   // The first Verneed entry is at the start of the section.
    651   const char *p = sec_start;
    652   for (unsigned i = 0; i < vn_count; i++) {
    653     if (p + sizeof(Elf_Verneed) > sec_end)
    654       report_fatal_error("Section ended unexpectedly while scanning "
    655                          "version needed records.");
    656     const Elf_Verneed *vn = reinterpret_cast<const Elf_Verneed *>(p);
    657     if (vn->vn_version != ELF::VER_NEED_CURRENT)
    658       report_fatal_error("Unexpected verneed version");
    659     // Iterate through the Vernaux entries
    660     const char *paux = p + vn->vn_aux;
    661     for (unsigned j = 0; j < vn->vn_cnt; j++) {
    662       if (paux + sizeof(Elf_Vernaux) > sec_end)
    663         report_fatal_error("Section ended unexpected while scanning auxiliary "
    664                            "version needed records.");
    665       const Elf_Vernaux *vna = reinterpret_cast<const Elf_Vernaux *>(paux);
    666       size_t index = vna->vna_other & ELF::VERSYM_VERSION;
    667       if (index >= VersionMap.size())
    668         VersionMap.resize(index+1);
    669       VersionMap[index] = VersionMapEntry(vna);
    670       paux += vna->vna_next;
    671     }
    672     p += vn->vn_next;
    673   }
    674 }
    675 
    676 template<support::endianness target_endianness, bool is64Bits>
    677 void ELFObjectFile<target_endianness, is64Bits>::LoadVersionMap() const {
    678   // If there is no dynamic symtab or version table, there is nothing to do.
    679   if (SymbolTableSections[0] == NULL || dot_gnu_version_sec == NULL)
    680     return;
    681 
    682   // Has the VersionMap already been loaded?
    683   if (VersionMap.size() > 0)
    684     return;
    685 
    686   // The first two version indexes are reserved.
    687   // Index 0 is LOCAL, index 1 is GLOBAL.
    688   VersionMap.push_back(VersionMapEntry());
    689   VersionMap.push_back(VersionMapEntry());
    690 
    691   if (dot_gnu_version_d_sec)
    692     LoadVersionDefs(dot_gnu_version_d_sec);
    693 
    694   if (dot_gnu_version_r_sec)
    695     LoadVersionNeeds(dot_gnu_version_r_sec);
    696 }
    697 
    698 template<support::endianness target_endianness, bool is64Bits>
    699 void ELFObjectFile<target_endianness, is64Bits>
    700                   ::validateSymbol(DataRefImpl Symb) const {
    701   const Elf_Sym  *symb = getSymbol(Symb);
    702   const Elf_Shdr *SymbolTableSection = SymbolTableSections[Symb.d.b];
    703   // FIXME: We really need to do proper error handling in the case of an invalid
    704   //        input file. Because we don't use exceptions, I think we'll just pass
    705   //        an error object around.
    706   if (!(  symb
    707         && SymbolTableSection
    708         && symb >= (const Elf_Sym*)(base()
    709                    + SymbolTableSection->sh_offset)
    710         && symb <  (const Elf_Sym*)(base()
    711                    + SymbolTableSection->sh_offset
    712                    + SymbolTableSection->sh_size)))
    713     // FIXME: Proper error handling.
    714     report_fatal_error("Symb must point to a valid symbol!");
    715 }
    716 
    717 template<support::endianness target_endianness, bool is64Bits>
    718 error_code ELFObjectFile<target_endianness, is64Bits>
    719                         ::getSymbolNext(DataRefImpl Symb,
    720                                         SymbolRef &Result) const {
    721   validateSymbol(Symb);
    722   const Elf_Shdr *SymbolTableSection = SymbolTableSections[Symb.d.b];
    723 
    724   ++Symb.d.a;
    725   // Check to see if we are at the end of this symbol table.
    726   if (Symb.d.a >= SymbolTableSection->getEntityCount()) {
    727     // We are at the end. If there are other symbol tables, jump to them.
    728     // If the symbol table is .dynsym, we are iterating dynamic symbols,
    729     // and there is only one table of these.
    730     if (Symb.d.b != 0) {
    731       ++Symb.d.b;
    732       Symb.d.a = 1; // The 0th symbol in ELF is fake.
    733     }
    734     // Otherwise return the terminator.
    735     if (Symb.d.b == 0 || Symb.d.b >= SymbolTableSections.size()) {
    736       Symb.d.a = std::numeric_limits<uint32_t>::max();
    737       Symb.d.b = std::numeric_limits<uint32_t>::max();
    738     }
    739   }
    740 
    741   Result = SymbolRef(Symb, this);
    742   return object_error::success;
    743 }
    744 
    745 template<support::endianness target_endianness, bool is64Bits>
    746 error_code ELFObjectFile<target_endianness, is64Bits>
    747                         ::getSymbolName(DataRefImpl Symb,
    748                                         StringRef &Result) const {
    749   validateSymbol(Symb);
    750   const Elf_Sym *symb = getSymbol(Symb);
    751   return getSymbolName(SymbolTableSections[Symb.d.b], symb, Result);
    752 }
    753 
    754 template<support::endianness target_endianness, bool is64Bits>
    755 error_code ELFObjectFile<target_endianness, is64Bits>
    756                         ::getSymbolVersion(SymbolRef SymRef,
    757                                            StringRef &Version,
    758                                            bool &IsDefault) const {
    759   DataRefImpl Symb = SymRef.getRawDataRefImpl();
    760   validateSymbol(Symb);
    761   const Elf_Sym *symb = getSymbol(Symb);
    762   return getSymbolVersion(SymbolTableSections[Symb.d.b], symb,
    763                           Version, IsDefault);
    764 }
    765 
    766 template<support::endianness target_endianness, bool is64Bits>
    767 ELF::Elf64_Word ELFObjectFile<target_endianness, is64Bits>
    768                       ::getSymbolTableIndex(const Elf_Sym *symb) const {
    769   if (symb->st_shndx == ELF::SHN_XINDEX)
    770     return ExtendedSymbolTable.lookup(symb);
    771   return symb->st_shndx;
    772 }
    773 
    774 template<support::endianness target_endianness, bool is64Bits>
    775 const typename ELFObjectFile<target_endianness, is64Bits>::Elf_Shdr *
    776 ELFObjectFile<target_endianness, is64Bits>
    777                              ::getSection(const Elf_Sym *symb) const {
    778   if (symb->st_shndx == ELF::SHN_XINDEX)
    779     return getSection(ExtendedSymbolTable.lookup(symb));
    780   if (symb->st_shndx >= ELF::SHN_LORESERVE)
    781     return 0;
    782   return getSection(symb->st_shndx);
    783 }
    784 
    785 template<support::endianness target_endianness, bool is64Bits>
    786 error_code ELFObjectFile<target_endianness, is64Bits>
    787                         ::getSymbolFileOffset(DataRefImpl Symb,
    788                                           uint64_t &Result) const {
    789   validateSymbol(Symb);
    790   const Elf_Sym  *symb = getSymbol(Symb);
    791   const Elf_Shdr *Section;
    792   switch (getSymbolTableIndex(symb)) {
    793   case ELF::SHN_COMMON:
    794    // Unintialized symbols have no offset in the object file
    795   case ELF::SHN_UNDEF:
    796     Result = UnknownAddressOrSize;
    797     return object_error::success;
    798   case ELF::SHN_ABS:
    799     Result = symb->st_value;
    800     return object_error::success;
    801   default: Section = getSection(symb);
    802   }
    803 
    804   switch (symb->getType()) {
    805   case ELF::STT_SECTION:
    806     Result = Section ? Section->sh_addr : UnknownAddressOrSize;
    807     return object_error::success;
    808   case ELF::STT_FUNC:
    809   case ELF::STT_OBJECT:
    810   case ELF::STT_NOTYPE:
    811     Result = symb->st_value +
    812              (Section ? Section->sh_offset : 0);
    813     return object_error::success;
    814   default:
    815     Result = UnknownAddressOrSize;
    816     return object_error::success;
    817   }
    818 }
    819 
    820 template<support::endianness target_endianness, bool is64Bits>
    821 error_code ELFObjectFile<target_endianness, is64Bits>
    822                         ::getSymbolAddress(DataRefImpl Symb,
    823                                            uint64_t &Result) const {
    824   validateSymbol(Symb);
    825   const Elf_Sym  *symb = getSymbol(Symb);
    826   const Elf_Shdr *Section;
    827   switch (getSymbolTableIndex(symb)) {
    828   case ELF::SHN_COMMON:
    829   case ELF::SHN_UNDEF:
    830     Result = UnknownAddressOrSize;
    831     return object_error::success;
    832   case ELF::SHN_ABS:
    833     Result = symb->st_value;
    834     return object_error::success;
    835   default: Section = getSection(symb);
    836   }
    837 
    838   switch (symb->getType()) {
    839   case ELF::STT_SECTION:
    840     Result = Section ? Section->sh_addr : UnknownAddressOrSize;
    841     return object_error::success;
    842   case ELF::STT_FUNC:
    843   case ELF::STT_OBJECT:
    844   case ELF::STT_NOTYPE:
    845     Result = symb->st_value + (Section ? Section->sh_addr : 0);
    846     return object_error::success;
    847   default:
    848     Result = UnknownAddressOrSize;
    849     return object_error::success;
    850   }
    851 }
    852 
    853 template<support::endianness target_endianness, bool is64Bits>
    854 error_code ELFObjectFile<target_endianness, is64Bits>
    855                         ::getSymbolSize(DataRefImpl Symb,
    856                                         uint64_t &Result) const {
    857   validateSymbol(Symb);
    858   const Elf_Sym  *symb = getSymbol(Symb);
    859   if (symb->st_size == 0)
    860     Result = UnknownAddressOrSize;
    861   Result = symb->st_size;
    862   return object_error::success;
    863 }
    864 
    865 template<support::endianness target_endianness, bool is64Bits>
    866 error_code ELFObjectFile<target_endianness, is64Bits>
    867                         ::getSymbolNMTypeChar(DataRefImpl Symb,
    868                                               char &Result) const {
    869   validateSymbol(Symb);
    870   const Elf_Sym  *symb = getSymbol(Symb);
    871   const Elf_Shdr *Section = getSection(symb);
    872 
    873   char ret = '?';
    874 
    875   if (Section) {
    876     switch (Section->sh_type) {
    877     case ELF::SHT_PROGBITS:
    878     case ELF::SHT_DYNAMIC:
    879       switch (Section->sh_flags) {
    880       case (ELF::SHF_ALLOC | ELF::SHF_EXECINSTR):
    881         ret = 't'; break;
    882       case (ELF::SHF_ALLOC | ELF::SHF_WRITE):
    883         ret = 'd'; break;
    884       case ELF::SHF_ALLOC:
    885       case (ELF::SHF_ALLOC | ELF::SHF_MERGE):
    886       case (ELF::SHF_ALLOC | ELF::SHF_MERGE | ELF::SHF_STRINGS):
    887         ret = 'r'; break;
    888       }
    889       break;
    890     case ELF::SHT_NOBITS: ret = 'b';
    891     }
    892   }
    893 
    894   switch (getSymbolTableIndex(symb)) {
    895   case ELF::SHN_UNDEF:
    896     if (ret == '?')
    897       ret = 'U';
    898     break;
    899   case ELF::SHN_ABS: ret = 'a'; break;
    900   case ELF::SHN_COMMON: ret = 'c'; break;
    901   }
    902 
    903   switch (symb->getBinding()) {
    904   case ELF::STB_GLOBAL: ret = ::toupper(ret); break;
    905   case ELF::STB_WEAK:
    906     if (getSymbolTableIndex(symb) == ELF::SHN_UNDEF)
    907       ret = 'w';
    908     else
    909       if (symb->getType() == ELF::STT_OBJECT)
    910         ret = 'V';
    911       else
    912         ret = 'W';
    913   }
    914 
    915   if (ret == '?' && symb->getType() == ELF::STT_SECTION) {
    916     StringRef name;
    917     if (error_code ec = getSymbolName(Symb, name))
    918       return ec;
    919     Result = StringSwitch<char>(name)
    920       .StartsWith(".debug", 'N')
    921       .StartsWith(".note", 'n')
    922       .Default('?');
    923     return object_error::success;
    924   }
    925 
    926   Result = ret;
    927   return object_error::success;
    928 }
    929 
    930 template<support::endianness target_endianness, bool is64Bits>
    931 error_code ELFObjectFile<target_endianness, is64Bits>
    932                         ::getSymbolType(DataRefImpl Symb,
    933                                         SymbolRef::Type &Result) const {
    934   validateSymbol(Symb);
    935   const Elf_Sym  *symb = getSymbol(Symb);
    936 
    937   switch (symb->getType()) {
    938   case ELF::STT_NOTYPE:
    939     Result = SymbolRef::ST_Unknown;
    940     break;
    941   case ELF::STT_SECTION:
    942     Result = SymbolRef::ST_Debug;
    943     break;
    944   case ELF::STT_FILE:
    945     Result = SymbolRef::ST_File;
    946     break;
    947   case ELF::STT_FUNC:
    948     Result = SymbolRef::ST_Function;
    949     break;
    950   case ELF::STT_OBJECT:
    951   case ELF::STT_COMMON:
    952   case ELF::STT_TLS:
    953     Result = SymbolRef::ST_Data;
    954     break;
    955   default:
    956     Result = SymbolRef::ST_Other;
    957     break;
    958   }
    959   return object_error::success;
    960 }
    961 
    962 template<support::endianness target_endianness, bool is64Bits>
    963 error_code ELFObjectFile<target_endianness, is64Bits>
    964                         ::getSymbolFlags(DataRefImpl Symb,
    965                                          uint32_t &Result) const {
    966   validateSymbol(Symb);
    967   const Elf_Sym  *symb = getSymbol(Symb);
    968 
    969   Result = SymbolRef::SF_None;
    970 
    971   if (symb->getBinding() != ELF::STB_LOCAL)
    972     Result |= SymbolRef::SF_Global;
    973 
    974   if (symb->getBinding() == ELF::STB_WEAK)
    975     Result |= SymbolRef::SF_Weak;
    976 
    977   if (symb->st_shndx == ELF::SHN_ABS)
    978     Result |= SymbolRef::SF_Absolute;
    979 
    980   if (symb->getType() == ELF::STT_FILE ||
    981       symb->getType() == ELF::STT_SECTION)
    982     Result |= SymbolRef::SF_FormatSpecific;
    983 
    984   if (getSymbolTableIndex(symb) == ELF::SHN_UNDEF)
    985     Result |= SymbolRef::SF_Undefined;
    986 
    987   if (symb->getType() == ELF::STT_COMMON ||
    988       getSymbolTableIndex(symb) == ELF::SHN_COMMON)
    989     Result |= SymbolRef::SF_Common;
    990 
    991   if (symb->getType() == ELF::STT_TLS)
    992     Result |= SymbolRef::SF_ThreadLocal;
    993 
    994   return object_error::success;
    995 }
    996 
    997 template<support::endianness target_endianness, bool is64Bits>
    998 error_code ELFObjectFile<target_endianness, is64Bits>
    999                         ::getSymbolSection(DataRefImpl Symb,
   1000                                            section_iterator &Res) const {
   1001   validateSymbol(Symb);
   1002   const Elf_Sym  *symb = getSymbol(Symb);
   1003   const Elf_Shdr *sec = getSection(symb);
   1004   if (!sec)
   1005     Res = end_sections();
   1006   else {
   1007     DataRefImpl Sec;
   1008     Sec.p = reinterpret_cast<intptr_t>(sec);
   1009     Res = section_iterator(SectionRef(Sec, this));
   1010   }
   1011   return object_error::success;
   1012 }
   1013 
   1014 template<support::endianness target_endianness, bool is64Bits>
   1015 error_code ELFObjectFile<target_endianness, is64Bits>
   1016                         ::getSectionNext(DataRefImpl Sec, SectionRef &Result) const {
   1017   const uint8_t *sec = reinterpret_cast<const uint8_t *>(Sec.p);
   1018   sec += Header->e_shentsize;
   1019   Sec.p = reinterpret_cast<intptr_t>(sec);
   1020   Result = SectionRef(Sec, this);
   1021   return object_error::success;
   1022 }
   1023 
   1024 template<support::endianness target_endianness, bool is64Bits>
   1025 error_code ELFObjectFile<target_endianness, is64Bits>
   1026                         ::getSectionName(DataRefImpl Sec,
   1027                                          StringRef &Result) const {
   1028   const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
   1029   Result = StringRef(getString(dot_shstrtab_sec, sec->sh_name));
   1030   return object_error::success;
   1031 }
   1032 
   1033 template<support::endianness target_endianness, bool is64Bits>
   1034 error_code ELFObjectFile<target_endianness, is64Bits>
   1035                         ::getSectionAddress(DataRefImpl Sec,
   1036                                             uint64_t &Result) const {
   1037   const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
   1038   Result = sec->sh_addr;
   1039   return object_error::success;
   1040 }
   1041 
   1042 template<support::endianness target_endianness, bool is64Bits>
   1043 error_code ELFObjectFile<target_endianness, is64Bits>
   1044                         ::getSectionSize(DataRefImpl Sec,
   1045                                          uint64_t &Result) const {
   1046   const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
   1047   Result = sec->sh_size;
   1048   return object_error::success;
   1049 }
   1050 
   1051 template<support::endianness target_endianness, bool is64Bits>
   1052 error_code ELFObjectFile<target_endianness, is64Bits>
   1053                         ::getSectionContents(DataRefImpl Sec,
   1054                                              StringRef &Result) const {
   1055   const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
   1056   const char *start = (const char*)base() + sec->sh_offset;
   1057   Result = StringRef(start, sec->sh_size);
   1058   return object_error::success;
   1059 }
   1060 
   1061 template<support::endianness target_endianness, bool is64Bits>
   1062 error_code ELFObjectFile<target_endianness, is64Bits>
   1063                         ::getSectionAlignment(DataRefImpl Sec,
   1064                                               uint64_t &Result) const {
   1065   const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
   1066   Result = sec->sh_addralign;
   1067   return object_error::success;
   1068 }
   1069 
   1070 template<support::endianness target_endianness, bool is64Bits>
   1071 error_code ELFObjectFile<target_endianness, is64Bits>
   1072                         ::isSectionText(DataRefImpl Sec,
   1073                                         bool &Result) const {
   1074   const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
   1075   if (sec->sh_flags & ELF::SHF_EXECINSTR)
   1076     Result = true;
   1077   else
   1078     Result = false;
   1079   return object_error::success;
   1080 }
   1081 
   1082 template<support::endianness target_endianness, bool is64Bits>
   1083 error_code ELFObjectFile<target_endianness, is64Bits>
   1084                         ::isSectionData(DataRefImpl Sec,
   1085                                         bool &Result) const {
   1086   const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
   1087   if (sec->sh_flags & (ELF::SHF_ALLOC | ELF::SHF_WRITE)
   1088       && sec->sh_type == ELF::SHT_PROGBITS)
   1089     Result = true;
   1090   else
   1091     Result = false;
   1092   return object_error::success;
   1093 }
   1094 
   1095 template<support::endianness target_endianness, bool is64Bits>
   1096 error_code ELFObjectFile<target_endianness, is64Bits>
   1097                         ::isSectionBSS(DataRefImpl Sec,
   1098                                        bool &Result) const {
   1099   const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
   1100   if (sec->sh_flags & (ELF::SHF_ALLOC | ELF::SHF_WRITE)
   1101       && sec->sh_type == ELF::SHT_NOBITS)
   1102     Result = true;
   1103   else
   1104     Result = false;
   1105   return object_error::success;
   1106 }
   1107 
   1108 template<support::endianness target_endianness, bool is64Bits>
   1109 error_code ELFObjectFile<target_endianness, is64Bits>
   1110                         ::isSectionRequiredForExecution(DataRefImpl Sec,
   1111                                                         bool &Result) const {
   1112   const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
   1113   if (sec->sh_flags & ELF::SHF_ALLOC)
   1114     Result = true;
   1115   else
   1116     Result = false;
   1117   return object_error::success;
   1118 }
   1119 
   1120 template<support::endianness target_endianness, bool is64Bits>
   1121 error_code ELFObjectFile<target_endianness, is64Bits>
   1122                         ::isSectionVirtual(DataRefImpl Sec,
   1123                                            bool &Result) const {
   1124   const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
   1125   if (sec->sh_type == ELF::SHT_NOBITS)
   1126     Result = true;
   1127   else
   1128     Result = false;
   1129   return object_error::success;
   1130 }
   1131 
   1132 template<support::endianness target_endianness, bool is64Bits>
   1133 error_code ELFObjectFile<target_endianness, is64Bits>::isSectionZeroInit(DataRefImpl Sec,
   1134                                             bool &Result) const {
   1135   const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
   1136   // For ELF, all zero-init sections are virtual (that is, they occupy no space
   1137   //   in the object image) and vice versa.
   1138   if (sec->sh_flags & ELF::SHT_NOBITS)
   1139     Result = true;
   1140   else
   1141     Result = false;
   1142   return object_error::success;
   1143 }
   1144 
   1145 template<support::endianness target_endianness, bool is64Bits>
   1146 error_code ELFObjectFile<target_endianness, is64Bits>
   1147                           ::sectionContainsSymbol(DataRefImpl Sec,
   1148                                                   DataRefImpl Symb,
   1149                                                   bool &Result) const {
   1150   // FIXME: Unimplemented.
   1151   Result = false;
   1152   return object_error::success;
   1153 }
   1154 
   1155 template<support::endianness target_endianness, bool is64Bits>
   1156 relocation_iterator ELFObjectFile<target_endianness, is64Bits>
   1157                                  ::getSectionRelBegin(DataRefImpl Sec) const {
   1158   DataRefImpl RelData;
   1159   const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
   1160   typename RelocMap_t::const_iterator ittr = SectionRelocMap.find(sec);
   1161   if (sec != 0 && ittr != SectionRelocMap.end()) {
   1162     RelData.w.a = getSection(ittr->second[0])->sh_info;
   1163     RelData.w.b = ittr->second[0];
   1164     RelData.w.c = 0;
   1165   }
   1166   return relocation_iterator(RelocationRef(RelData, this));
   1167 }
   1168 
   1169 template<support::endianness target_endianness, bool is64Bits>
   1170 relocation_iterator ELFObjectFile<target_endianness, is64Bits>
   1171                                  ::getSectionRelEnd(DataRefImpl Sec) const {
   1172   DataRefImpl RelData;
   1173   const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
   1174   typename RelocMap_t::const_iterator ittr = SectionRelocMap.find(sec);
   1175   if (sec != 0 && ittr != SectionRelocMap.end()) {
   1176     // Get the index of the last relocation section for this section.
   1177     std::size_t relocsecindex = ittr->second[ittr->second.size() - 1];
   1178     const Elf_Shdr *relocsec = getSection(relocsecindex);
   1179     RelData.w.a = relocsec->sh_info;
   1180     RelData.w.b = relocsecindex;
   1181     RelData.w.c = relocsec->sh_size / relocsec->sh_entsize;
   1182   }
   1183   return relocation_iterator(RelocationRef(RelData, this));
   1184 }
   1185 
   1186 // Relocations
   1187 template<support::endianness target_endianness, bool is64Bits>
   1188 error_code ELFObjectFile<target_endianness, is64Bits>
   1189                         ::getRelocationNext(DataRefImpl Rel,
   1190                                             RelocationRef &Result) const {
   1191   ++Rel.w.c;
   1192   const Elf_Shdr *relocsec = getSection(Rel.w.b);
   1193   if (Rel.w.c >= (relocsec->sh_size / relocsec->sh_entsize)) {
   1194     // We have reached the end of the relocations for this section. See if there
   1195     // is another relocation section.
   1196     typename RelocMap_t::mapped_type relocseclist =
   1197       SectionRelocMap.lookup(getSection(Rel.w.a));
   1198 
   1199     // Do a binary search for the current reloc section index (which must be
   1200     // present). Then get the next one.
   1201     typename RelocMap_t::mapped_type::const_iterator loc =
   1202       std::lower_bound(relocseclist.begin(), relocseclist.end(), Rel.w.b);
   1203     ++loc;
   1204 
   1205     // If there is no next one, don't do anything. The ++Rel.w.c above sets Rel
   1206     // to the end iterator.
   1207     if (loc != relocseclist.end()) {
   1208       Rel.w.b = *loc;
   1209       Rel.w.a = 0;
   1210     }
   1211   }
   1212   Result = RelocationRef(Rel, this);
   1213   return object_error::success;
   1214 }
   1215 
   1216 template<support::endianness target_endianness, bool is64Bits>
   1217 error_code ELFObjectFile<target_endianness, is64Bits>
   1218                         ::getRelocationSymbol(DataRefImpl Rel,
   1219                                               SymbolRef &Result) const {
   1220   uint32_t symbolIdx;
   1221   const Elf_Shdr *sec = getSection(Rel.w.b);
   1222   switch (sec->sh_type) {
   1223     default :
   1224       report_fatal_error("Invalid section type in Rel!");
   1225     case ELF::SHT_REL : {
   1226       symbolIdx = getRel(Rel)->getSymbol();
   1227       break;
   1228     }
   1229     case ELF::SHT_RELA : {
   1230       symbolIdx = getRela(Rel)->getSymbol();
   1231       break;
   1232     }
   1233   }
   1234   DataRefImpl SymbolData;
   1235   IndexMap_t::const_iterator it = SymbolTableSectionsIndexMap.find(sec->sh_link);
   1236   if (it == SymbolTableSectionsIndexMap.end())
   1237     report_fatal_error("Relocation symbol table not found!");
   1238   SymbolData.d.a = symbolIdx;
   1239   SymbolData.d.b = it->second;
   1240   Result = SymbolRef(SymbolData, this);
   1241   return object_error::success;
   1242 }
   1243 
   1244 template<support::endianness target_endianness, bool is64Bits>
   1245 error_code ELFObjectFile<target_endianness, is64Bits>
   1246                         ::getRelocationAddress(DataRefImpl Rel,
   1247                                                uint64_t &Result) const {
   1248   uint64_t offset;
   1249   const Elf_Shdr *sec = getSection(Rel.w.b);
   1250   switch (sec->sh_type) {
   1251     default :
   1252       report_fatal_error("Invalid section type in Rel!");
   1253     case ELF::SHT_REL : {
   1254       offset = getRel(Rel)->r_offset;
   1255       break;
   1256     }
   1257     case ELF::SHT_RELA : {
   1258       offset = getRela(Rel)->r_offset;
   1259       break;
   1260     }
   1261   }
   1262 
   1263   Result = offset;
   1264   return object_error::success;
   1265 }
   1266 
   1267 template<support::endianness target_endianness, bool is64Bits>
   1268 error_code ELFObjectFile<target_endianness, is64Bits>
   1269                         ::getRelocationOffset(DataRefImpl Rel,
   1270                                               uint64_t &Result) const {
   1271   uint64_t offset;
   1272   const Elf_Shdr *sec = getSection(Rel.w.b);
   1273   switch (sec->sh_type) {
   1274     default :
   1275       report_fatal_error("Invalid section type in Rel!");
   1276     case ELF::SHT_REL : {
   1277       offset = getRel(Rel)->r_offset;
   1278       break;
   1279     }
   1280     case ELF::SHT_RELA : {
   1281       offset = getRela(Rel)->r_offset;
   1282       break;
   1283     }
   1284   }
   1285 
   1286   Result = offset - sec->sh_addr;
   1287   return object_error::success;
   1288 }
   1289 
   1290 template<support::endianness target_endianness, bool is64Bits>
   1291 error_code ELFObjectFile<target_endianness, is64Bits>
   1292                         ::getRelocationType(DataRefImpl Rel,
   1293                                             uint64_t &Result) const {
   1294   const Elf_Shdr *sec = getSection(Rel.w.b);
   1295   switch (sec->sh_type) {
   1296     default :
   1297       report_fatal_error("Invalid section type in Rel!");
   1298     case ELF::SHT_REL : {
   1299       Result = getRel(Rel)->getType();
   1300       break;
   1301     }
   1302     case ELF::SHT_RELA : {
   1303       Result = getRela(Rel)->getType();
   1304       break;
   1305     }
   1306   }
   1307   return object_error::success;
   1308 }
   1309 
   1310 #define LLVM_ELF_SWITCH_RELOC_TYPE_NAME(enum) \
   1311   case ELF::enum: res = #enum; break;
   1312 
   1313 template<support::endianness target_endianness, bool is64Bits>
   1314 error_code ELFObjectFile<target_endianness, is64Bits>
   1315                         ::getRelocationTypeName(DataRefImpl Rel,
   1316                                           SmallVectorImpl<char> &Result) const {
   1317   const Elf_Shdr *sec = getSection(Rel.w.b);
   1318   uint8_t type;
   1319   StringRef res;
   1320   switch (sec->sh_type) {
   1321     default :
   1322       return object_error::parse_failed;
   1323     case ELF::SHT_REL : {
   1324       type = getRel(Rel)->getType();
   1325       break;
   1326     }
   1327     case ELF::SHT_RELA : {
   1328       type = getRela(Rel)->getType();
   1329       break;
   1330     }
   1331   }
   1332   switch (Header->e_machine) {
   1333   case ELF::EM_X86_64:
   1334     switch (type) {
   1335       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_NONE);
   1336       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_64);
   1337       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_PC32);
   1338       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_GOT32);
   1339       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_PLT32);
   1340       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_COPY);
   1341       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_GLOB_DAT);
   1342       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_JUMP_SLOT);
   1343       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_RELATIVE);
   1344       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_GOTPCREL);
   1345       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_32);
   1346       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_32S);
   1347       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_16);
   1348       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_PC16);
   1349       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_8);
   1350       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_PC8);
   1351       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_DTPMOD64);
   1352       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_DTPOFF64);
   1353       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_TPOFF64);
   1354       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_TLSGD);
   1355       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_TLSLD);
   1356       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_DTPOFF32);
   1357       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_GOTTPOFF);
   1358       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_TPOFF32);
   1359       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_PC64);
   1360       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_GOTOFF64);
   1361       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_GOTPC32);
   1362       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_SIZE32);
   1363       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_SIZE64);
   1364       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_GOTPC32_TLSDESC);
   1365       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_TLSDESC_CALL);
   1366       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_TLSDESC);
   1367     default:
   1368       res = "Unknown";
   1369     }
   1370     break;
   1371   case ELF::EM_386:
   1372     switch (type) {
   1373       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_NONE);
   1374       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_32);
   1375       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_PC32);
   1376       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_GOT32);
   1377       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_PLT32);
   1378       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_COPY);
   1379       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_GLOB_DAT);
   1380       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_JUMP_SLOT);
   1381       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_RELATIVE);
   1382       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_GOTOFF);
   1383       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_GOTPC);
   1384       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_32PLT);
   1385       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_TPOFF);
   1386       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_IE);
   1387       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_GOTIE);
   1388       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_LE);
   1389       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_GD);
   1390       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_LDM);
   1391       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_16);
   1392       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_PC16);
   1393       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_8);
   1394       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_PC8);
   1395       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_GD_32);
   1396       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_GD_PUSH);
   1397       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_GD_CALL);
   1398       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_GD_POP);
   1399       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_LDM_32);
   1400       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_LDM_PUSH);
   1401       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_LDM_CALL);
   1402       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_LDM_POP);
   1403       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_LDO_32);
   1404       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_IE_32);
   1405       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_LE_32);
   1406       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_DTPMOD32);
   1407       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_DTPOFF32);
   1408       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_TPOFF32);
   1409       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_GOTDESC);
   1410       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_DESC_CALL);
   1411       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_DESC);
   1412       LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_IRELATIVE);
   1413     default:
   1414       res = "Unknown";
   1415     }
   1416     break;
   1417   default:
   1418     res = "Unknown";
   1419   }
   1420   Result.append(res.begin(), res.end());
   1421   return object_error::success;
   1422 }
   1423 
   1424 #undef LLVM_ELF_SWITCH_RELOC_TYPE_NAME
   1425 
   1426 template<support::endianness target_endianness, bool is64Bits>
   1427 error_code ELFObjectFile<target_endianness, is64Bits>
   1428                         ::getRelocationAdditionalInfo(DataRefImpl Rel,
   1429                                                       int64_t &Result) const {
   1430   const Elf_Shdr *sec = getSection(Rel.w.b);
   1431   switch (sec->sh_type) {
   1432     default :
   1433       report_fatal_error("Invalid section type in Rel!");
   1434     case ELF::SHT_REL : {
   1435       Result = 0;
   1436       return object_error::success;
   1437     }
   1438     case ELF::SHT_RELA : {
   1439       Result = getRela(Rel)->r_addend;
   1440       return object_error::success;
   1441     }
   1442   }
   1443 }
   1444 
   1445 template<support::endianness target_endianness, bool is64Bits>
   1446 error_code ELFObjectFile<target_endianness, is64Bits>
   1447                         ::getRelocationValueString(DataRefImpl Rel,
   1448                                           SmallVectorImpl<char> &Result) const {
   1449   const Elf_Shdr *sec = getSection(Rel.w.b);
   1450   uint8_t type;
   1451   StringRef res;
   1452   int64_t addend = 0;
   1453   uint16_t symbol_index = 0;
   1454   switch (sec->sh_type) {
   1455     default :
   1456       return object_error::parse_failed;
   1457     case ELF::SHT_REL : {
   1458       type = getRel(Rel)->getType();
   1459       symbol_index = getRel(Rel)->getSymbol();
   1460       // TODO: Read implicit addend from section data.
   1461       break;
   1462     }
   1463     case ELF::SHT_RELA : {
   1464       type = getRela(Rel)->getType();
   1465       symbol_index = getRela(Rel)->getSymbol();
   1466       addend = getRela(Rel)->r_addend;
   1467       break;
   1468     }
   1469   }
   1470   const Elf_Sym *symb = getEntry<Elf_Sym>(sec->sh_link, symbol_index);
   1471   StringRef symname;
   1472   if (error_code ec = getSymbolName(getSection(sec->sh_link), symb, symname))
   1473     return ec;
   1474   switch (Header->e_machine) {
   1475   case ELF::EM_X86_64:
   1476     switch (type) {
   1477     case ELF::R_X86_64_32S:
   1478       res = symname;
   1479       break;
   1480     case ELF::R_X86_64_PC32: {
   1481         std::string fmtbuf;
   1482         raw_string_ostream fmt(fmtbuf);
   1483         fmt << symname << (addend < 0 ? "" : "+") << addend << "-P";
   1484         fmt.flush();
   1485         Result.append(fmtbuf.begin(), fmtbuf.end());
   1486       }
   1487       break;
   1488     default:
   1489       res = "Unknown";
   1490     }
   1491     break;
   1492   default:
   1493     res = "Unknown";
   1494   }
   1495   if (Result.empty())
   1496     Result.append(res.begin(), res.end());
   1497   return object_error::success;
   1498 }
   1499 
   1500 // Verify that the last byte in the string table in a null.
   1501 template<support::endianness target_endianness, bool is64Bits>
   1502 void ELFObjectFile<target_endianness, is64Bits>
   1503                   ::VerifyStrTab(const Elf_Shdr *sh) const {
   1504   const char *strtab = (const char*)base() + sh->sh_offset;
   1505   if (strtab[sh->sh_size - 1] != 0)
   1506     // FIXME: Proper error handling.
   1507     report_fatal_error("String table must end with a null terminator!");
   1508 }
   1509 
   1510 template<support::endianness target_endianness, bool is64Bits>
   1511 ELFObjectFile<target_endianness, is64Bits>::ELFObjectFile(MemoryBuffer *Object
   1512                                                           , error_code &ec)
   1513   : ObjectFile(getELFType(target_endianness == support::little, is64Bits),
   1514                Object, ec)
   1515   , isDyldELFObject(false)
   1516   , SectionHeaderTable(0)
   1517   , dot_shstrtab_sec(0)
   1518   , dot_strtab_sec(0)
   1519   , dot_dynstr_sec(0)
   1520   , dot_dynamic_sec(0)
   1521   , dot_gnu_version_sec(0)
   1522   , dot_gnu_version_r_sec(0)
   1523   , dot_gnu_version_d_sec(0)
   1524   , dt_soname(0)
   1525  {
   1526 
   1527   const uint64_t FileSize = Data->getBufferSize();
   1528 
   1529   if (sizeof(Elf_Ehdr) > FileSize)
   1530     // FIXME: Proper error handling.
   1531     report_fatal_error("File too short!");
   1532 
   1533   Header = reinterpret_cast<const Elf_Ehdr *>(base());
   1534 
   1535   if (Header->e_shoff == 0)
   1536     return;
   1537 
   1538   const uint64_t SectionTableOffset = Header->e_shoff;
   1539 
   1540   if (SectionTableOffset + sizeof(Elf_Shdr) > FileSize)
   1541     // FIXME: Proper error handling.
   1542     report_fatal_error("Section header table goes past end of file!");
   1543 
   1544   // The getNumSections() call below depends on SectionHeaderTable being set.
   1545   SectionHeaderTable =
   1546     reinterpret_cast<const Elf_Shdr *>(base() + SectionTableOffset);
   1547   const uint64_t SectionTableSize = getNumSections() * Header->e_shentsize;
   1548 
   1549   if (SectionTableOffset + SectionTableSize > FileSize)
   1550     // FIXME: Proper error handling.
   1551     report_fatal_error("Section table goes past end of file!");
   1552 
   1553   // To find the symbol tables we walk the section table to find SHT_SYMTAB.
   1554   const Elf_Shdr* SymbolTableSectionHeaderIndex = 0;
   1555   const Elf_Shdr* sh = SectionHeaderTable;
   1556 
   1557   // Reserve SymbolTableSections[0] for .dynsym
   1558   SymbolTableSections.push_back(NULL);
   1559 
   1560   for (uint64_t i = 0, e = getNumSections(); i != e; ++i) {
   1561     switch (sh->sh_type) {
   1562     case ELF::SHT_SYMTAB_SHNDX: {
   1563       if (SymbolTableSectionHeaderIndex)
   1564         // FIXME: Proper error handling.
   1565         report_fatal_error("More than one .symtab_shndx!");
   1566       SymbolTableSectionHeaderIndex = sh;
   1567       break;
   1568     }
   1569     case ELF::SHT_SYMTAB: {
   1570       SymbolTableSectionsIndexMap[i] = SymbolTableSections.size();
   1571       SymbolTableSections.push_back(sh);
   1572       break;
   1573     }
   1574     case ELF::SHT_DYNSYM: {
   1575       if (SymbolTableSections[0] != NULL)
   1576         // FIXME: Proper error handling.
   1577         report_fatal_error("More than one .dynsym!");
   1578       SymbolTableSectionsIndexMap[i] = 0;
   1579       SymbolTableSections[0] = sh;
   1580       break;
   1581     }
   1582     case ELF::SHT_REL:
   1583     case ELF::SHT_RELA: {
   1584       SectionRelocMap[getSection(sh->sh_info)].push_back(i);
   1585       break;
   1586     }
   1587     case ELF::SHT_DYNAMIC: {
   1588       if (dot_dynamic_sec != NULL)
   1589         // FIXME: Proper error handling.
   1590         report_fatal_error("More than one .dynamic!");
   1591       dot_dynamic_sec = sh;
   1592       break;
   1593     }
   1594     case ELF::SHT_GNU_versym: {
   1595       if (dot_gnu_version_sec != NULL)
   1596         // FIXME: Proper error handling.
   1597         report_fatal_error("More than one .gnu.version section!");
   1598       dot_gnu_version_sec = sh;
   1599       break;
   1600     }
   1601     case ELF::SHT_GNU_verdef: {
   1602       if (dot_gnu_version_d_sec != NULL)
   1603         // FIXME: Proper error handling.
   1604         report_fatal_error("More than one .gnu.version_d section!");
   1605       dot_gnu_version_d_sec = sh;
   1606       break;
   1607     }
   1608     case ELF::SHT_GNU_verneed: {
   1609       if (dot_gnu_version_r_sec != NULL)
   1610         // FIXME: Proper error handling.
   1611         report_fatal_error("More than one .gnu.version_r section!");
   1612       dot_gnu_version_r_sec = sh;
   1613       break;
   1614     }
   1615     }
   1616     ++sh;
   1617   }
   1618 
   1619   // Sort section relocation lists by index.
   1620   for (typename RelocMap_t::iterator i = SectionRelocMap.begin(),
   1621                                      e = SectionRelocMap.end(); i != e; ++i) {
   1622     std::sort(i->second.begin(), i->second.end());
   1623   }
   1624 
   1625   // Get string table sections.
   1626   dot_shstrtab_sec = getSection(getStringTableIndex());
   1627   if (dot_shstrtab_sec) {
   1628     // Verify that the last byte in the string table in a null.
   1629     VerifyStrTab(dot_shstrtab_sec);
   1630   }
   1631 
   1632   // Merge this into the above loop.
   1633   for (const char *i = reinterpret_cast<const char *>(SectionHeaderTable),
   1634                   *e = i + getNumSections() * Header->e_shentsize;
   1635                    i != e; i += Header->e_shentsize) {
   1636     const Elf_Shdr *sh = reinterpret_cast<const Elf_Shdr*>(i);
   1637     if (sh->sh_type == ELF::SHT_STRTAB) {
   1638       StringRef SectionName(getString(dot_shstrtab_sec, sh->sh_name));
   1639       if (SectionName == ".strtab") {
   1640         if (dot_strtab_sec != 0)
   1641           // FIXME: Proper error handling.
   1642           report_fatal_error("Already found section named .strtab!");
   1643         dot_strtab_sec = sh;
   1644         VerifyStrTab(dot_strtab_sec);
   1645       } else if (SectionName == ".dynstr") {
   1646         if (dot_dynstr_sec != 0)
   1647           // FIXME: Proper error handling.
   1648           report_fatal_error("Already found section named .dynstr!");
   1649         dot_dynstr_sec = sh;
   1650         VerifyStrTab(dot_dynstr_sec);
   1651       }
   1652     }
   1653   }
   1654 
   1655   // Build symbol name side-mapping if there is one.
   1656   if (SymbolTableSectionHeaderIndex) {
   1657     const Elf_Word *ShndxTable = reinterpret_cast<const Elf_Word*>(base() +
   1658                                       SymbolTableSectionHeaderIndex->sh_offset);
   1659     error_code ec;
   1660     for (symbol_iterator si = begin_symbols(),
   1661                          se = end_symbols(); si != se; si.increment(ec)) {
   1662       if (ec)
   1663         report_fatal_error("Fewer extended symbol table entries than symbols!");
   1664       if (*ShndxTable != ELF::SHN_UNDEF)
   1665         ExtendedSymbolTable[getSymbol(si->getRawDataRefImpl())] = *ShndxTable;
   1666       ++ShndxTable;
   1667     }
   1668   }
   1669 }
   1670 
   1671 template<support::endianness target_endianness, bool is64Bits>
   1672 symbol_iterator ELFObjectFile<target_endianness, is64Bits>
   1673                              ::begin_symbols() const {
   1674   DataRefImpl SymbolData;
   1675   if (SymbolTableSections.size() <= 1) {
   1676     SymbolData.d.a = std::numeric_limits<uint32_t>::max();
   1677     SymbolData.d.b = std::numeric_limits<uint32_t>::max();
   1678   } else {
   1679     SymbolData.d.a = 1; // The 0th symbol in ELF is fake.
   1680     SymbolData.d.b = 1; // The 0th table is .dynsym
   1681   }
   1682   return symbol_iterator(SymbolRef(SymbolData, this));
   1683 }
   1684 
   1685 template<support::endianness target_endianness, bool is64Bits>
   1686 symbol_iterator ELFObjectFile<target_endianness, is64Bits>
   1687                              ::end_symbols() const {
   1688   DataRefImpl SymbolData;
   1689   SymbolData.d.a = std::numeric_limits<uint32_t>::max();
   1690   SymbolData.d.b = std::numeric_limits<uint32_t>::max();
   1691   return symbol_iterator(SymbolRef(SymbolData, this));
   1692 }
   1693 
   1694 template<support::endianness target_endianness, bool is64Bits>
   1695 symbol_iterator ELFObjectFile<target_endianness, is64Bits>
   1696                              ::begin_dynamic_symbols() const {
   1697   DataRefImpl SymbolData;
   1698   if (SymbolTableSections[0] == NULL) {
   1699     SymbolData.d.a = std::numeric_limits<uint32_t>::max();
   1700     SymbolData.d.b = std::numeric_limits<uint32_t>::max();
   1701   } else {
   1702     SymbolData.d.a = 1; // The 0th symbol in ELF is fake.
   1703     SymbolData.d.b = 0; // The 0th table is .dynsym
   1704   }
   1705   return symbol_iterator(SymbolRef(SymbolData, this));
   1706 }
   1707 
   1708 template<support::endianness target_endianness, bool is64Bits>
   1709 symbol_iterator ELFObjectFile<target_endianness, is64Bits>
   1710                              ::end_dynamic_symbols() const {
   1711   DataRefImpl SymbolData;
   1712   SymbolData.d.a = std::numeric_limits<uint32_t>::max();
   1713   SymbolData.d.b = std::numeric_limits<uint32_t>::max();
   1714   return symbol_iterator(SymbolRef(SymbolData, this));
   1715 }
   1716 
   1717 template<support::endianness target_endianness, bool is64Bits>
   1718 section_iterator ELFObjectFile<target_endianness, is64Bits>
   1719                               ::begin_sections() const {
   1720   DataRefImpl ret;
   1721   ret.p = reinterpret_cast<intptr_t>(base() + Header->e_shoff);
   1722   return section_iterator(SectionRef(ret, this));
   1723 }
   1724 
   1725 template<support::endianness target_endianness, bool is64Bits>
   1726 section_iterator ELFObjectFile<target_endianness, is64Bits>
   1727                               ::end_sections() const {
   1728   DataRefImpl ret;
   1729   ret.p = reinterpret_cast<intptr_t>(base()
   1730                                      + Header->e_shoff
   1731                                      + (Header->e_shentsize*getNumSections()));
   1732   return section_iterator(SectionRef(ret, this));
   1733 }
   1734 
   1735 template<support::endianness target_endianness, bool is64Bits>
   1736 typename ELFObjectFile<target_endianness, is64Bits>::dyn_iterator
   1737 ELFObjectFile<target_endianness, is64Bits>::begin_dynamic_table() const {
   1738   DataRefImpl DynData;
   1739   if (dot_dynamic_sec == NULL || dot_dynamic_sec->sh_size == 0) {
   1740     DynData.d.a = std::numeric_limits<uint32_t>::max();
   1741   } else {
   1742     DynData.d.a = 0;
   1743   }
   1744   return dyn_iterator(DynRef(DynData, this));
   1745 }
   1746 
   1747 template<support::endianness target_endianness, bool is64Bits>
   1748 typename ELFObjectFile<target_endianness, is64Bits>::dyn_iterator
   1749 ELFObjectFile<target_endianness, is64Bits>
   1750                           ::end_dynamic_table() const {
   1751   DataRefImpl DynData;
   1752   DynData.d.a = std::numeric_limits<uint32_t>::max();
   1753   return dyn_iterator(DynRef(DynData, this));
   1754 }
   1755 
   1756 template<support::endianness target_endianness, bool is64Bits>
   1757 error_code ELFObjectFile<target_endianness, is64Bits>
   1758                         ::getDynNext(DataRefImpl DynData,
   1759                                      DynRef &Result) const {
   1760   ++DynData.d.a;
   1761 
   1762   // Check to see if we are at the end of .dynamic
   1763   if (DynData.d.a >= dot_dynamic_sec->getEntityCount()) {
   1764     // We are at the end. Return the terminator.
   1765     DynData.d.a = std::numeric_limits<uint32_t>::max();
   1766   }
   1767 
   1768   Result = DynRef(DynData, this);
   1769   return object_error::success;
   1770 }
   1771 
   1772 template<support::endianness target_endianness, bool is64Bits>
   1773 StringRef
   1774 ELFObjectFile<target_endianness, is64Bits>::getLoadName() const {
   1775   if (!dt_soname) {
   1776     // Find the DT_SONAME entry
   1777     dyn_iterator it = begin_dynamic_table();
   1778     dyn_iterator ie = end_dynamic_table();
   1779     error_code ec;
   1780     while (it != ie) {
   1781       if (it->getTag() == ELF::DT_SONAME)
   1782         break;
   1783       it.increment(ec);
   1784       if (ec)
   1785         report_fatal_error("dynamic table iteration failed");
   1786     }
   1787     if (it != ie) {
   1788       if (dot_dynstr_sec == NULL)
   1789         report_fatal_error("Dynamic string table is missing");
   1790       dt_soname = getString(dot_dynstr_sec, it->getVal());
   1791     } else {
   1792       dt_soname = "";
   1793     }
   1794   }
   1795   return dt_soname;
   1796 }
   1797 
   1798 template<support::endianness target_endianness, bool is64Bits>
   1799 library_iterator ELFObjectFile<target_endianness, is64Bits>
   1800                              ::begin_libraries_needed() const {
   1801   // Find the first DT_NEEDED entry
   1802   dyn_iterator i = begin_dynamic_table();
   1803   dyn_iterator e = end_dynamic_table();
   1804   error_code ec;
   1805   while (i != e) {
   1806     if (i->getTag() == ELF::DT_NEEDED)
   1807       break;
   1808     i.increment(ec);
   1809     if (ec)
   1810       report_fatal_error("dynamic table iteration failed");
   1811   }
   1812   // Use the same DataRefImpl format as DynRef.
   1813   return library_iterator(LibraryRef(i->getRawDataRefImpl(), this));
   1814 }
   1815 
   1816 template<support::endianness target_endianness, bool is64Bits>
   1817 error_code ELFObjectFile<target_endianness, is64Bits>
   1818                         ::getLibraryNext(DataRefImpl Data,
   1819                                          LibraryRef &Result) const {
   1820   // Use the same DataRefImpl format as DynRef.
   1821   dyn_iterator i = dyn_iterator(DynRef(Data, this));
   1822   dyn_iterator e = end_dynamic_table();
   1823 
   1824   // Skip the current dynamic table entry.
   1825   error_code ec;
   1826   if (i != e) {
   1827     i.increment(ec);
   1828     // TODO: proper error handling
   1829     if (ec)
   1830       report_fatal_error("dynamic table iteration failed");
   1831   }
   1832 
   1833   // Find the next DT_NEEDED entry.
   1834   while (i != e) {
   1835     if (i->getTag() == ELF::DT_NEEDED)
   1836       break;
   1837     i.increment(ec);
   1838     if (ec)
   1839       report_fatal_error("dynamic table iteration failed");
   1840   }
   1841   Result = LibraryRef(i->getRawDataRefImpl(), this);
   1842   return object_error::success;
   1843 }
   1844 
   1845 template<support::endianness target_endianness, bool is64Bits>
   1846 error_code ELFObjectFile<target_endianness, is64Bits>
   1847          ::getLibraryPath(DataRefImpl Data, StringRef &Res) const {
   1848   dyn_iterator i = dyn_iterator(DynRef(Data, this));
   1849   if (i == end_dynamic_table())
   1850     report_fatal_error("getLibraryPath() called on iterator end");
   1851 
   1852   if (i->getTag() != ELF::DT_NEEDED)
   1853     report_fatal_error("Invalid library_iterator");
   1854 
   1855   // This uses .dynstr to lookup the name of the DT_NEEDED entry.
   1856   // THis works as long as DT_STRTAB == .dynstr. This is true most of
   1857   // the time, but the specification allows exceptions.
   1858   // TODO: This should really use DT_STRTAB instead. Doing this requires
   1859   // reading the program headers.
   1860   if (dot_dynstr_sec == NULL)
   1861     report_fatal_error("Dynamic string table is missing");
   1862   Res = getString(dot_dynstr_sec, i->getVal());
   1863   return object_error::success;
   1864 }
   1865 
   1866 template<support::endianness target_endianness, bool is64Bits>
   1867 library_iterator ELFObjectFile<target_endianness, is64Bits>
   1868                              ::end_libraries_needed() const {
   1869   dyn_iterator e = end_dynamic_table();
   1870   // Use the same DataRefImpl format as DynRef.
   1871   return library_iterator(LibraryRef(e->getRawDataRefImpl(), this));
   1872 }
   1873 
   1874 template<support::endianness target_endianness, bool is64Bits>
   1875 uint8_t ELFObjectFile<target_endianness, is64Bits>::getBytesInAddress() const {
   1876   return is64Bits ? 8 : 4;
   1877 }
   1878 
   1879 template<support::endianness target_endianness, bool is64Bits>
   1880 StringRef ELFObjectFile<target_endianness, is64Bits>
   1881                        ::getFileFormatName() const {
   1882   switch(Header->e_ident[ELF::EI_CLASS]) {
   1883   case ELF::ELFCLASS32:
   1884     switch(Header->e_machine) {
   1885     case ELF::EM_386:
   1886       return "ELF32-i386";
   1887     case ELF::EM_X86_64:
   1888       return "ELF32-x86-64";
   1889     case ELF::EM_ARM:
   1890       return "ELF32-arm";
   1891     default:
   1892       return "ELF32-unknown";
   1893     }
   1894   case ELF::ELFCLASS64:
   1895     switch(Header->e_machine) {
   1896     case ELF::EM_386:
   1897       return "ELF64-i386";
   1898     case ELF::EM_X86_64:
   1899       return "ELF64-x86-64";
   1900     default:
   1901       return "ELF64-unknown";
   1902     }
   1903   default:
   1904     // FIXME: Proper error handling.
   1905     report_fatal_error("Invalid ELFCLASS!");
   1906   }
   1907 }
   1908 
   1909 template<support::endianness target_endianness, bool is64Bits>
   1910 unsigned ELFObjectFile<target_endianness, is64Bits>::getArch() const {
   1911   switch(Header->e_machine) {
   1912   case ELF::EM_386:
   1913     return Triple::x86;
   1914   case ELF::EM_X86_64:
   1915     return Triple::x86_64;
   1916   case ELF::EM_ARM:
   1917     return Triple::arm;
   1918   default:
   1919     return Triple::UnknownArch;
   1920   }
   1921 }
   1922 
   1923 template<support::endianness target_endianness, bool is64Bits>
   1924 uint64_t ELFObjectFile<target_endianness, is64Bits>::getNumSections() const {
   1925   assert(Header && "Header not initialized!");
   1926   if (Header->e_shnum == ELF::SHN_UNDEF) {
   1927     assert(SectionHeaderTable && "SectionHeaderTable not initialized!");
   1928     return SectionHeaderTable->sh_size;
   1929   }
   1930   return Header->e_shnum;
   1931 }
   1932 
   1933 template<support::endianness target_endianness, bool is64Bits>
   1934 uint64_t
   1935 ELFObjectFile<target_endianness, is64Bits>::getStringTableIndex() const {
   1936   if (Header->e_shnum == ELF::SHN_UNDEF) {
   1937     if (Header->e_shstrndx == ELF::SHN_HIRESERVE)
   1938       return SectionHeaderTable->sh_link;
   1939     if (Header->e_shstrndx >= getNumSections())
   1940       return 0;
   1941   }
   1942   return Header->e_shstrndx;
   1943 }
   1944 
   1945 
   1946 template<support::endianness target_endianness, bool is64Bits>
   1947 template<typename T>
   1948 inline const T *
   1949 ELFObjectFile<target_endianness, is64Bits>::getEntry(uint16_t Section,
   1950                                                      uint32_t Entry) const {
   1951   return getEntry<T>(getSection(Section), Entry);
   1952 }
   1953 
   1954 template<support::endianness target_endianness, bool is64Bits>
   1955 template<typename T>
   1956 inline const T *
   1957 ELFObjectFile<target_endianness, is64Bits>::getEntry(const Elf_Shdr * Section,
   1958                                                      uint32_t Entry) const {
   1959   return reinterpret_cast<const T *>(
   1960            base()
   1961            + Section->sh_offset
   1962            + (Entry * Section->sh_entsize));
   1963 }
   1964 
   1965 template<support::endianness target_endianness, bool is64Bits>
   1966 const typename ELFObjectFile<target_endianness, is64Bits>::Elf_Sym *
   1967 ELFObjectFile<target_endianness, is64Bits>::getSymbol(DataRefImpl Symb) const {
   1968   return getEntry<Elf_Sym>(SymbolTableSections[Symb.d.b], Symb.d.a);
   1969 }
   1970 
   1971 template<support::endianness target_endianness, bool is64Bits>
   1972 const typename ELFObjectFile<target_endianness, is64Bits>::Elf_Dyn *
   1973 ELFObjectFile<target_endianness, is64Bits>::getDyn(DataRefImpl DynData) const {
   1974   return getEntry<Elf_Dyn>(dot_dynamic_sec, DynData.d.a);
   1975 }
   1976 
   1977 template<support::endianness target_endianness, bool is64Bits>
   1978 const typename ELFObjectFile<target_endianness, is64Bits>::Elf_Rel *
   1979 ELFObjectFile<target_endianness, is64Bits>::getRel(DataRefImpl Rel) const {
   1980   return getEntry<Elf_Rel>(Rel.w.b, Rel.w.c);
   1981 }
   1982 
   1983 template<support::endianness target_endianness, bool is64Bits>
   1984 const typename ELFObjectFile<target_endianness, is64Bits>::Elf_Rela *
   1985 ELFObjectFile<target_endianness, is64Bits>::getRela(DataRefImpl Rela) const {
   1986   return getEntry<Elf_Rela>(Rela.w.b, Rela.w.c);
   1987 }
   1988 
   1989 template<support::endianness target_endianness, bool is64Bits>
   1990 const typename ELFObjectFile<target_endianness, is64Bits>::Elf_Shdr *
   1991 ELFObjectFile<target_endianness, is64Bits>::getSection(DataRefImpl Symb) const {
   1992   const Elf_Shdr *sec = getSection(Symb.d.b);
   1993   if (sec->sh_type != ELF::SHT_SYMTAB || sec->sh_type != ELF::SHT_DYNSYM)
   1994     // FIXME: Proper error handling.
   1995     report_fatal_error("Invalid symbol table section!");
   1996   return sec;
   1997 }
   1998 
   1999 template<support::endianness target_endianness, bool is64Bits>
   2000 const typename ELFObjectFile<target_endianness, is64Bits>::Elf_Shdr *
   2001 ELFObjectFile<target_endianness, is64Bits>::getSection(uint32_t index) const {
   2002   if (index == 0)
   2003     return 0;
   2004   if (!SectionHeaderTable || index >= getNumSections())
   2005     // FIXME: Proper error handling.
   2006     report_fatal_error("Invalid section index!");
   2007 
   2008   return reinterpret_cast<const Elf_Shdr *>(
   2009          reinterpret_cast<const char *>(SectionHeaderTable)
   2010          + (index * Header->e_shentsize));
   2011 }
   2012 
   2013 template<support::endianness target_endianness, bool is64Bits>
   2014 const char *ELFObjectFile<target_endianness, is64Bits>
   2015                          ::getString(uint32_t section,
   2016                                      ELF::Elf32_Word offset) const {
   2017   return getString(getSection(section), offset);
   2018 }
   2019 
   2020 template<support::endianness target_endianness, bool is64Bits>
   2021 const char *ELFObjectFile<target_endianness, is64Bits>
   2022                          ::getString(const Elf_Shdr *section,
   2023                                      ELF::Elf32_Word offset) const {
   2024   assert(section && section->sh_type == ELF::SHT_STRTAB && "Invalid section!");
   2025   if (offset >= section->sh_size)
   2026     // FIXME: Proper error handling.
   2027     report_fatal_error("Symbol name offset outside of string table!");
   2028   return (const char *)base() + section->sh_offset + offset;
   2029 }
   2030 
   2031 template<support::endianness target_endianness, bool is64Bits>
   2032 error_code ELFObjectFile<target_endianness, is64Bits>
   2033                         ::getSymbolName(const Elf_Shdr *section,
   2034                                         const Elf_Sym *symb,
   2035                                         StringRef &Result) const {
   2036   if (symb->st_name == 0) {
   2037     const Elf_Shdr *section = getSection(symb);
   2038     if (!section)
   2039       Result = "";
   2040     else
   2041       Result = getString(dot_shstrtab_sec, section->sh_name);
   2042     return object_error::success;
   2043   }
   2044 
   2045   if (section == SymbolTableSections[0]) {
   2046     // Symbol is in .dynsym, use .dynstr string table
   2047     Result = getString(dot_dynstr_sec, symb->st_name);
   2048   } else {
   2049     // Use the default symbol table name section.
   2050     Result = getString(dot_strtab_sec, symb->st_name);
   2051   }
   2052   return object_error::success;
   2053 }
   2054 
   2055 template<support::endianness target_endianness, bool is64Bits>
   2056 error_code ELFObjectFile<target_endianness, is64Bits>
   2057                         ::getSymbolVersion(const Elf_Shdr *section,
   2058                                            const Elf_Sym *symb,
   2059                                            StringRef &Version,
   2060                                            bool &IsDefault) const {
   2061   // Handle non-dynamic symbols.
   2062   if (section != SymbolTableSections[0]) {
   2063     // Non-dynamic symbols can have versions in their names
   2064     // A name of the form 'foo@V1' indicates version 'V1', non-default.
   2065     // A name of the form 'foo@@V2' indicates version 'V2', default version.
   2066     StringRef Name;
   2067     error_code ec = getSymbolName(section, symb, Name);
   2068     if (ec != object_error::success)
   2069       return ec;
   2070     size_t atpos = Name.find('@');
   2071     if (atpos == StringRef::npos) {
   2072       Version = "";
   2073       IsDefault = false;
   2074       return object_error::success;
   2075     }
   2076     ++atpos;
   2077     if (atpos < Name.size() && Name[atpos] == '@') {
   2078       IsDefault = true;
   2079       ++atpos;
   2080     } else {
   2081       IsDefault = false;
   2082     }
   2083     Version = Name.substr(atpos);
   2084     return object_error::success;
   2085   }
   2086 
   2087   // This is a dynamic symbol. Look in the GNU symbol version table.
   2088   if (dot_gnu_version_sec == NULL) {
   2089     // No version table.
   2090     Version = "";
   2091     IsDefault = false;
   2092     return object_error::success;
   2093   }
   2094 
   2095   // Determine the position in the symbol table of this entry.
   2096   const char *sec_start = (const char*)base() + section->sh_offset;
   2097   size_t entry_index = ((const char*)symb - sec_start)/section->sh_entsize;
   2098 
   2099   // Get the corresponding version index entry
   2100   const Elf_Versym *vs = getEntry<Elf_Versym>(dot_gnu_version_sec, entry_index);
   2101   size_t version_index = vs->vs_index & ELF::VERSYM_VERSION;
   2102 
   2103   // Special markers for unversioned symbols.
   2104   if (version_index == ELF::VER_NDX_LOCAL ||
   2105       version_index == ELF::VER_NDX_GLOBAL) {
   2106     Version = "";
   2107     IsDefault = false;
   2108     return object_error::success;
   2109   }
   2110 
   2111   // Lookup this symbol in the version table
   2112   LoadVersionMap();
   2113   if (version_index >= VersionMap.size() || VersionMap[version_index].isNull())
   2114     report_fatal_error("Symbol has version index without corresponding "
   2115                        "define or reference entry");
   2116   const VersionMapEntry &entry = VersionMap[version_index];
   2117 
   2118   // Get the version name string
   2119   size_t name_offset;
   2120   if (entry.isVerdef()) {
   2121     // The first Verdaux entry holds the name.
   2122     name_offset = entry.getVerdef()->getAux()->vda_name;
   2123   } else {
   2124     name_offset = entry.getVernaux()->vna_name;
   2125   }
   2126   Version = getString(dot_dynstr_sec, name_offset);
   2127 
   2128   // Set IsDefault
   2129   if (entry.isVerdef()) {
   2130     IsDefault = !(vs->vs_index & ELF::VERSYM_HIDDEN);
   2131   } else {
   2132     IsDefault = false;
   2133   }
   2134 
   2135   return object_error::success;
   2136 }
   2137 
   2138 template<support::endianness target_endianness, bool is64Bits>
   2139 inline DynRefImpl<target_endianness, is64Bits>
   2140                  ::DynRefImpl(DataRefImpl DynP, const OwningType *Owner)
   2141   : DynPimpl(DynP)
   2142   , OwningObject(Owner) {}
   2143 
   2144 template<support::endianness target_endianness, bool is64Bits>
   2145 inline bool DynRefImpl<target_endianness, is64Bits>
   2146                       ::operator==(const DynRefImpl &Other) const {
   2147   return DynPimpl == Other.DynPimpl;
   2148 }
   2149 
   2150 template<support::endianness target_endianness, bool is64Bits>
   2151 inline bool DynRefImpl<target_endianness, is64Bits>
   2152                       ::operator <(const DynRefImpl &Other) const {
   2153   return DynPimpl < Other.DynPimpl;
   2154 }
   2155 
   2156 template<support::endianness target_endianness, bool is64Bits>
   2157 inline error_code DynRefImpl<target_endianness, is64Bits>
   2158                             ::getNext(DynRefImpl &Result) const {
   2159   return OwningObject->getDynNext(DynPimpl, Result);
   2160 }
   2161 
   2162 template<support::endianness target_endianness, bool is64Bits>
   2163 inline int64_t DynRefImpl<target_endianness, is64Bits>
   2164                             ::getTag() const {
   2165   return OwningObject->getDyn(DynPimpl)->d_tag;
   2166 }
   2167 
   2168 template<support::endianness target_endianness, bool is64Bits>
   2169 inline uint64_t DynRefImpl<target_endianness, is64Bits>
   2170                             ::getVal() const {
   2171   return OwningObject->getDyn(DynPimpl)->d_un.d_val;
   2172 }
   2173 
   2174 template<support::endianness target_endianness, bool is64Bits>
   2175 inline uint64_t DynRefImpl<target_endianness, is64Bits>
   2176                             ::getPtr() const {
   2177   return OwningObject->getDyn(DynPimpl)->d_un.d_ptr;
   2178 }
   2179 
   2180 template<support::endianness target_endianness, bool is64Bits>
   2181 inline DataRefImpl DynRefImpl<target_endianness, is64Bits>
   2182                              ::getRawDataRefImpl() const {
   2183   return DynPimpl;
   2184 }
   2185 
   2186 /// This is a generic interface for retrieving GNU symbol version
   2187 /// information from an ELFObjectFile.
   2188 static inline error_code GetELFSymbolVersion(const ObjectFile *Obj,
   2189                                              const SymbolRef &Sym,
   2190                                              StringRef &Version,
   2191                                              bool &IsDefault) {
   2192   // Little-endian 32-bit
   2193   if (const ELFObjectFile<support::little, false> *ELFObj =
   2194           dyn_cast<ELFObjectFile<support::little, false> >(Obj))
   2195     return ELFObj->getSymbolVersion(Sym, Version, IsDefault);
   2196 
   2197   // Big-endian 32-bit
   2198   if (const ELFObjectFile<support::big, false> *ELFObj =
   2199           dyn_cast<ELFObjectFile<support::big, false> >(Obj))
   2200     return ELFObj->getSymbolVersion(Sym, Version, IsDefault);
   2201 
   2202   // Little-endian 64-bit
   2203   if (const ELFObjectFile<support::little, true> *ELFObj =
   2204           dyn_cast<ELFObjectFile<support::little, true> >(Obj))
   2205     return ELFObj->getSymbolVersion(Sym, Version, IsDefault);
   2206 
   2207   // Big-endian 64-bit
   2208   if (const ELFObjectFile<support::big, true> *ELFObj =
   2209           dyn_cast<ELFObjectFile<support::big, true> >(Obj))
   2210     return ELFObj->getSymbolVersion(Sym, Version, IsDefault);
   2211 
   2212   llvm_unreachable("Object passed to GetELFSymbolVersion() is not ELF");
   2213 }
   2214 
   2215 }
   2216 }
   2217 
   2218 #endif
   2219