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