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