Home | History | Annotate | Download | only in LD
      1 //===- ELFReader.cpp ------------------------------------------------------===//
      2 //
      3 //                     The MCLinker Project
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 #include "mcld/LD/ELFReader.h"
     10 
     11 #include "mcld/IRBuilder.h"
     12 #include "mcld/Fragment/FillFragment.h"
     13 #include "mcld/LD/EhFrame.h"
     14 #include "mcld/LD/LDContext.h"
     15 #include "mcld/LD/SectionData.h"
     16 #include "mcld/Object/ObjectBuilder.h"
     17 #include "mcld/Support/MemoryArea.h"
     18 #include "mcld/Support/MsgHandling.h"
     19 #include "mcld/Target/GNUInfo.h"
     20 #include "mcld/Target/GNULDBackend.h"
     21 
     22 #include <llvm/ADT/StringRef.h>
     23 #include <llvm/ADT/Twine.h>
     24 #include <llvm/Support/ELF.h>
     25 #include <llvm/Support/Host.h>
     26 
     27 #include <iostream>
     28 
     29 #include <cstring>
     30 
     31 namespace mcld {
     32 
     33 //===----------------------------------------------------------------------===//
     34 // ELFReader<32, true>
     35 //===----------------------------------------------------------------------===//
     36 /// constructor
     37 ELFReader<32, true>::ELFReader(GNULDBackend& pBackend) : ELFReaderIF(pBackend) {
     38 }
     39 
     40 /// destructor
     41 ELFReader<32, true>::~ELFReader() {
     42 }
     43 
     44 /// isELF - is this a ELF file
     45 bool ELFReader<32, true>::isELF(const void* pELFHeader) const {
     46   const llvm::ELF::Elf32_Ehdr* hdr =
     47       reinterpret_cast<const llvm::ELF::Elf32_Ehdr*>(pELFHeader);
     48   if (memcmp(llvm::ELF::ElfMagic, hdr, 4) == 0)
     49     return true;
     50   return false;
     51 }
     52 
     53 /// readRegularSection - read a regular section and create fragments.
     54 bool ELFReader<32, true>::readRegularSection(Input& pInput,
     55                                              SectionData& pSD) const {
     56   uint32_t offset = pInput.fileOffset() + pSD.getSection().offset();
     57   uint32_t size = pSD.getSection().size();
     58 
     59   Fragment* frag = IRBuilder::CreateRegion(pInput, offset, size);
     60   ObjectBuilder::AppendFragment(*frag, pSD);
     61   return true;
     62 }
     63 
     64 /// readSymbols - read ELF symbols and create LDSymbol
     65 bool ELFReader<32, true>::readSymbols(Input& pInput,
     66                                       IRBuilder& pBuilder,
     67                                       llvm::StringRef pRegion,
     68                                       const char* pStrTab) const {
     69   // get number of symbols
     70   size_t entsize = pRegion.size() / sizeof(llvm::ELF::Elf32_Sym);
     71   const llvm::ELF::Elf32_Sym* symtab =
     72       reinterpret_cast<const llvm::ELF::Elf32_Sym*>(pRegion.begin());
     73 
     74   uint32_t st_name = 0x0;
     75   uint32_t st_value = 0x0;
     76   uint32_t st_size = 0x0;
     77   uint8_t st_info = 0x0;
     78   uint8_t st_other = 0x0;
     79   uint16_t st_shndx = 0x0;
     80 
     81   // skip the first NULL symbol
     82   pInput.context()->addSymbol(LDSymbol::Null());
     83 
     84   /// recording symbols added from DynObj to analyze weak alias
     85   std::vector<AliasInfo> potential_aliases;
     86   bool is_dyn_obj = (pInput.type() == Input::DynObj);
     87   for (size_t idx = 1; idx < entsize; ++idx) {
     88     st_info = symtab[idx].st_info;
     89     st_other = symtab[idx].st_other;
     90 
     91     if (llvm::sys::IsLittleEndianHost) {
     92       st_name = symtab[idx].st_name;
     93       st_value = symtab[idx].st_value;
     94       st_size = symtab[idx].st_size;
     95       st_shndx = symtab[idx].st_shndx;
     96     } else {
     97       st_name = mcld::bswap32(symtab[idx].st_name);
     98       st_value = mcld::bswap32(symtab[idx].st_value);
     99       st_size = mcld::bswap32(symtab[idx].st_size);
    100       st_shndx = mcld::bswap16(symtab[idx].st_shndx);
    101     }
    102 
    103     // If the section should not be included, set the st_shndx SHN_UNDEF
    104     // - A section in interrelated groups are not included.
    105     if (pInput.type() == Input::Object && st_shndx < llvm::ELF::SHN_LORESERVE &&
    106         st_shndx != llvm::ELF::SHN_UNDEF) {
    107       if (pInput.context()->getSection(st_shndx) == NULL)
    108         st_shndx = llvm::ELF::SHN_UNDEF;
    109     }
    110 
    111     // get ld_type
    112     ResolveInfo::Type ld_type = getSymType(st_info, st_shndx);
    113 
    114     // get ld_desc
    115     ResolveInfo::Desc ld_desc = getSymDesc(st_shndx, pInput);
    116 
    117     // get ld_binding
    118     ResolveInfo::Binding ld_binding =
    119         getSymBinding((st_info >> 4), st_shndx, st_other);
    120 
    121     // get ld_value - ld_value must be section relative.
    122     uint64_t ld_value = getSymValue(st_value, st_shndx, pInput);
    123 
    124     // get ld_vis
    125     ResolveInfo::Visibility ld_vis = getSymVisibility(st_other);
    126 
    127     // get section
    128     LDSection* section = NULL;
    129     if (st_shndx < llvm::ELF::SHN_LORESERVE)  // including ABS and COMMON
    130       section = pInput.context()->getSection(st_shndx);
    131 
    132     // get ld_name
    133     std::string ld_name;
    134     if (ResolveInfo::Section == ld_type) {
    135       // Section symbol's st_name is the section index.
    136       assert(section != NULL && "get a invalid section");
    137       ld_name = section->name();
    138     } else {
    139       ld_name = std::string(pStrTab + st_name);
    140     }
    141 
    142     LDSymbol* psym = pBuilder.AddSymbol(pInput,
    143                                         ld_name,
    144                                         ld_type,
    145                                         ld_desc,
    146                                         ld_binding,
    147                                         st_size,
    148                                         ld_value,
    149                                         section,
    150                                         ld_vis);
    151 
    152     if (is_dyn_obj && psym != NULL && ResolveInfo::Undefined != ld_desc &&
    153         (ResolveInfo::Global == ld_binding ||
    154          ResolveInfo::Weak == ld_binding) &&
    155         ResolveInfo::Object == ld_type) {
    156       AliasInfo p;
    157       p.pt_alias = psym;
    158       p.ld_binding = ld_binding;
    159       p.ld_value = ld_value;
    160       potential_aliases.push_back(p);
    161     }
    162   }  // end of for loop
    163 
    164   // analyze weak alias
    165   // FIXME: it is better to let IRBuilder handle alias anlysis.
    166   //        1. eliminate code duplication
    167   //        2. easy to know if a symbol is from .so
    168   //           (so that it may be a potential alias)
    169   if (is_dyn_obj) {
    170     // sort symbols by symbol value and then weak before strong
    171     std::sort(potential_aliases.begin(), potential_aliases.end(), less);
    172 
    173     // for each weak symbol, find out all its aliases, and
    174     // then link them as a circular list in Module
    175     std::vector<AliasInfo>::iterator sym_it, sym_e;
    176     sym_e = potential_aliases.end();
    177     for (sym_it = potential_aliases.begin(); sym_it != sym_e; ++sym_it) {
    178       if (ResolveInfo::Weak != sym_it->ld_binding)
    179         continue;
    180 
    181       Module& pModule = pBuilder.getModule();
    182       std::vector<AliasInfo>::iterator alias_it = sym_it + 1;
    183       while (alias_it != sym_e) {
    184         if (sym_it->ld_value != alias_it->ld_value)
    185           break;
    186 
    187         if (sym_it + 1 == alias_it)
    188           pModule.CreateAliasList(*sym_it->pt_alias->resolveInfo());
    189         pModule.addAlias(*alias_it->pt_alias->resolveInfo());
    190         ++alias_it;
    191       }
    192 
    193       sym_it = alias_it - 1;
    194     }  // end of for loop
    195   }
    196 
    197   return true;
    198 }
    199 
    200 //===----------------------------------------------------------------------===//
    201 // ELFReader::read relocations - read ELF rela and rel, and create Relocation
    202 //===----------------------------------------------------------------------===//
    203 /// ELFReader::readRela - read ELF rela and create Relocation
    204 bool ELFReader<32, true>::readRela(Input& pInput,
    205                                    LDSection& pSection,
    206                                    llvm::StringRef pRegion) const {
    207   // get the number of rela
    208   size_t entsize = pRegion.size() / sizeof(llvm::ELF::Elf32_Rela);
    209   const llvm::ELF::Elf32_Rela* relaTab =
    210       reinterpret_cast<const llvm::ELF::Elf32_Rela*>(pRegion.begin());
    211 
    212   for (size_t idx = 0; idx < entsize; ++idx) {
    213     Relocation::Type r_type = 0x0;
    214     uint32_t r_sym = 0x0;
    215     uint32_t r_offset = 0x0;
    216     int32_t r_addend = 0;
    217     if (!target()
    218              .readRelocation(relaTab[idx], r_type, r_sym, r_offset, r_addend)) {
    219       return false;
    220     }
    221 
    222     LDSymbol* symbol = pInput.context()->getSymbol(r_sym);
    223     if (symbol == NULL) {
    224       fatal(diag::err_cannot_read_symbol) << r_sym << pInput.path();
    225     }
    226 
    227     IRBuilder::AddRelocation(pSection, r_type, *symbol, r_offset, r_addend);
    228   }  // end of for
    229   return true;
    230 }
    231 
    232 /// readRel - read ELF rel and create Relocation
    233 bool ELFReader<32, true>::readRel(Input& pInput,
    234                                   LDSection& pSection,
    235                                   llvm::StringRef pRegion) const {
    236   // get the number of rel
    237   size_t entsize = pRegion.size() / sizeof(llvm::ELF::Elf32_Rel);
    238   const llvm::ELF::Elf32_Rel* relTab =
    239       reinterpret_cast<const llvm::ELF::Elf32_Rel*>(pRegion.begin());
    240 
    241   for (size_t idx = 0; idx < entsize; ++idx) {
    242     Relocation::Type r_type = 0x0;
    243     uint32_t r_sym = 0x0;
    244     uint32_t r_offset = 0x0;
    245 
    246     if (!target().readRelocation(relTab[idx], r_type, r_sym, r_offset))
    247       return false;
    248 
    249     LDSymbol* symbol = pInput.context()->getSymbol(r_sym);
    250     if (symbol == NULL) {
    251       fatal(diag::err_cannot_read_symbol) << r_sym << pInput.path();
    252     }
    253 
    254     IRBuilder::AddRelocation(pSection, r_type, *symbol, r_offset);
    255   }  // end of for
    256   return true;
    257 }
    258 
    259 /// isMyEndian - is this ELF file in the same endian to me?
    260 bool ELFReader<32, true>::isMyEndian(const void* pELFHeader) const {
    261   const llvm::ELF::Elf32_Ehdr* hdr =
    262       reinterpret_cast<const llvm::ELF::Elf32_Ehdr*>(pELFHeader);
    263 
    264   return (hdr->e_ident[llvm::ELF::EI_DATA] == llvm::ELF::ELFDATA2LSB);
    265 }
    266 
    267 /// isMyMachine - is this ELF file generated for the same machine.
    268 bool ELFReader<32, true>::isMyMachine(const void* pELFHeader) const {
    269   const llvm::ELF::Elf32_Ehdr* hdr =
    270       reinterpret_cast<const llvm::ELF::Elf32_Ehdr*>(pELFHeader);
    271 
    272   if (llvm::sys::IsLittleEndianHost)
    273     return (hdr->e_machine == target().getInfo().machine());
    274   return (mcld::bswap16(hdr->e_machine) == target().getInfo().machine());
    275 }
    276 
    277 /// fileType - return the file type
    278 Input::Type ELFReader<32, true>::fileType(const void* pELFHeader) const {
    279   const llvm::ELF::Elf32_Ehdr* hdr =
    280       reinterpret_cast<const llvm::ELF::Elf32_Ehdr*>(pELFHeader);
    281   uint32_t type = 0x0;
    282   if (llvm::sys::IsLittleEndianHost)
    283     type = hdr->e_type;
    284   else
    285     type = mcld::bswap16(hdr->e_type);
    286 
    287   switch (type) {
    288     case llvm::ELF::ET_REL:
    289       return Input::Object;
    290     case llvm::ELF::ET_EXEC:
    291       return Input::Exec;
    292     case llvm::ELF::ET_DYN:
    293       return Input::DynObj;
    294     case llvm::ELF::ET_CORE:
    295       return Input::CoreFile;
    296     case llvm::ELF::ET_NONE:
    297     default:
    298       return Input::Unknown;
    299   }
    300 }
    301 
    302 /// readSectionHeaders - read ELF section header table and create LDSections
    303 bool ELFReader<32, true>::readSectionHeaders(Input& pInput,
    304                                              const void* pELFHeader) const {
    305   const llvm::ELF::Elf32_Ehdr* ehdr =
    306       reinterpret_cast<const llvm::ELF::Elf32_Ehdr*>(pELFHeader);
    307 
    308   uint32_t shoff = 0x0;
    309   uint16_t shentsize = 0x0;
    310   uint32_t shnum = 0x0;
    311   uint32_t shstrtab = 0x0;
    312 
    313   if (llvm::sys::IsLittleEndianHost) {
    314     shoff = ehdr->e_shoff;
    315     shentsize = ehdr->e_shentsize;
    316     shnum = ehdr->e_shnum;
    317     shstrtab = ehdr->e_shstrndx;
    318   } else {
    319     shoff = mcld::bswap32(ehdr->e_shoff);
    320     shentsize = mcld::bswap16(ehdr->e_shentsize);
    321     shnum = mcld::bswap16(ehdr->e_shnum);
    322     shstrtab = mcld::bswap16(ehdr->e_shstrndx);
    323   }
    324 
    325   // If the file has no section header table, e_shoff holds zero.
    326   if (shoff == 0x0)
    327     return true;
    328 
    329   const llvm::ELF::Elf32_Shdr* shdr = NULL;
    330   llvm::StringRef shdr_region;
    331   uint32_t sh_name = 0x0;
    332   uint32_t sh_type = 0x0;
    333   uint32_t sh_flags = 0x0;
    334   uint32_t sh_offset = 0x0;
    335   uint32_t sh_size = 0x0;
    336   uint32_t sh_link = 0x0;
    337   uint32_t sh_info = 0x0;
    338   uint32_t sh_addralign = 0x0;
    339 
    340   // if shnum and shstrtab overflow, the actual values are in the 1st shdr
    341   if (shnum == llvm::ELF::SHN_UNDEF || shstrtab == llvm::ELF::SHN_XINDEX) {
    342     shdr_region =
    343         pInput.memArea()->request(pInput.fileOffset() + shoff, shentsize);
    344     shdr = reinterpret_cast<const llvm::ELF::Elf32_Shdr*>(shdr_region.begin());
    345 
    346     if (llvm::sys::IsLittleEndianHost) {
    347       sh_size = shdr->sh_size;
    348       sh_link = shdr->sh_link;
    349     } else {
    350       sh_size = mcld::bswap32(shdr->sh_size);
    351       sh_link = mcld::bswap32(shdr->sh_link);
    352     }
    353 
    354     if (shnum == llvm::ELF::SHN_UNDEF)
    355       shnum = sh_size;
    356     if (shstrtab == llvm::ELF::SHN_XINDEX)
    357       shstrtab = sh_link;
    358 
    359     shoff += shentsize;
    360   }
    361 
    362   shdr_region =
    363       pInput.memArea()->request(pInput.fileOffset() + shoff, shnum * shentsize);
    364   const llvm::ELF::Elf32_Shdr* shdrTab =
    365       reinterpret_cast<const llvm::ELF::Elf32_Shdr*>(shdr_region.begin());
    366 
    367   // get .shstrtab first
    368   shdr = &shdrTab[shstrtab];
    369   if (llvm::sys::IsLittleEndianHost) {
    370     sh_offset = shdr->sh_offset;
    371     sh_size = shdr->sh_size;
    372   } else {
    373     sh_offset = mcld::bswap32(shdr->sh_offset);
    374     sh_size = mcld::bswap32(shdr->sh_size);
    375   }
    376 
    377   llvm::StringRef sect_name_region =
    378       pInput.memArea()->request(pInput.fileOffset() + sh_offset, sh_size);
    379   const char* sect_name = sect_name_region.begin();
    380 
    381   LinkInfoList link_info_list;
    382 
    383   // create all LDSections, including first NULL section.
    384   for (size_t idx = 0; idx < shnum; ++idx) {
    385     if (llvm::sys::IsLittleEndianHost) {
    386       sh_name = shdrTab[idx].sh_name;
    387       sh_type = shdrTab[idx].sh_type;
    388       sh_flags = shdrTab[idx].sh_flags;
    389       sh_offset = shdrTab[idx].sh_offset;
    390       sh_size = shdrTab[idx].sh_size;
    391       sh_link = shdrTab[idx].sh_link;
    392       sh_info = shdrTab[idx].sh_info;
    393       sh_addralign = shdrTab[idx].sh_addralign;
    394     } else {
    395       sh_name = mcld::bswap32(shdrTab[idx].sh_name);
    396       sh_type = mcld::bswap32(shdrTab[idx].sh_type);
    397       sh_flags = mcld::bswap32(shdrTab[idx].sh_flags);
    398       sh_offset = mcld::bswap32(shdrTab[idx].sh_offset);
    399       sh_size = mcld::bswap32(shdrTab[idx].sh_size);
    400       sh_link = mcld::bswap32(shdrTab[idx].sh_link);
    401       sh_info = mcld::bswap32(shdrTab[idx].sh_info);
    402       sh_addralign = mcld::bswap32(shdrTab[idx].sh_addralign);
    403     }
    404 
    405     LDSection* section = IRBuilder::CreateELFHeader(
    406         pInput, sect_name + sh_name, sh_type, sh_flags, sh_addralign);
    407     section->setSize(sh_size);
    408     section->setOffset(sh_offset);
    409     section->setInfo(sh_info);
    410 
    411     if (sh_link != 0x0 || sh_info != 0x0) {
    412       LinkInfo link_info = {section, sh_link, sh_info};
    413       link_info_list.push_back(link_info);
    414     }
    415   }  // end of for
    416 
    417   // set up InfoLink
    418   LinkInfoList::iterator info, infoEnd = link_info_list.end();
    419   for (info = link_info_list.begin(); info != infoEnd; ++info) {
    420     if (LDFileFormat::Relocation == info->section->kind())
    421       info->section->setLink(pInput.context()->getSection(info->sh_info));
    422     else
    423       info->section->setLink(pInput.context()->getSection(info->sh_link));
    424   }
    425 
    426   return true;
    427 }
    428 
    429 /// readSignature - read a symbol from the given Input and index in symtab
    430 /// This is used to get the signature of a group section.
    431 ResolveInfo* ELFReader<32, true>::readSignature(Input& pInput,
    432                                                 LDSection& pSymTab,
    433                                                 uint32_t pSymIdx) const {
    434   LDSection* symtab = &pSymTab;
    435   LDSection* strtab = symtab->getLink();
    436   assert(symtab != NULL && strtab != NULL);
    437 
    438   uint32_t offset = pInput.fileOffset() + symtab->offset() +
    439                     sizeof(llvm::ELF::Elf32_Sym) * pSymIdx;
    440   llvm::StringRef symbol_region =
    441       pInput.memArea()->request(offset, sizeof(llvm::ELF::Elf32_Sym));
    442   const llvm::ELF::Elf32_Sym* entry =
    443       reinterpret_cast<const llvm::ELF::Elf32_Sym*>(symbol_region.begin());
    444 
    445   uint32_t st_name = 0x0;
    446   uint8_t st_info = 0x0;
    447   uint8_t st_other = 0x0;
    448   uint16_t st_shndx = 0x0;
    449   st_info = entry->st_info;
    450   st_other = entry->st_other;
    451   if (llvm::sys::IsLittleEndianHost) {
    452     st_name = entry->st_name;
    453     st_shndx = entry->st_shndx;
    454   } else {
    455     st_name = mcld::bswap32(entry->st_name);
    456     st_shndx = mcld::bswap16(entry->st_shndx);
    457   }
    458 
    459   llvm::StringRef strtab_region = pInput.memArea()->request(
    460       pInput.fileOffset() + strtab->offset(), strtab->size());
    461 
    462   // get ld_name
    463   llvm::StringRef ld_name(strtab_region.begin() + st_name);
    464 
    465   ResolveInfo* result = ResolveInfo::Create(ld_name);
    466   result->setSource(pInput.type() == Input::DynObj);
    467   result->setType(static_cast<ResolveInfo::Type>(st_info & 0xF));
    468   result->setDesc(getSymDesc(st_shndx, pInput));
    469   result->setBinding(getSymBinding((st_info >> 4), st_shndx, st_other));
    470   result->setVisibility(getSymVisibility(st_other));
    471 
    472   return result;
    473 }
    474 
    475 /// readDynamic - read ELF .dynamic in input dynobj
    476 bool ELFReader<32, true>::readDynamic(Input& pInput) const {
    477   assert(pInput.type() == Input::DynObj);
    478   const LDSection* dynamic_sect = pInput.context()->getSection(".dynamic");
    479   if (dynamic_sect == NULL) {
    480     fatal(diag::err_cannot_read_section) << ".dynamic";
    481   }
    482   const LDSection* dynstr_sect = dynamic_sect->getLink();
    483   if (dynstr_sect == NULL) {
    484     fatal(diag::err_cannot_read_section) << ".dynstr";
    485   }
    486 
    487   llvm::StringRef dynamic_region = pInput.memArea()->request(
    488       pInput.fileOffset() + dynamic_sect->offset(), dynamic_sect->size());
    489 
    490   llvm::StringRef dynstr_region = pInput.memArea()->request(
    491       pInput.fileOffset() + dynstr_sect->offset(), dynstr_sect->size());
    492 
    493   const llvm::ELF::Elf32_Dyn* dynamic =
    494       reinterpret_cast<const llvm::ELF::Elf32_Dyn*>(dynamic_region.begin());
    495   const char* dynstr = dynstr_region.begin();
    496   bool hasSOName = false;
    497   size_t numOfEntries = dynamic_sect->size() / sizeof(llvm::ELF::Elf32_Dyn);
    498 
    499   for (size_t idx = 0; idx < numOfEntries; ++idx) {
    500     llvm::ELF::Elf32_Sword d_tag = 0x0;
    501     llvm::ELF::Elf32_Word d_val = 0x0;
    502 
    503     if (llvm::sys::IsLittleEndianHost) {
    504       d_tag = dynamic[idx].d_tag;
    505       d_val = dynamic[idx].d_un.d_val;
    506     } else {
    507       d_tag = mcld::bswap32(dynamic[idx].d_tag);
    508       d_val = mcld::bswap32(dynamic[idx].d_un.d_val);
    509     }
    510 
    511     switch (d_tag) {
    512       case llvm::ELF::DT_SONAME:
    513         assert(d_val < dynstr_sect->size());
    514         pInput.setName(sys::fs::Path(dynstr + d_val).filename().native());
    515         hasSOName = true;
    516         break;
    517       case llvm::ELF::DT_NEEDED:
    518         // TODO:
    519         break;
    520       case llvm::ELF::DT_NULL:
    521       default:
    522         break;
    523     }
    524   }
    525 
    526   // if there is no SONAME in .dynamic, then set it from input path
    527   if (!hasSOName)
    528     pInput.setName(pInput.path().filename().native());
    529 
    530   return true;
    531 }
    532 
    533 //===----------------------------------------------------------------------===//
    534 // ELFReader<64, true>
    535 //===----------------------------------------------------------------------===//
    536 /// constructor
    537 ELFReader<64, true>::ELFReader(GNULDBackend& pBackend) : ELFReaderIF(pBackend) {
    538 }
    539 
    540 /// destructor
    541 ELFReader<64, true>::~ELFReader() {
    542 }
    543 
    544 /// isELF - is this a ELF file
    545 bool ELFReader<64, true>::isELF(const void* pELFHeader) const {
    546   const llvm::ELF::Elf64_Ehdr* hdr =
    547       reinterpret_cast<const llvm::ELF::Elf64_Ehdr*>(pELFHeader);
    548   if (memcmp(llvm::ELF::ElfMagic, hdr, 4) == 0)
    549     return true;
    550   return false;
    551 }
    552 
    553 /// readRegularSection - read a regular section and create fragments.
    554 bool ELFReader<64, true>::readRegularSection(Input& pInput,
    555                                              SectionData& pSD) const {
    556   uint64_t offset = pInput.fileOffset() + pSD.getSection().offset();
    557   uint64_t size = pSD.getSection().size();
    558 
    559   Fragment* frag = IRBuilder::CreateRegion(pInput, offset, size);
    560   ObjectBuilder::AppendFragment(*frag, pSD);
    561   return true;
    562 }
    563 
    564 /// readSymbols - read ELF symbols and create LDSymbol
    565 bool ELFReader<64, true>::readSymbols(Input& pInput,
    566                                       IRBuilder& pBuilder,
    567                                       llvm::StringRef pRegion,
    568                                       const char* pStrTab) const {
    569   // get number of symbols
    570   size_t entsize = pRegion.size() / sizeof(llvm::ELF::Elf64_Sym);
    571   const llvm::ELF::Elf64_Sym* symtab =
    572       reinterpret_cast<const llvm::ELF::Elf64_Sym*>(pRegion.begin());
    573 
    574   uint32_t st_name = 0x0;
    575   uint64_t st_value = 0x0;
    576   uint64_t st_size = 0x0;
    577   uint8_t st_info = 0x0;
    578   uint8_t st_other = 0x0;
    579   uint16_t st_shndx = 0x0;
    580 
    581   // skip the first NULL symbol
    582   pInput.context()->addSymbol(LDSymbol::Null());
    583 
    584   /// recording symbols added from DynObj to analyze weak alias
    585   std::vector<AliasInfo> potential_aliases;
    586   bool is_dyn_obj = (pInput.type() == Input::DynObj);
    587   for (size_t idx = 1; idx < entsize; ++idx) {
    588     st_info = symtab[idx].st_info;
    589     st_other = symtab[idx].st_other;
    590 
    591     if (llvm::sys::IsLittleEndianHost) {
    592       st_name = symtab[idx].st_name;
    593       st_value = symtab[idx].st_value;
    594       st_size = symtab[idx].st_size;
    595       st_shndx = symtab[idx].st_shndx;
    596     } else {
    597       st_name = mcld::bswap32(symtab[idx].st_name);
    598       st_value = mcld::bswap64(symtab[idx].st_value);
    599       st_size = mcld::bswap64(symtab[idx].st_size);
    600       st_shndx = mcld::bswap16(symtab[idx].st_shndx);
    601     }
    602 
    603     // If the section should not be included, set the st_shndx SHN_UNDEF
    604     // - A section in interrelated groups are not included.
    605     if (pInput.type() == Input::Object && st_shndx < llvm::ELF::SHN_LORESERVE &&
    606         st_shndx != llvm::ELF::SHN_UNDEF) {
    607       if (pInput.context()->getSection(st_shndx) == NULL)
    608         st_shndx = llvm::ELF::SHN_UNDEF;
    609     }
    610 
    611     // get ld_type
    612     ResolveInfo::Type ld_type = getSymType(st_info, st_shndx);
    613 
    614     // get ld_desc
    615     ResolveInfo::Desc ld_desc = getSymDesc(st_shndx, pInput);
    616 
    617     // get ld_binding
    618     ResolveInfo::Binding ld_binding =
    619         getSymBinding((st_info >> 4), st_shndx, st_other);
    620 
    621     // get ld_value - ld_value must be section relative.
    622     uint64_t ld_value = getSymValue(st_value, st_shndx, pInput);
    623 
    624     // get ld_vis
    625     ResolveInfo::Visibility ld_vis = getSymVisibility(st_other);
    626 
    627     // get section
    628     LDSection* section = NULL;
    629     if (st_shndx < llvm::ELF::SHN_LORESERVE)  // including ABS and COMMON
    630       section = pInput.context()->getSection(st_shndx);
    631 
    632     // get ld_name
    633     std::string ld_name;
    634     if (ResolveInfo::Section == ld_type) {
    635       // Section symbol's st_name is the section index.
    636       assert(section != NULL && "get a invalid section");
    637       ld_name = section->name();
    638     } else {
    639       ld_name = std::string(pStrTab + st_name);
    640     }
    641 
    642     LDSymbol* psym = pBuilder.AddSymbol(pInput,
    643                                         ld_name,
    644                                         ld_type,
    645                                         ld_desc,
    646                                         ld_binding,
    647                                         st_size,
    648                                         ld_value,
    649                                         section,
    650                                         ld_vis);
    651 
    652     if (is_dyn_obj && psym != NULL && ResolveInfo::Undefined != ld_desc &&
    653         (ResolveInfo::Global == ld_binding ||
    654          ResolveInfo::Weak == ld_binding) &&
    655         ResolveInfo::Object == ld_type) {
    656       AliasInfo p;
    657       p.pt_alias = psym;
    658       p.ld_binding = ld_binding;
    659       p.ld_value = ld_value;
    660       potential_aliases.push_back(p);
    661     }
    662   }  // end of for loop
    663 
    664   // analyze weak alias here
    665   if (is_dyn_obj) {
    666     // sort symbols by symbol value and then weak before strong
    667     std::sort(potential_aliases.begin(), potential_aliases.end(), less);
    668 
    669     // for each weak symbol, find out all its aliases, and
    670     // then link them as a circular list in Module
    671     std::vector<AliasInfo>::iterator sym_it, sym_e;
    672     sym_e = potential_aliases.end();
    673     for (sym_it = potential_aliases.begin(); sym_it != sym_e; ++sym_it) {
    674       if (ResolveInfo::Weak != sym_it->ld_binding)
    675         continue;
    676 
    677       Module& pModule = pBuilder.getModule();
    678       std::vector<AliasInfo>::iterator alias_it = sym_it + 1;
    679       while (alias_it != sym_e) {
    680         if (sym_it->ld_value != alias_it->ld_value)
    681           break;
    682 
    683         if (sym_it + 1 == alias_it)
    684           pModule.CreateAliasList(*sym_it->pt_alias->resolveInfo());
    685         pModule.addAlias(*alias_it->pt_alias->resolveInfo());
    686         ++alias_it;
    687       }
    688 
    689       sym_it = alias_it - 1;
    690     }  // end of for loop
    691   }
    692   return true;
    693 }
    694 
    695 //===----------------------------------------------------------------------===//
    696 // ELFReader::read relocations - read ELF rela and rel, and create Relocation
    697 //===----------------------------------------------------------------------===//
    698 /// ELFReader::readRela - read ELF rela and create Relocation
    699 bool ELFReader<64, true>::readRela(Input& pInput,
    700                                    LDSection& pSection,
    701                                    llvm::StringRef pRegion) const {
    702   // get the number of rela
    703   size_t entsize = pRegion.size() / sizeof(llvm::ELF::Elf64_Rela);
    704   const llvm::ELF::Elf64_Rela* relaTab =
    705       reinterpret_cast<const llvm::ELF::Elf64_Rela*>(pRegion.begin());
    706 
    707   for (size_t idx = 0; idx < entsize; ++idx) {
    708     Relocation::Type r_type = 0x0;
    709     uint32_t r_sym = 0x0;
    710     uint64_t r_offset = 0x0;
    711     int64_t r_addend = 0;
    712     if (!target()
    713              .readRelocation(relaTab[idx], r_type, r_sym, r_offset, r_addend)) {
    714       return false;
    715     }
    716 
    717     LDSymbol* symbol = pInput.context()->getSymbol(r_sym);
    718     if (symbol == NULL) {
    719       fatal(diag::err_cannot_read_symbol) << r_sym << pInput.path();
    720     }
    721 
    722     IRBuilder::AddRelocation(pSection, r_type, *symbol, r_offset, r_addend);
    723   }  // end of for
    724   return true;
    725 }
    726 
    727 /// readRel - read ELF rel and create Relocation
    728 bool ELFReader<64, true>::readRel(Input& pInput,
    729                                   LDSection& pSection,
    730                                   llvm::StringRef pRegion) const {
    731   // get the number of rel
    732   size_t entsize = pRegion.size() / sizeof(llvm::ELF::Elf64_Rel);
    733   const llvm::ELF::Elf64_Rel* relTab =
    734       reinterpret_cast<const llvm::ELF::Elf64_Rel*>(pRegion.begin());
    735 
    736   for (size_t idx = 0; idx < entsize; ++idx) {
    737     Relocation::Type r_type = 0x0;
    738     uint32_t r_sym = 0x0;
    739     uint64_t r_offset = 0x0;
    740     if (!target().readRelocation(relTab[idx], r_type, r_sym, r_offset))
    741       return false;
    742 
    743     LDSymbol* symbol = pInput.context()->getSymbol(r_sym);
    744     if (symbol == NULL) {
    745       fatal(diag::err_cannot_read_symbol) << r_sym << pInput.path();
    746     }
    747 
    748     IRBuilder::AddRelocation(pSection, r_type, *symbol, r_offset);
    749   }  // end of for
    750   return true;
    751 }
    752 
    753 /// isMyEndian - is this ELF file in the same endian to me?
    754 bool ELFReader<64, true>::isMyEndian(const void* pELFHeader) const {
    755   const llvm::ELF::Elf64_Ehdr* hdr =
    756       reinterpret_cast<const llvm::ELF::Elf64_Ehdr*>(pELFHeader);
    757 
    758   return (hdr->e_ident[llvm::ELF::EI_DATA] == llvm::ELF::ELFDATA2LSB);
    759 }
    760 
    761 /// isMyMachine - is this ELF file generated for the same machine.
    762 bool ELFReader<64, true>::isMyMachine(const void* pELFHeader) const {
    763   const llvm::ELF::Elf64_Ehdr* hdr =
    764       reinterpret_cast<const llvm::ELF::Elf64_Ehdr*>(pELFHeader);
    765 
    766   if (llvm::sys::IsLittleEndianHost)
    767     return (hdr->e_machine == target().getInfo().machine());
    768   return (mcld::bswap16(hdr->e_machine) == target().getInfo().machine());
    769 }
    770 
    771 /// fileType - return the file type
    772 Input::Type ELFReader<64, true>::fileType(const void* pELFHeader) const {
    773   const llvm::ELF::Elf64_Ehdr* hdr =
    774       reinterpret_cast<const llvm::ELF::Elf64_Ehdr*>(pELFHeader);
    775   uint32_t type = 0x0;
    776   if (llvm::sys::IsLittleEndianHost)
    777     type = hdr->e_type;
    778   else
    779     type = mcld::bswap16(hdr->e_type);
    780 
    781   switch (type) {
    782     case llvm::ELF::ET_REL:
    783       return Input::Object;
    784     case llvm::ELF::ET_EXEC:
    785       return Input::Exec;
    786     case llvm::ELF::ET_DYN:
    787       return Input::DynObj;
    788     case llvm::ELF::ET_CORE:
    789       return Input::CoreFile;
    790     case llvm::ELF::ET_NONE:
    791     default:
    792       return Input::Unknown;
    793   }
    794 }
    795 
    796 /// readSectionHeaders - read ELF section header table and create LDSections
    797 bool ELFReader<64, true>::readSectionHeaders(Input& pInput,
    798                                              const void* pELFHeader) const {
    799   const llvm::ELF::Elf64_Ehdr* ehdr =
    800       reinterpret_cast<const llvm::ELF::Elf64_Ehdr*>(pELFHeader);
    801 
    802   uint64_t shoff = 0x0;
    803   uint16_t shentsize = 0x0;
    804   uint32_t shnum = 0x0;
    805   uint32_t shstrtab = 0x0;
    806 
    807   if (llvm::sys::IsLittleEndianHost) {
    808     shoff = ehdr->e_shoff;
    809     shentsize = ehdr->e_shentsize;
    810     shnum = ehdr->e_shnum;
    811     shstrtab = ehdr->e_shstrndx;
    812   } else {
    813     shoff = mcld::bswap64(ehdr->e_shoff);
    814     shentsize = mcld::bswap16(ehdr->e_shentsize);
    815     shnum = mcld::bswap16(ehdr->e_shnum);
    816     shstrtab = mcld::bswap16(ehdr->e_shstrndx);
    817   }
    818 
    819   // If the file has no section header table, e_shoff holds zero.
    820   if (shoff == 0x0)
    821     return true;
    822 
    823   const llvm::ELF::Elf64_Shdr* shdr = NULL;
    824   llvm::StringRef shdr_region;
    825   uint32_t sh_name = 0x0;
    826   uint32_t sh_type = 0x0;
    827   uint64_t sh_flags = 0x0;
    828   uint64_t sh_offset = 0x0;
    829   uint64_t sh_size = 0x0;
    830   uint32_t sh_link = 0x0;
    831   uint32_t sh_info = 0x0;
    832   uint64_t sh_addralign = 0x0;
    833 
    834   // if shnum and shstrtab overflow, the actual values are in the 1st shdr
    835   if (shnum == llvm::ELF::SHN_UNDEF || shstrtab == llvm::ELF::SHN_XINDEX) {
    836     shdr_region =
    837         pInput.memArea()->request(pInput.fileOffset() + shoff, shentsize);
    838     shdr = reinterpret_cast<const llvm::ELF::Elf64_Shdr*>(shdr_region.begin());
    839 
    840     if (llvm::sys::IsLittleEndianHost) {
    841       sh_size = shdr->sh_size;
    842       sh_link = shdr->sh_link;
    843     } else {
    844       sh_size = mcld::bswap64(shdr->sh_size);
    845       sh_link = mcld::bswap32(shdr->sh_link);
    846     }
    847 
    848     if (shnum == llvm::ELF::SHN_UNDEF)
    849       shnum = sh_size;
    850     if (shstrtab == llvm::ELF::SHN_XINDEX)
    851       shstrtab = sh_link;
    852 
    853     shoff += shentsize;
    854   }
    855 
    856   shdr_region =
    857       pInput.memArea()->request(pInput.fileOffset() + shoff, shnum * shentsize);
    858   const llvm::ELF::Elf64_Shdr* shdrTab =
    859       reinterpret_cast<const llvm::ELF::Elf64_Shdr*>(shdr_region.begin());
    860 
    861   // get .shstrtab first
    862   shdr = &shdrTab[shstrtab];
    863   if (llvm::sys::IsLittleEndianHost) {
    864     sh_offset = shdr->sh_offset;
    865     sh_size = shdr->sh_size;
    866   } else {
    867     sh_offset = mcld::bswap64(shdr->sh_offset);
    868     sh_size = mcld::bswap64(shdr->sh_size);
    869   }
    870 
    871   llvm::StringRef sect_name_region =
    872       pInput.memArea()->request(pInput.fileOffset() + sh_offset, sh_size);
    873   const char* sect_name = sect_name_region.begin();
    874 
    875   LinkInfoList link_info_list;
    876 
    877   // create all LDSections, including first NULL section.
    878   for (size_t idx = 0; idx < shnum; ++idx) {
    879     if (llvm::sys::IsLittleEndianHost) {
    880       sh_name = shdrTab[idx].sh_name;
    881       sh_type = shdrTab[idx].sh_type;
    882       sh_flags = shdrTab[idx].sh_flags;
    883       sh_offset = shdrTab[idx].sh_offset;
    884       sh_size = shdrTab[idx].sh_size;
    885       sh_link = shdrTab[idx].sh_link;
    886       sh_info = shdrTab[idx].sh_info;
    887       sh_addralign = shdrTab[idx].sh_addralign;
    888     } else {
    889       sh_name = mcld::bswap32(shdrTab[idx].sh_name);
    890       sh_type = mcld::bswap32(shdrTab[idx].sh_type);
    891       sh_flags = mcld::bswap64(shdrTab[idx].sh_flags);
    892       sh_offset = mcld::bswap64(shdrTab[idx].sh_offset);
    893       sh_size = mcld::bswap64(shdrTab[idx].sh_size);
    894       sh_link = mcld::bswap32(shdrTab[idx].sh_link);
    895       sh_info = mcld::bswap32(shdrTab[idx].sh_info);
    896       sh_addralign = mcld::bswap64(shdrTab[idx].sh_addralign);
    897     }
    898 
    899     LDSection* section = IRBuilder::CreateELFHeader(
    900         pInput, sect_name + sh_name, sh_type, sh_flags, sh_addralign);
    901     section->setSize(sh_size);
    902     section->setOffset(sh_offset);
    903     section->setInfo(sh_info);
    904 
    905     if (sh_link != 0x0 || sh_info != 0x0) {
    906       LinkInfo link_info = {section, sh_link, sh_info};
    907       link_info_list.push_back(link_info);
    908     }
    909   }  // end of for
    910 
    911   // set up InfoLink
    912   LinkInfoList::iterator info, infoEnd = link_info_list.end();
    913   for (info = link_info_list.begin(); info != infoEnd; ++info) {
    914     if (LDFileFormat::Relocation == info->section->kind())
    915       info->section->setLink(pInput.context()->getSection(info->sh_info));
    916     else
    917       info->section->setLink(pInput.context()->getSection(info->sh_link));
    918   }
    919 
    920   return true;
    921 }
    922 
    923 /// readSignature - read a symbol from the given Input and index in symtab
    924 /// This is used to get the signature of a group section.
    925 ResolveInfo* ELFReader<64, true>::readSignature(Input& pInput,
    926                                                 LDSection& pSymTab,
    927                                                 uint32_t pSymIdx) const {
    928   LDSection* symtab = &pSymTab;
    929   LDSection* strtab = symtab->getLink();
    930   assert(symtab != NULL && strtab != NULL);
    931 
    932   uint64_t offset = pInput.fileOffset() + symtab->offset() +
    933                     sizeof(llvm::ELF::Elf64_Sym) * pSymIdx;
    934   llvm::StringRef symbol_region =
    935       pInput.memArea()->request(offset, sizeof(llvm::ELF::Elf64_Sym));
    936   const llvm::ELF::Elf64_Sym* entry =
    937       reinterpret_cast<const llvm::ELF::Elf64_Sym*>(symbol_region.begin());
    938 
    939   uint32_t st_name = 0x0;
    940   uint8_t st_info = 0x0;
    941   uint8_t st_other = 0x0;
    942   uint16_t st_shndx = 0x0;
    943   st_info = entry->st_info;
    944   st_other = entry->st_other;
    945   if (llvm::sys::IsLittleEndianHost) {
    946     st_name = entry->st_name;
    947     st_shndx = entry->st_shndx;
    948   } else {
    949     st_name = mcld::bswap32(entry->st_name);
    950     st_shndx = mcld::bswap16(entry->st_shndx);
    951   }
    952 
    953   llvm::StringRef strtab_region = pInput.memArea()->request(
    954       pInput.fileOffset() + strtab->offset(), strtab->size());
    955 
    956   // get ld_name
    957   llvm::StringRef ld_name(strtab_region.begin() + st_name);
    958 
    959   ResolveInfo* result = ResolveInfo::Create(ld_name);
    960   result->setSource(pInput.type() == Input::DynObj);
    961   result->setType(static_cast<ResolveInfo::Type>(st_info & 0xF));
    962   result->setDesc(getSymDesc(st_shndx, pInput));
    963   result->setBinding(getSymBinding((st_info >> 4), st_shndx, st_other));
    964   result->setVisibility(getSymVisibility(st_other));
    965 
    966   return result;
    967 }
    968 
    969 /// readDynamic - read ELF .dynamic in input dynobj
    970 bool ELFReader<64, true>::readDynamic(Input& pInput) const {
    971   assert(pInput.type() == Input::DynObj);
    972   const LDSection* dynamic_sect = pInput.context()->getSection(".dynamic");
    973   if (dynamic_sect == NULL) {
    974     fatal(diag::err_cannot_read_section) << ".dynamic";
    975   }
    976   const LDSection* dynstr_sect = dynamic_sect->getLink();
    977   if (dynstr_sect == NULL) {
    978     fatal(diag::err_cannot_read_section) << ".dynstr";
    979   }
    980 
    981   llvm::StringRef dynamic_region = pInput.memArea()->request(
    982       pInput.fileOffset() + dynamic_sect->offset(), dynamic_sect->size());
    983 
    984   llvm::StringRef dynstr_region = pInput.memArea()->request(
    985       pInput.fileOffset() + dynstr_sect->offset(), dynstr_sect->size());
    986 
    987   const llvm::ELF::Elf64_Dyn* dynamic =
    988       reinterpret_cast<const llvm::ELF::Elf64_Dyn*>(dynamic_region.begin());
    989   const char* dynstr = dynstr_region.begin();
    990   bool hasSOName = false;
    991   size_t numOfEntries = dynamic_sect->size() / sizeof(llvm::ELF::Elf64_Dyn);
    992 
    993   for (size_t idx = 0; idx < numOfEntries; ++idx) {
    994     llvm::ELF::Elf64_Sxword d_tag = 0x0;
    995     llvm::ELF::Elf64_Xword d_val = 0x0;
    996 
    997     if (llvm::sys::IsLittleEndianHost) {
    998       d_tag = dynamic[idx].d_tag;
    999       d_val = dynamic[idx].d_un.d_val;
   1000     } else {
   1001       d_tag = mcld::bswap64(dynamic[idx].d_tag);
   1002       d_val = mcld::bswap64(dynamic[idx].d_un.d_val);
   1003     }
   1004 
   1005     switch (d_tag) {
   1006       case llvm::ELF::DT_SONAME:
   1007         assert(d_val < dynstr_sect->size());
   1008         pInput.setName(sys::fs::Path(dynstr + d_val).filename().native());
   1009         hasSOName = true;
   1010         break;
   1011       case llvm::ELF::DT_NEEDED:
   1012         // TODO:
   1013         break;
   1014       case llvm::ELF::DT_NULL:
   1015       default:
   1016         break;
   1017     }
   1018   }
   1019 
   1020   // if there is no SONAME in .dynamic, then set it from input path
   1021   if (!hasSOName)
   1022     pInput.setName(pInput.path().filename().native());
   1023 
   1024   return true;
   1025 }
   1026 
   1027 }  // namespace mcld
   1028