1 //===- GNULDBackend.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/Target/GNULDBackend.h" 10 11 #include "mcld/IRBuilder.h" 12 #include "mcld/InputTree.h" 13 #include "mcld/LinkerConfig.h" 14 #include "mcld/LinkerScript.h" 15 #include "mcld/Module.h" 16 #include "mcld/ADT/SizeTraits.h" 17 #include "mcld/Config/Config.h" 18 #include "mcld/Fragment/FillFragment.h" 19 #include "mcld/LD/BranchIslandFactory.h" 20 #include "mcld/LD/EhFrame.h" 21 #include "mcld/LD/EhFrameHdr.h" 22 #include "mcld/LD/ELFDynObjFileFormat.h" 23 #include "mcld/LD/ELFExecFileFormat.h" 24 #include "mcld/LD/ELFFileFormat.h" 25 #include "mcld/LD/ELFObjectFileFormat.h" 26 #include "mcld/LD/ELFSegment.h" 27 #include "mcld/LD/ELFSegmentFactory.h" 28 #include "mcld/LD/LDContext.h" 29 #include "mcld/LD/LDSymbol.h" 30 #include "mcld/LD/RelocData.h" 31 #include "mcld/LD/RelocationFactory.h" 32 #include "mcld/LD/StubFactory.h" 33 #include "mcld/MC/Attribute.h" 34 #include "mcld/Object/ObjectBuilder.h" 35 #include "mcld/Object/SectionMap.h" 36 #include "mcld/Script/Operand.h" 37 #include "mcld/Script/OutputSectDesc.h" 38 #include "mcld/Script/RpnEvaluator.h" 39 #include "mcld/Support/FileOutputBuffer.h" 40 #include "mcld/Support/MsgHandling.h" 41 #include "mcld/Target/ELFAttribute.h" 42 #include "mcld/Target/ELFDynamic.h" 43 #include "mcld/Target/GNUInfo.h" 44 45 #include <llvm/ADT/StringRef.h> 46 #include <llvm/Support/Host.h> 47 48 #include <algorithm> 49 #include <cstring> 50 #include <cassert> 51 #include <map> 52 #include <string> 53 #include <vector> 54 55 namespace { 56 57 //===----------------------------------------------------------------------===// 58 // non-member functions 59 //===----------------------------------------------------------------------===// 60 static const std::string simple_c_identifier_allowed_chars = 61 "0123456789" 62 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 63 "abcdefghijklmnopqrstuvwxyz" 64 "_"; 65 66 /// isCIdentifier - return if the pName is a valid C identifier 67 static bool isCIdentifier(const std::string& pName) { 68 return (pName.find_first_not_of(simple_c_identifier_allowed_chars) == 69 std::string::npos); 70 } 71 72 } // anonymous namespace 73 74 namespace mcld { 75 76 //===----------------------------------------------------------------------===// 77 // GNULDBackend 78 //===----------------------------------------------------------------------===// 79 GNULDBackend::GNULDBackend(const LinkerConfig& pConfig, GNUInfo* pInfo) 80 : TargetLDBackend(pConfig), 81 m_pObjectReader(NULL), 82 m_pDynObjFileFormat(NULL), 83 m_pExecFileFormat(NULL), 84 m_pObjectFileFormat(NULL), 85 m_pInfo(pInfo), 86 m_pELFSegmentTable(NULL), 87 m_pBRIslandFactory(NULL), 88 m_pStubFactory(NULL), 89 m_pEhFrameHdr(NULL), 90 m_pAttribute(NULL), 91 m_bHasTextRel(false), 92 m_bHasStaticTLS(false), 93 f_pPreInitArrayStart(NULL), 94 f_pPreInitArrayEnd(NULL), 95 f_pInitArrayStart(NULL), 96 f_pInitArrayEnd(NULL), 97 f_pFiniArrayStart(NULL), 98 f_pFiniArrayEnd(NULL), 99 f_pStack(NULL), 100 f_pDynamic(NULL), 101 f_pTDATA(NULL), 102 f_pTBSS(NULL), 103 f_pExecutableStart(NULL), 104 f_pEText(NULL), 105 f_p_EText(NULL), 106 f_p__EText(NULL), 107 f_pEData(NULL), 108 f_p_EData(NULL), 109 f_pBSSStart(NULL), 110 f_pEnd(NULL), 111 f_p_End(NULL) { 112 m_pELFSegmentTable = new ELFSegmentFactory(); 113 m_pSymIndexMap = new HashTableType(1024); 114 m_pAttribute = new ELFAttribute(*this, pConfig); 115 } 116 117 GNULDBackend::~GNULDBackend() { 118 delete m_pELFSegmentTable; 119 delete m_pInfo; 120 delete m_pDynObjFileFormat; 121 delete m_pExecFileFormat; 122 delete m_pObjectFileFormat; 123 delete m_pSymIndexMap; 124 delete m_pEhFrameHdr; 125 delete m_pAttribute; 126 delete m_pBRIslandFactory; 127 delete m_pStubFactory; 128 } 129 130 size_t GNULDBackend::sectionStartOffset() const { 131 if (LinkerConfig::Binary == config().codeGenType()) 132 return 0x0; 133 134 switch (config().targets().bitclass()) { 135 case 32u: 136 return sizeof(llvm::ELF::Elf32_Ehdr) + 137 elfSegmentTable().size() * sizeof(llvm::ELF::Elf32_Phdr); 138 case 64u: 139 return sizeof(llvm::ELF::Elf64_Ehdr) + 140 elfSegmentTable().size() * sizeof(llvm::ELF::Elf64_Phdr); 141 default: 142 fatal(diag::unsupported_bitclass) << config().targets().triple().str() 143 << config().targets().bitclass(); 144 return 0; 145 } 146 } 147 148 uint64_t GNULDBackend::getSegmentStartAddr(const LinkerScript& pScript) const { 149 LinkerScript::AddressMap::const_iterator mapping = 150 pScript.addressMap().find(".text"); 151 if (pScript.addressMap().end() != mapping) 152 return mapping.getEntry()->value(); 153 else if (config().isCodeIndep()) 154 return 0x0; 155 else 156 return m_pInfo->defaultTextSegmentAddr(); 157 } 158 159 GNUArchiveReader* GNULDBackend::createArchiveReader(Module& pModule) { 160 assert(m_pObjectReader != NULL); 161 return new GNUArchiveReader(pModule, *m_pObjectReader); 162 } 163 164 ELFObjectReader* GNULDBackend::createObjectReader(IRBuilder& pBuilder) { 165 m_pObjectReader = new ELFObjectReader(*this, pBuilder, config()); 166 return m_pObjectReader; 167 } 168 169 ELFDynObjReader* GNULDBackend::createDynObjReader(IRBuilder& pBuilder) { 170 return new ELFDynObjReader(*this, pBuilder, config()); 171 } 172 173 ELFBinaryReader* GNULDBackend::createBinaryReader(IRBuilder& pBuilder) { 174 return new ELFBinaryReader(pBuilder, config()); 175 } 176 177 ELFObjectWriter* GNULDBackend::createWriter() { 178 return new ELFObjectWriter(*this, config()); 179 } 180 181 bool GNULDBackend::initStdSections(ObjectBuilder& pBuilder) { 182 switch (config().codeGenType()) { 183 case LinkerConfig::DynObj: { 184 if (m_pDynObjFileFormat == NULL) 185 m_pDynObjFileFormat = new ELFDynObjFileFormat(); 186 m_pDynObjFileFormat->initStdSections(pBuilder, 187 config().targets().bitclass()); 188 return true; 189 } 190 case LinkerConfig::Exec: 191 case LinkerConfig::Binary: { 192 if (m_pExecFileFormat == NULL) 193 m_pExecFileFormat = new ELFExecFileFormat(); 194 m_pExecFileFormat->initStdSections(pBuilder, 195 config().targets().bitclass()); 196 return true; 197 } 198 case LinkerConfig::Object: { 199 if (m_pObjectFileFormat == NULL) 200 m_pObjectFileFormat = new ELFObjectFileFormat(); 201 m_pObjectFileFormat->initStdSections(pBuilder, 202 config().targets().bitclass()); 203 return true; 204 } 205 default: 206 fatal(diag::unrecognized_output_file) << config().codeGenType(); 207 return false; 208 } 209 } 210 211 /// initStandardSymbols - define and initialize standard symbols. 212 /// This function is called after section merging but before read relocations. 213 bool GNULDBackend::initStandardSymbols(IRBuilder& pBuilder, Module& pModule) { 214 if (LinkerConfig::Object == config().codeGenType()) 215 return true; 216 217 // GNU extension: define __start and __stop symbols for the sections whose 218 // name can be presented as C symbol 219 Module::iterator iter, iterEnd = pModule.end(); 220 for (iter = pModule.begin(); iter != iterEnd; ++iter) { 221 LDSection* section = *iter; 222 223 switch (section->kind()) { 224 case LDFileFormat::Relocation: 225 continue; 226 case LDFileFormat::EhFrame: 227 if (!section->hasEhFrame()) 228 continue; 229 break; 230 default: 231 if (!section->hasSectionData()) 232 continue; 233 break; 234 } // end of switch 235 236 if (isCIdentifier(section->name())) { 237 std::string start_name = "__start_" + section->name(); 238 FragmentRef* start_fragref = 239 FragmentRef::Create(section->getSectionData()->front(), 0x0); 240 241 pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 242 start_name, 243 ResolveInfo::NoType, 244 ResolveInfo::Define, 245 ResolveInfo::Global, 246 0x0, // size 247 0x0, // value 248 start_fragref, // FragRef 249 ResolveInfo::Default); 250 251 std::string stop_name = "__stop_" + section->name(); 252 FragmentRef* stop_fragref = FragmentRef::Create( 253 section->getSectionData()->front(), section->size()); 254 pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 255 stop_name, 256 ResolveInfo::NoType, 257 ResolveInfo::Define, 258 ResolveInfo::Global, 259 0x0, // size 260 0x0, // value 261 stop_fragref, // FragRef 262 ResolveInfo::Default); 263 } 264 } 265 266 ELFFileFormat* file_format = getOutputFormat(); 267 268 // ----- section symbols ----- // 269 // .preinit_array 270 FragmentRef* preinit_array = NULL; 271 if (file_format->hasPreInitArray()) { 272 preinit_array = FragmentRef::Create( 273 file_format->getPreInitArray().getSectionData()->front(), 0x0); 274 } else { 275 preinit_array = FragmentRef::Null(); 276 } 277 278 f_pPreInitArrayStart = 279 pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 280 "__preinit_array_start", 281 ResolveInfo::NoType, 282 ResolveInfo::Define, 283 ResolveInfo::Global, 284 0x0, // size 285 0x0, // value 286 preinit_array, // FragRef 287 ResolveInfo::Hidden); 288 289 f_pPreInitArrayEnd = 290 pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 291 "__preinit_array_end", 292 ResolveInfo::NoType, 293 ResolveInfo::Define, 294 ResolveInfo::Global, 295 0x0, // size 296 0x0, // value 297 FragmentRef::Null(), // FragRef 298 ResolveInfo::Hidden); 299 300 // .init_array 301 FragmentRef* init_array = NULL; 302 if (file_format->hasInitArray()) { 303 init_array = FragmentRef::Create( 304 file_format->getInitArray().getSectionData()->front(), 0x0); 305 } else { 306 init_array = FragmentRef::Null(); 307 } 308 309 f_pInitArrayStart = 310 pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 311 "__init_array_start", 312 ResolveInfo::NoType, 313 ResolveInfo::Define, 314 ResolveInfo::Global, 315 0x0, // size 316 0x0, // value 317 init_array, // FragRef 318 ResolveInfo::Hidden); 319 320 f_pInitArrayEnd = 321 pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 322 "__init_array_end", 323 ResolveInfo::NoType, 324 ResolveInfo::Define, 325 ResolveInfo::Global, 326 0x0, // size 327 0x0, // value 328 init_array, // FragRef 329 ResolveInfo::Hidden); 330 331 // .fini_array 332 FragmentRef* fini_array = NULL; 333 if (file_format->hasFiniArray()) { 334 fini_array = FragmentRef::Create( 335 file_format->getFiniArray().getSectionData()->front(), 0x0); 336 } else { 337 fini_array = FragmentRef::Null(); 338 } 339 340 f_pFiniArrayStart = 341 pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 342 "__fini_array_start", 343 ResolveInfo::NoType, 344 ResolveInfo::Define, 345 ResolveInfo::Global, 346 0x0, // size 347 0x0, // value 348 fini_array, // FragRef 349 ResolveInfo::Hidden); 350 351 f_pFiniArrayEnd = 352 pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 353 "__fini_array_end", 354 ResolveInfo::NoType, 355 ResolveInfo::Define, 356 ResolveInfo::Global, 357 0x0, // size 358 0x0, // value 359 fini_array, // FragRef 360 ResolveInfo::Hidden); 361 362 // .stack 363 FragmentRef* stack = NULL; 364 if (file_format->hasStack()) { 365 stack = FragmentRef::Create( 366 file_format->getStack().getSectionData()->front(), 0x0); 367 } else { 368 stack = FragmentRef::Null(); 369 } 370 371 f_pStack = pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 372 "__stack", 373 ResolveInfo::NoType, 374 ResolveInfo::Define, 375 ResolveInfo::Global, 376 0x0, // size 377 0x0, // value 378 stack, // FragRef 379 ResolveInfo::Hidden); 380 381 // _DYNAMIC 382 // TODO: add SectionData for .dynamic section, and then we can get the correct 383 // symbol section index for _DYNAMIC. Now it will be ABS. 384 f_pDynamic = pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 385 "_DYNAMIC", 386 ResolveInfo::Object, 387 ResolveInfo::Define, 388 ResolveInfo::Local, 389 0x0, // size 390 0x0, // value 391 FragmentRef::Null(), // FragRef 392 ResolveInfo::Hidden); 393 394 // ----- segment symbols ----- // 395 f_pExecutableStart = 396 pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 397 "__executable_start", 398 ResolveInfo::NoType, 399 ResolveInfo::Define, 400 ResolveInfo::Absolute, 401 0x0, // size 402 0x0, // value 403 FragmentRef::Null(), // FragRef 404 ResolveInfo::Default); 405 406 f_pEText = pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 407 "etext", 408 ResolveInfo::NoType, 409 ResolveInfo::Define, 410 ResolveInfo::Absolute, 411 0x0, // size 412 0x0, // value 413 FragmentRef::Null(), // FragRef 414 ResolveInfo::Default); 415 416 f_p_EText = pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 417 "_etext", 418 ResolveInfo::NoType, 419 ResolveInfo::Define, 420 ResolveInfo::Absolute, 421 0x0, // size 422 0x0, // value 423 FragmentRef::Null(), // FragRef 424 ResolveInfo::Default); 425 f_p__EText = pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 426 "__etext", 427 ResolveInfo::NoType, 428 ResolveInfo::Define, 429 ResolveInfo::Absolute, 430 0x0, // size 431 0x0, // value 432 FragmentRef::Null(), // FragRef 433 ResolveInfo::Default); 434 f_pEData = pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 435 "edata", 436 ResolveInfo::NoType, 437 ResolveInfo::Define, 438 ResolveInfo::Absolute, 439 0x0, // size 440 0x0, // value 441 FragmentRef::Null(), // FragRef 442 ResolveInfo::Default); 443 444 f_pEnd = pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 445 "end", 446 ResolveInfo::NoType, 447 ResolveInfo::Define, 448 ResolveInfo::Absolute, 449 0x0, // size 450 0x0, // value 451 FragmentRef::Null(), // FragRef 452 ResolveInfo::Default); 453 454 // _edata is defined forcefully. 455 f_p_EData = pBuilder.AddSymbol<IRBuilder::Force, IRBuilder::Resolve>( 456 "_edata", 457 ResolveInfo::NoType, 458 ResolveInfo::Define, 459 ResolveInfo::Absolute, 460 0x0, // size 461 0x0, // value 462 FragmentRef::Null(), // FragRef 463 ResolveInfo::Default); 464 465 // __bss_start is defined forcefully. 466 f_pBSSStart = pBuilder.AddSymbol<IRBuilder::Force, IRBuilder::Resolve>( 467 "__bss_start", 468 ResolveInfo::NoType, 469 ResolveInfo::Define, 470 ResolveInfo::Absolute, 471 0x0, // size 472 0x0, // value 473 FragmentRef::Null(), // FragRef 474 ResolveInfo::Default); 475 476 // _end is defined forcefully. 477 f_p_End = pBuilder.AddSymbol<IRBuilder::Force, IRBuilder::Resolve>( 478 "_end", 479 ResolveInfo::NoType, 480 ResolveInfo::Define, 481 ResolveInfo::Absolute, 482 0x0, // size 483 0x0, // value 484 FragmentRef::Null(), // FragRef 485 ResolveInfo::Default); 486 487 return true; 488 } 489 490 bool GNULDBackend::finalizeStandardSymbols() { 491 if (LinkerConfig::Object == config().codeGenType()) 492 return true; 493 494 ELFFileFormat* file_format = getOutputFormat(); 495 496 // ----- section symbols ----- // 497 if (f_pPreInitArrayStart != NULL) { 498 if (!f_pPreInitArrayStart->hasFragRef()) { 499 f_pPreInitArrayStart->resolveInfo()->setBinding(ResolveInfo::Absolute); 500 f_pPreInitArrayStart->setValue(0x0); 501 } 502 } 503 504 if (f_pPreInitArrayEnd != NULL) { 505 if (f_pPreInitArrayEnd->hasFragRef()) { 506 f_pPreInitArrayEnd->setValue(f_pPreInitArrayEnd->value() + 507 file_format->getPreInitArray().size()); 508 } else { 509 f_pPreInitArrayEnd->resolveInfo()->setBinding(ResolveInfo::Absolute); 510 f_pPreInitArrayEnd->setValue(0x0); 511 } 512 } 513 514 if (f_pInitArrayStart != NULL) { 515 if (!f_pInitArrayStart->hasFragRef()) { 516 f_pInitArrayStart->resolveInfo()->setBinding(ResolveInfo::Absolute); 517 f_pInitArrayStart->setValue(0x0); 518 } 519 } 520 521 if (f_pInitArrayEnd != NULL) { 522 if (f_pInitArrayEnd->hasFragRef()) { 523 f_pInitArrayEnd->setValue(f_pInitArrayEnd->value() + 524 file_format->getInitArray().size()); 525 } else { 526 f_pInitArrayEnd->resolveInfo()->setBinding(ResolveInfo::Absolute); 527 f_pInitArrayEnd->setValue(0x0); 528 } 529 } 530 531 if (f_pFiniArrayStart != NULL) { 532 if (!f_pFiniArrayStart->hasFragRef()) { 533 f_pFiniArrayStart->resolveInfo()->setBinding(ResolveInfo::Absolute); 534 f_pFiniArrayStart->setValue(0x0); 535 } 536 } 537 538 if (f_pFiniArrayEnd != NULL) { 539 if (f_pFiniArrayEnd->hasFragRef()) { 540 f_pFiniArrayEnd->setValue(f_pFiniArrayEnd->value() + 541 file_format->getFiniArray().size()); 542 } else { 543 f_pFiniArrayEnd->resolveInfo()->setBinding(ResolveInfo::Absolute); 544 f_pFiniArrayEnd->setValue(0x0); 545 } 546 } 547 548 if (f_pStack != NULL) { 549 if (!f_pStack->hasFragRef()) { 550 f_pStack->resolveInfo()->setBinding(ResolveInfo::Absolute); 551 f_pStack->setValue(0x0); 552 } 553 } 554 555 if (f_pDynamic != NULL) { 556 f_pDynamic->resolveInfo()->setBinding(ResolveInfo::Local); 557 f_pDynamic->setValue(file_format->getDynamic().addr()); 558 f_pDynamic->setSize(file_format->getDynamic().size()); 559 } 560 561 // ----- segment symbols ----- // 562 if (f_pExecutableStart != NULL) { 563 ELFSegmentFactory::const_iterator exec_start = 564 elfSegmentTable().find(llvm::ELF::PT_LOAD, 0x0, 0x0); 565 if (elfSegmentTable().end() != exec_start) { 566 if (ResolveInfo::ThreadLocal != f_pExecutableStart->type()) { 567 f_pExecutableStart->setValue(f_pExecutableStart->value() + 568 (*exec_start)->vaddr()); 569 } 570 } else { 571 f_pExecutableStart->setValue(0x0); 572 } 573 } 574 575 if (f_pEText != NULL || f_p_EText != NULL || f_p__EText != NULL) { 576 ELFSegmentFactory::const_iterator etext = elfSegmentTable().find( 577 llvm::ELF::PT_LOAD, llvm::ELF::PF_X, llvm::ELF::PF_W); 578 if (elfSegmentTable().end() != etext) { 579 if (f_pEText != NULL && ResolveInfo::ThreadLocal != f_pEText->type()) { 580 f_pEText->setValue(f_pEText->value() + (*etext)->vaddr() + 581 (*etext)->memsz()); 582 } 583 if (f_p_EText != NULL && ResolveInfo::ThreadLocal != f_p_EText->type()) { 584 f_p_EText->setValue(f_p_EText->value() + (*etext)->vaddr() + 585 (*etext)->memsz()); 586 } 587 if (f_p__EText != NULL && 588 ResolveInfo::ThreadLocal != f_p__EText->type()) { 589 f_p__EText->setValue(f_p__EText->value() + (*etext)->vaddr() + 590 (*etext)->memsz()); 591 } 592 } else { 593 if (f_pEText != NULL) 594 f_pEText->setValue(0x0); 595 if (f_p_EText != NULL) 596 f_p_EText->setValue(0x0); 597 if (f_p__EText != NULL) 598 f_p__EText->setValue(0x0); 599 } 600 } 601 602 if (f_pEData != NULL || f_p_EData != NULL || f_pBSSStart != NULL || 603 f_pEnd != NULL || f_p_End != NULL) { 604 ELFSegmentFactory::const_iterator edata = 605 elfSegmentTable().find(llvm::ELF::PT_LOAD, llvm::ELF::PF_W, 0x0); 606 if (elfSegmentTable().end() != edata) { 607 if (f_pEData != NULL && ResolveInfo::ThreadLocal != f_pEData->type()) { 608 f_pEData->setValue(f_pEData->value() + (*edata)->vaddr() + 609 (*edata)->filesz()); 610 } 611 if (f_p_EData != NULL && ResolveInfo::ThreadLocal != f_p_EData->type()) { 612 f_p_EData->setValue(f_p_EData->value() + (*edata)->vaddr() + 613 (*edata)->filesz()); 614 } 615 if (f_pBSSStart != NULL && 616 ResolveInfo::ThreadLocal != f_pBSSStart->type()) { 617 f_pBSSStart->setValue(f_pBSSStart->value() + (*edata)->vaddr() + 618 (*edata)->filesz()); 619 } 620 621 if (f_pEnd != NULL && ResolveInfo::ThreadLocal != f_pEnd->type()) { 622 f_pEnd->setValue(f_pEnd->value() + (*edata)->vaddr() + 623 (*edata)->memsz()); 624 } 625 if (f_p_End != NULL && ResolveInfo::ThreadLocal != f_p_End->type()) { 626 f_p_End->setValue(f_p_End->value() + (*edata)->vaddr() + 627 (*edata)->memsz()); 628 } 629 } else { 630 if (f_pEData != NULL) 631 f_pEData->setValue(0x0); 632 if (f_p_EData != NULL) 633 f_p_EData->setValue(0x0); 634 if (f_pBSSStart != NULL) 635 f_pBSSStart->setValue(0x0); 636 637 if (f_pEnd != NULL) 638 f_pEnd->setValue(0x0); 639 if (f_p_End != NULL) 640 f_p_End->setValue(0x0); 641 } 642 } 643 644 return true; 645 } 646 647 bool GNULDBackend::finalizeTLSSymbol(LDSymbol& pSymbol) { 648 // ignore if symbol has no fragRef 649 if (!pSymbol.hasFragRef()) 650 return true; 651 652 // the value of a TLS symbol is the offset to the TLS segment 653 ELFSegmentFactory::iterator tls_seg = 654 elfSegmentTable().find(llvm::ELF::PT_TLS, llvm::ELF::PF_R, 0x0); 655 assert(tls_seg != elfSegmentTable().end()); 656 uint64_t value = pSymbol.fragRef()->getOutputOffset(); 657 uint64_t addr = pSymbol.fragRef()->frag()->getParent()->getSection().addr(); 658 pSymbol.setValue(value + addr - (*tls_seg)->vaddr()); 659 return true; 660 } 661 662 ELFFileFormat* GNULDBackend::getOutputFormat() { 663 switch (config().codeGenType()) { 664 case LinkerConfig::DynObj: 665 assert(m_pDynObjFileFormat != NULL); 666 return m_pDynObjFileFormat; 667 case LinkerConfig::Exec: 668 case LinkerConfig::Binary: 669 assert(m_pExecFileFormat != NULL); 670 return m_pExecFileFormat; 671 case LinkerConfig::Object: 672 assert(m_pObjectFileFormat != NULL); 673 return m_pObjectFileFormat; 674 default: 675 fatal(diag::unrecognized_output_file) << config().codeGenType(); 676 return NULL; 677 } 678 } 679 680 const ELFFileFormat* GNULDBackend::getOutputFormat() const { 681 switch (config().codeGenType()) { 682 case LinkerConfig::DynObj: 683 assert(m_pDynObjFileFormat != NULL); 684 return m_pDynObjFileFormat; 685 case LinkerConfig::Exec: 686 case LinkerConfig::Binary: 687 assert(m_pExecFileFormat != NULL); 688 return m_pExecFileFormat; 689 case LinkerConfig::Object: 690 assert(m_pObjectFileFormat != NULL); 691 return m_pObjectFileFormat; 692 default: 693 fatal(diag::unrecognized_output_file) << config().codeGenType(); 694 return NULL; 695 } 696 } 697 698 /// sizeShstrtab - compute the size of .shstrtab 699 void GNULDBackend::sizeShstrtab(Module& pModule) { 700 size_t shstrtab = 0; 701 // compute the size of .shstrtab section. 702 Module::const_iterator sect, sectEnd = pModule.end(); 703 for (sect = pModule.begin(); sect != sectEnd; ++sect) { 704 shstrtab += (*sect)->name().size() + 1; 705 } // end of for 706 getOutputFormat()->getShStrTab().setSize(shstrtab); 707 } 708 709 /// sizeNamePools - compute the size of regular name pools 710 /// In ELF executable files, regular name pools are .symtab, .strtab, 711 /// .dynsym, .dynstr, .hash and .shstrtab. 712 void GNULDBackend::sizeNamePools(Module& pModule) { 713 assert(LinkerConfig::Unset != config().codePosition()); 714 715 // number of entries in symbol tables starts from 1 to hold the special entry 716 // at index 0 (STN_UNDEF). See ELF Spec Book I, p1-21. 717 size_t symtab = 1; 718 size_t dynsym = config().isCodeStatic() ? 0 : 1; 719 720 // size of string tables starts from 1 to hold the null character in their 721 // first byte 722 size_t strtab = 1; 723 size_t dynstr = config().isCodeStatic() ? 0 : 1; 724 size_t hash = 0; 725 size_t gnuhash = 0; 726 727 // number of local symbol in the .symtab and .dynsym 728 size_t symtab_local_cnt = 0; 729 size_t dynsym_local_cnt = 0; 730 731 Module::SymbolTable& symbols = pModule.getSymbolTable(); 732 Module::const_sym_iterator symbol, symEnd; 733 /// Compute the size of .symtab, .strtab, and symtab_local_cnt 734 /// @{ 735 /* TODO: 736 1. discard locals and temporary locals 737 2. check whether the symbol is used 738 */ 739 switch (config().options().getStripSymbolMode()) { 740 case GeneralOptions::StripSymbolMode::StripAllSymbols: { 741 symtab = strtab = 0; 742 break; 743 } 744 default: { 745 symEnd = symbols.end(); 746 for (symbol = symbols.begin(); symbol != symEnd; ++symbol) { 747 ++symtab; 748 if (hasEntryInStrTab(**symbol)) 749 strtab += (*symbol)->nameSize() + 1; 750 } 751 symtab_local_cnt = 1 + symbols.numOfFiles() + symbols.numOfLocals() + 752 symbols.numOfLocalDyns(); 753 break; 754 } 755 } // end of switch 756 757 ELFFileFormat* file_format = getOutputFormat(); 758 759 switch (config().codeGenType()) { 760 case LinkerConfig::DynObj: { 761 // soname 762 dynstr += config().options().soname().size() + 1; 763 } 764 /** fall through **/ 765 case LinkerConfig::Exec: 766 case LinkerConfig::Binary: { 767 if (!config().isCodeStatic()) { 768 /// Compute the size of .dynsym, .dynstr, and dynsym_local_cnt 769 symEnd = symbols.dynamicEnd(); 770 for (symbol = symbols.localDynBegin(); symbol != symEnd; ++symbol) { 771 ++dynsym; 772 if (hasEntryInStrTab(**symbol)) 773 dynstr += (*symbol)->nameSize() + 1; 774 } 775 dynsym_local_cnt = 1 + symbols.numOfLocalDyns(); 776 777 // compute .gnu.hash 778 if (config().options().hasGNUHash()) { 779 // count the number of dynsym to hash 780 size_t hashed_sym_cnt = 0; 781 symEnd = symbols.dynamicEnd(); 782 for (symbol = symbols.dynamicBegin(); symbol != symEnd; ++symbol) { 783 if (DynsymCompare().needGNUHash(**symbol)) 784 ++hashed_sym_cnt; 785 } 786 // Special case for empty .dynsym 787 if (hashed_sym_cnt == 0) 788 gnuhash = 5 * 4 + config().targets().bitclass() / 8; 789 else { 790 size_t nbucket = getHashBucketCount(hashed_sym_cnt, true); 791 gnuhash = (4 + nbucket + hashed_sym_cnt) * 4; 792 gnuhash += (1U << getGNUHashMaskbitslog2(hashed_sym_cnt)) / 8; 793 } 794 } 795 796 // compute .hash 797 if (config().options().hasSysVHash()) { 798 // Both Elf32_Word and Elf64_Word are 4 bytes 799 hash = (2 + getHashBucketCount(dynsym, false) + dynsym) * 800 sizeof(llvm::ELF::Elf32_Word); 801 } 802 803 // add DT_NEEDED 804 Module::const_lib_iterator lib, libEnd = pModule.lib_end(); 805 for (lib = pModule.lib_begin(); lib != libEnd; ++lib) { 806 if (!(*lib)->attribute()->isAsNeeded() || (*lib)->isNeeded()) { 807 dynstr += (*lib)->name().size() + 1; 808 dynamic().reserveNeedEntry(); 809 } 810 } 811 812 // add DT_RPATH 813 if (!config().options().getRpathList().empty()) { 814 dynamic().reserveNeedEntry(); 815 GeneralOptions::const_rpath_iterator rpath, 816 rpathEnd = config().options().rpath_end(); 817 for (rpath = config().options().rpath_begin(); rpath != rpathEnd; 818 ++rpath) 819 dynstr += (*rpath).size() + 1; 820 } 821 822 // set size 823 if (config().targets().is32Bits()) { 824 file_format->getDynSymTab().setSize(dynsym * 825 sizeof(llvm::ELF::Elf32_Sym)); 826 } else { 827 file_format->getDynSymTab().setSize(dynsym * 828 sizeof(llvm::ELF::Elf64_Sym)); 829 } 830 file_format->getDynStrTab().setSize(dynstr); 831 file_format->getHashTab().setSize(hash); 832 file_format->getGNUHashTab().setSize(gnuhash); 833 834 // set .dynsym sh_info to one greater than the symbol table 835 // index of the last local symbol 836 file_format->getDynSymTab().setInfo(dynsym_local_cnt); 837 838 // Because some entries in .dynamic section need information of .dynsym, 839 // .dynstr, .symtab, .strtab and .hash, we can not reserve non-DT_NEEDED 840 // entries until we get the size of the sections mentioned above 841 dynamic().reserveEntries(*file_format); 842 file_format->getDynamic().setSize(dynamic().numOfBytes()); 843 } 844 } 845 /* fall through */ 846 case LinkerConfig::Object: { 847 if (config().targets().is32Bits()) 848 file_format->getSymTab().setSize(symtab * sizeof(llvm::ELF::Elf32_Sym)); 849 else 850 file_format->getSymTab().setSize(symtab * sizeof(llvm::ELF::Elf64_Sym)); 851 file_format->getStrTab().setSize(strtab); 852 853 // set .symtab sh_info to one greater than the symbol table 854 // index of the last local symbol 855 file_format->getSymTab().setInfo(symtab_local_cnt); 856 857 // The size of .shstrtab should be decided after output sections are all 858 // set, so we just set it to 1 here. 859 file_format->getShStrTab().setSize(0x1); 860 break; 861 } 862 default: 863 fatal(diag::fatal_illegal_codegen_type) << pModule.name(); 864 break; 865 } // end of switch 866 } 867 868 /// emitSymbol32 - emit an ELF32 symbol 869 void GNULDBackend::emitSymbol32(llvm::ELF::Elf32_Sym& pSym, 870 LDSymbol& pSymbol, 871 char* pStrtab, 872 size_t pStrtabsize, 873 size_t pSymtabIdx) { 874 // FIXME: check the endian between host and target 875 // write out symbol 876 if (hasEntryInStrTab(pSymbol)) { 877 pSym.st_name = pStrtabsize; 878 ::memcpy((pStrtab + pStrtabsize), pSymbol.name(), pSymbol.nameSize()); 879 } else { 880 pSym.st_name = 0; 881 } 882 pSym.st_value = pSymbol.value(); 883 pSym.st_size = getSymbolSize(pSymbol); 884 pSym.st_info = getSymbolInfo(pSymbol); 885 pSym.st_other = pSymbol.visibility(); 886 pSym.st_shndx = getSymbolShndx(pSymbol); 887 } 888 889 /// emitSymbol64 - emit an ELF64 symbol 890 void GNULDBackend::emitSymbol64(llvm::ELF::Elf64_Sym& pSym, 891 LDSymbol& pSymbol, 892 char* pStrtab, 893 size_t pStrtabsize, 894 size_t pSymtabIdx) { 895 // FIXME: check the endian between host and target 896 // write out symbol 897 if (hasEntryInStrTab(pSymbol)) { 898 pSym.st_name = pStrtabsize; 899 ::memcpy((pStrtab + pStrtabsize), pSymbol.name(), pSymbol.nameSize()); 900 } else { 901 pSym.st_name = 0; 902 } 903 pSym.st_value = pSymbol.value(); 904 pSym.st_size = getSymbolSize(pSymbol); 905 pSym.st_info = getSymbolInfo(pSymbol); 906 pSym.st_other = pSymbol.visibility(); 907 pSym.st_shndx = getSymbolShndx(pSymbol); 908 } 909 910 /// emitRegNamePools - emit regular name pools - .symtab, .strtab 911 /// 912 /// the size of these tables should be computed before layout 913 /// layout should computes the start offset of these tables 914 void GNULDBackend::emitRegNamePools(const Module& pModule, 915 FileOutputBuffer& pOutput) { 916 ELFFileFormat* file_format = getOutputFormat(); 917 if (!file_format->hasSymTab()) 918 return; 919 920 LDSection& symtab_sect = file_format->getSymTab(); 921 LDSection& strtab_sect = file_format->getStrTab(); 922 923 MemoryRegion symtab_region = 924 pOutput.request(symtab_sect.offset(), symtab_sect.size()); 925 MemoryRegion strtab_region = 926 pOutput.request(strtab_sect.offset(), strtab_sect.size()); 927 928 // set up symtab_region 929 llvm::ELF::Elf32_Sym* symtab32 = NULL; 930 llvm::ELF::Elf64_Sym* symtab64 = NULL; 931 if (config().targets().is32Bits()) 932 symtab32 = (llvm::ELF::Elf32_Sym*)symtab_region.begin(); 933 else if (config().targets().is64Bits()) 934 symtab64 = (llvm::ELF::Elf64_Sym*)symtab_region.begin(); 935 else { 936 fatal(diag::unsupported_bitclass) << config().targets().triple().str() 937 << config().targets().bitclass(); 938 } 939 940 // set up strtab_region 941 char* strtab = reinterpret_cast<char*>(strtab_region.begin()); 942 943 // emit the first ELF symbol 944 if (config().targets().is32Bits()) 945 emitSymbol32(symtab32[0], *LDSymbol::Null(), strtab, 0, 0); 946 else 947 emitSymbol64(symtab64[0], *LDSymbol::Null(), strtab, 0, 0); 948 949 bool sym_exist = false; 950 HashTableType::entry_type* entry = NULL; 951 if (LinkerConfig::Object == config().codeGenType()) { 952 entry = m_pSymIndexMap->insert(LDSymbol::Null(), sym_exist); 953 entry->setValue(0); 954 } 955 956 size_t symIdx = 1; 957 size_t strtabsize = 1; 958 959 const Module::SymbolTable& symbols = pModule.getSymbolTable(); 960 Module::const_sym_iterator symbol, symEnd; 961 962 symEnd = symbols.end(); 963 for (symbol = symbols.begin(); symbol != symEnd; ++symbol) { 964 if (LinkerConfig::Object == config().codeGenType()) { 965 entry = m_pSymIndexMap->insert(*symbol, sym_exist); 966 entry->setValue(symIdx); 967 } 968 if (config().targets().is32Bits()) 969 emitSymbol32(symtab32[symIdx], **symbol, strtab, strtabsize, symIdx); 970 else 971 emitSymbol64(symtab64[symIdx], **symbol, strtab, strtabsize, symIdx); 972 ++symIdx; 973 if (hasEntryInStrTab(**symbol)) 974 strtabsize += (*symbol)->nameSize() + 1; 975 } 976 } 977 978 /// emitDynNamePools - emit dynamic name pools - .dyntab, .dynstr, .hash 979 /// 980 /// the size of these tables should be computed before layout 981 /// layout should computes the start offset of these tables 982 void GNULDBackend::emitDynNamePools(Module& pModule, 983 FileOutputBuffer& pOutput) { 984 ELFFileFormat* file_format = getOutputFormat(); 985 if (!file_format->hasDynSymTab() || !file_format->hasDynStrTab() || 986 !file_format->hasDynamic()) 987 return; 988 989 bool sym_exist = false; 990 HashTableType::entry_type* entry = 0; 991 992 LDSection& symtab_sect = file_format->getDynSymTab(); 993 LDSection& strtab_sect = file_format->getDynStrTab(); 994 LDSection& dyn_sect = file_format->getDynamic(); 995 996 MemoryRegion symtab_region = 997 pOutput.request(symtab_sect.offset(), symtab_sect.size()); 998 MemoryRegion strtab_region = 999 pOutput.request(strtab_sect.offset(), strtab_sect.size()); 1000 MemoryRegion dyn_region = pOutput.request(dyn_sect.offset(), dyn_sect.size()); 1001 // set up symtab_region 1002 llvm::ELF::Elf32_Sym* symtab32 = NULL; 1003 llvm::ELF::Elf64_Sym* symtab64 = NULL; 1004 if (config().targets().is32Bits()) 1005 symtab32 = (llvm::ELF::Elf32_Sym*)symtab_region.begin(); 1006 else if (config().targets().is64Bits()) 1007 symtab64 = (llvm::ELF::Elf64_Sym*)symtab_region.begin(); 1008 else { 1009 fatal(diag::unsupported_bitclass) << config().targets().triple().str() 1010 << config().targets().bitclass(); 1011 } 1012 1013 // set up strtab_region 1014 char* strtab = reinterpret_cast<char*>(strtab_region.begin()); 1015 1016 // emit the first ELF symbol 1017 if (config().targets().is32Bits()) 1018 emitSymbol32(symtab32[0], *LDSymbol::Null(), strtab, 0, 0); 1019 else 1020 emitSymbol64(symtab64[0], *LDSymbol::Null(), strtab, 0, 0); 1021 1022 size_t symIdx = 1; 1023 size_t strtabsize = 1; 1024 1025 Module::SymbolTable& symbols = pModule.getSymbolTable(); 1026 // emit .gnu.hash 1027 if (config().options().hasGNUHash()) 1028 emitGNUHashTab(symbols, pOutput); 1029 1030 // emit .hash 1031 if (config().options().hasSysVHash()) 1032 emitELFHashTab(symbols, pOutput); 1033 1034 // emit .dynsym, and .dynstr (emit LocalDyn and Dynamic category) 1035 Module::const_sym_iterator symbol, symEnd = symbols.dynamicEnd(); 1036 for (symbol = symbols.localDynBegin(); symbol != symEnd; ++symbol) { 1037 if (config().targets().is32Bits()) 1038 emitSymbol32(symtab32[symIdx], **symbol, strtab, strtabsize, symIdx); 1039 else 1040 emitSymbol64(symtab64[symIdx], **symbol, strtab, strtabsize, symIdx); 1041 // maintain output's symbol and index map 1042 entry = m_pSymIndexMap->insert(*symbol, sym_exist); 1043 entry->setValue(symIdx); 1044 // sum up counters 1045 ++symIdx; 1046 if (hasEntryInStrTab(**symbol)) 1047 strtabsize += (*symbol)->nameSize() + 1; 1048 } 1049 1050 // emit DT_NEED 1051 // add DT_NEED strings into .dynstr 1052 ELFDynamic::iterator dt_need = dynamic().needBegin(); 1053 Module::const_lib_iterator lib, libEnd = pModule.lib_end(); 1054 for (lib = pModule.lib_begin(); lib != libEnd; ++lib) { 1055 if (!(*lib)->attribute()->isAsNeeded() || (*lib)->isNeeded()) { 1056 ::memcpy((strtab + strtabsize), 1057 (*lib)->name().c_str(), 1058 (*lib)->name().size()); 1059 (*dt_need)->setValue(llvm::ELF::DT_NEEDED, strtabsize); 1060 strtabsize += (*lib)->name().size() + 1; 1061 ++dt_need; 1062 } 1063 } 1064 1065 if (!config().options().getRpathList().empty()) { 1066 if (!config().options().hasNewDTags()) 1067 (*dt_need)->setValue(llvm::ELF::DT_RPATH, strtabsize); 1068 else 1069 (*dt_need)->setValue(llvm::ELF::DT_RUNPATH, strtabsize); 1070 ++dt_need; 1071 1072 GeneralOptions::const_rpath_iterator rpath, 1073 rpathEnd = config().options().rpath_end(); 1074 for (rpath = config().options().rpath_begin(); rpath != rpathEnd; ++rpath) { 1075 memcpy((strtab + strtabsize), (*rpath).data(), (*rpath).size()); 1076 strtabsize += (*rpath).size(); 1077 strtab[strtabsize++] = (rpath + 1 == rpathEnd ? '\0' : ':'); 1078 } 1079 } 1080 1081 // initialize value of ELF .dynamic section 1082 if (LinkerConfig::DynObj == config().codeGenType()) { 1083 // set pointer to SONAME entry in dynamic string table. 1084 dynamic().applySoname(strtabsize); 1085 } 1086 dynamic().applyEntries(*file_format); 1087 dynamic().emit(dyn_sect, dyn_region); 1088 1089 // emit soname 1090 if (LinkerConfig::DynObj == config().codeGenType()) { 1091 ::memcpy((strtab + strtabsize), 1092 config().options().soname().c_str(), 1093 config().options().soname().size()); 1094 strtabsize += config().options().soname().size() + 1; 1095 } 1096 } 1097 1098 /// emitELFHashTab - emit .hash 1099 void GNULDBackend::emitELFHashTab(const Module::SymbolTable& pSymtab, 1100 FileOutputBuffer& pOutput) { 1101 ELFFileFormat* file_format = getOutputFormat(); 1102 if (!file_format->hasHashTab()) 1103 return; 1104 LDSection& hash_sect = file_format->getHashTab(); 1105 MemoryRegion hash_region = 1106 pOutput.request(hash_sect.offset(), hash_sect.size()); 1107 // both 32 and 64 bits hash table use 32-bit entry 1108 // set up hash_region 1109 uint32_t* word_array = reinterpret_cast<uint32_t*>(hash_region.begin()); 1110 uint32_t& nbucket = word_array[0]; 1111 uint32_t& nchain = word_array[1]; 1112 1113 size_t dynsymSize = 1 + pSymtab.numOfLocalDyns() + pSymtab.numOfDynamics(); 1114 nbucket = getHashBucketCount(dynsymSize, false); 1115 nchain = dynsymSize; 1116 1117 uint32_t* bucket = (word_array + 2); 1118 uint32_t* chain = (bucket + nbucket); 1119 1120 // initialize bucket 1121 memset(reinterpret_cast<void*>(bucket), 0, nbucket); 1122 1123 hash::StringHash<hash::ELF> hash_func; 1124 1125 size_t idx = 1; 1126 Module::const_sym_iterator symbol, symEnd = pSymtab.dynamicEnd(); 1127 for (symbol = pSymtab.localDynBegin(); symbol != symEnd; ++symbol) { 1128 llvm::StringRef name((*symbol)->name()); 1129 size_t bucket_pos = hash_func(name) % nbucket; 1130 chain[idx] = bucket[bucket_pos]; 1131 bucket[bucket_pos] = idx; 1132 ++idx; 1133 } 1134 } 1135 1136 /// emitGNUHashTab - emit .gnu.hash 1137 void GNULDBackend::emitGNUHashTab(Module::SymbolTable& pSymtab, 1138 FileOutputBuffer& pOutput) { 1139 ELFFileFormat* file_format = getOutputFormat(); 1140 if (!file_format->hasGNUHashTab()) 1141 return; 1142 1143 MemoryRegion gnuhash_region = 1144 pOutput.request(file_format->getGNUHashTab().offset(), 1145 file_format->getGNUHashTab().size()); 1146 1147 uint32_t* word_array = reinterpret_cast<uint32_t*>(gnuhash_region.begin()); 1148 // fixed-length fields 1149 uint32_t& nbucket = word_array[0]; 1150 uint32_t& symidx = word_array[1]; 1151 uint32_t& maskwords = word_array[2]; 1152 uint32_t& shift2 = word_array[3]; 1153 // variable-length fields 1154 uint8_t* bitmask = reinterpret_cast<uint8_t*>(word_array + 4); 1155 uint32_t* bucket = NULL; 1156 uint32_t* chain = NULL; 1157 1158 // count the number of dynsym to hash 1159 size_t unhashed_sym_cnt = pSymtab.numOfLocalDyns(); 1160 size_t hashed_sym_cnt = pSymtab.numOfDynamics(); 1161 Module::const_sym_iterator symbol, symEnd = pSymtab.dynamicEnd(); 1162 for (symbol = pSymtab.dynamicBegin(); symbol != symEnd; ++symbol) { 1163 if (DynsymCompare().needGNUHash(**symbol)) 1164 break; 1165 ++unhashed_sym_cnt; 1166 --hashed_sym_cnt; 1167 } 1168 1169 // special case for the empty hash table 1170 if (hashed_sym_cnt == 0) { 1171 nbucket = 1; // one empty bucket 1172 symidx = 1 + unhashed_sym_cnt; // symidx above unhashed symbols 1173 maskwords = 1; // bitmask length 1174 shift2 = 0; // bloom filter 1175 1176 if (config().targets().is32Bits()) { 1177 uint32_t* maskval = reinterpret_cast<uint32_t*>(bitmask); 1178 *maskval = 0; // no valid hashes 1179 } else { 1180 // must be 64 1181 uint64_t* maskval = reinterpret_cast<uint64_t*>(bitmask); 1182 *maskval = 0; // no valid hashes 1183 } 1184 bucket = reinterpret_cast<uint32_t*>(bitmask + 1185 config().targets().bitclass() / 8); 1186 *bucket = 0; // no hash in the only bucket 1187 return; 1188 } 1189 1190 uint32_t maskbitslog2 = getGNUHashMaskbitslog2(hashed_sym_cnt); 1191 uint32_t maskbits = 1u << maskbitslog2; 1192 uint32_t shift1 = config().targets().is32Bits() ? 5 : 6; 1193 uint32_t mask = (1u << shift1) - 1; 1194 1195 nbucket = getHashBucketCount(hashed_sym_cnt, true); 1196 symidx = 1 + unhashed_sym_cnt; 1197 maskwords = 1 << (maskbitslog2 - shift1); 1198 shift2 = maskbitslog2; 1199 1200 // setup bucket and chain 1201 bucket = reinterpret_cast<uint32_t*>(bitmask + maskbits / 8); 1202 chain = (bucket + nbucket); 1203 1204 // build the gnu style hash table 1205 typedef std::multimap<uint32_t, std::pair<LDSymbol*, uint32_t> > SymMapType; 1206 SymMapType symmap; 1207 symEnd = pSymtab.dynamicEnd(); 1208 for (symbol = pSymtab.localDynBegin() + symidx - 1; symbol != symEnd; 1209 ++symbol) { 1210 hash::StringHash<hash::DJB> hasher; 1211 uint32_t djbhash = hasher((*symbol)->name()); 1212 uint32_t hash = djbhash % nbucket; 1213 symmap.insert(std::make_pair(hash, std::make_pair(*symbol, djbhash))); 1214 } 1215 1216 // compute bucket, chain, and bitmask 1217 std::vector<uint64_t> bitmasks(maskwords); 1218 size_t hashedidx = symidx; 1219 for (size_t idx = 0; idx < nbucket; ++idx) { 1220 size_t count = 0; 1221 std::pair<SymMapType::iterator, SymMapType::iterator> ret; 1222 ret = symmap.equal_range(idx); 1223 for (SymMapType::iterator it = ret.first; it != ret.second;) { 1224 // rearrange the hashed symbol ordering 1225 *(pSymtab.localDynBegin() + hashedidx - 1) = it->second.first; 1226 uint32_t djbhash = it->second.second; 1227 uint32_t val = ((djbhash >> shift1) & ((maskbits >> shift1) - 1)); 1228 bitmasks[val] |= 1u << (djbhash & mask); 1229 bitmasks[val] |= 1u << ((djbhash >> shift2) & mask); 1230 val = djbhash & ~1u; 1231 // advance the iterator and check if we're dealing w/ the last elment 1232 if (++it == ret.second) { 1233 // last element terminates the chain 1234 val |= 1; 1235 } 1236 chain[hashedidx - symidx] = val; 1237 1238 ++hashedidx; 1239 ++count; 1240 } 1241 1242 if (count == 0) 1243 bucket[idx] = 0; 1244 else 1245 bucket[idx] = hashedidx - count; 1246 } 1247 1248 // write the bitmasks 1249 if (config().targets().is32Bits()) { 1250 uint32_t* maskval = reinterpret_cast<uint32_t*>(bitmask); 1251 for (size_t i = 0; i < maskwords; ++i) 1252 std::memcpy(maskval + i, &bitmasks[i], 4); 1253 } else { 1254 // must be 64 1255 uint64_t* maskval = reinterpret_cast<uint64_t*>(bitmask); 1256 for (size_t i = 0; i < maskwords; ++i) 1257 std::memcpy(maskval + i, &bitmasks[i], 8); 1258 } 1259 } 1260 1261 /// sizeInterp - compute the size of the .interp section 1262 void GNULDBackend::sizeInterp() { 1263 const char* dyld_name; 1264 if (config().options().hasDyld()) 1265 dyld_name = config().options().dyld().c_str(); 1266 else 1267 dyld_name = m_pInfo->dyld(); 1268 1269 LDSection& interp = getOutputFormat()->getInterp(); 1270 interp.setSize(std::strlen(dyld_name) + 1); 1271 } 1272 1273 /// emitInterp - emit the .interp 1274 void GNULDBackend::emitInterp(FileOutputBuffer& pOutput) { 1275 if (getOutputFormat()->hasInterp()) { 1276 const LDSection& interp = getOutputFormat()->getInterp(); 1277 MemoryRegion region = pOutput.request(interp.offset(), interp.size()); 1278 const char* dyld_name; 1279 if (config().options().hasDyld()) 1280 dyld_name = config().options().dyld().c_str(); 1281 else 1282 dyld_name = m_pInfo->dyld(); 1283 1284 std::memcpy(region.begin(), dyld_name, interp.size()); 1285 } 1286 } 1287 1288 bool GNULDBackend::hasEntryInStrTab(const LDSymbol& pSym) const { 1289 return ResolveInfo::Section != pSym.type(); 1290 } 1291 1292 void GNULDBackend::orderSymbolTable(Module& pModule) { 1293 Module::SymbolTable& symbols = pModule.getSymbolTable(); 1294 1295 if (config().options().hasGNUHash()) { 1296 // Currently we may add output symbols after sizeNamePools(), and a 1297 // non-stable sort is used in SymbolCategory::arrange(), so we just 1298 // sort .dynsym right before emitting .gnu.hash 1299 std::stable_sort( 1300 symbols.dynamicBegin(), symbols.dynamicEnd(), DynsymCompare()); 1301 } 1302 } 1303 1304 /// getSectionOrder 1305 unsigned int GNULDBackend::getSectionOrder(const LDSection& pSectHdr) const { 1306 const ELFFileFormat* file_format = getOutputFormat(); 1307 1308 // NULL section should be the "1st" section 1309 if (LDFileFormat::Null == pSectHdr.kind()) 1310 return SHO_NULL; 1311 1312 if (&pSectHdr == &file_format->getStrTab()) 1313 return SHO_STRTAB; 1314 1315 // if the section is not ALLOC, lay it out until the last possible moment 1316 if (0 == (pSectHdr.flag() & llvm::ELF::SHF_ALLOC)) 1317 return SHO_UNDEFINED; 1318 1319 bool is_write = (pSectHdr.flag() & llvm::ELF::SHF_WRITE) != 0; 1320 bool is_exec = (pSectHdr.flag() & llvm::ELF::SHF_EXECINSTR) != 0; 1321 // TODO: need to take care other possible output sections 1322 switch (pSectHdr.kind()) { 1323 case LDFileFormat::TEXT: 1324 case LDFileFormat::DATA: 1325 if (is_exec) { 1326 if (&pSectHdr == &file_format->getInit()) 1327 return SHO_INIT; 1328 if (&pSectHdr == &file_format->getFini()) 1329 return SHO_FINI; 1330 return SHO_TEXT; 1331 } else if (!is_write) { 1332 return SHO_RO; 1333 } else { 1334 if (config().options().hasRelro()) { 1335 if (&pSectHdr == &file_format->getPreInitArray() || 1336 &pSectHdr == &file_format->getInitArray() || 1337 &pSectHdr == &file_format->getFiniArray() || 1338 &pSectHdr == &file_format->getCtors() || 1339 &pSectHdr == &file_format->getDtors() || 1340 &pSectHdr == &file_format->getJCR() || 1341 &pSectHdr == &file_format->getDataRelRo()) 1342 return SHO_RELRO; 1343 1344 if (&pSectHdr == &file_format->getDataRelRoLocal()) 1345 return SHO_RELRO_LOCAL; 1346 1347 // Make special sections that end with .rel.ro suffix as RELRO. 1348 llvm::StringRef name(pSectHdr.name()); 1349 if (name.endswith(".rel.ro")) { 1350 return SHO_RELRO; 1351 } 1352 } 1353 if ((pSectHdr.flag() & llvm::ELF::SHF_TLS) != 0x0) { 1354 return SHO_TLS_DATA; 1355 } 1356 return SHO_DATA; 1357 } 1358 1359 case LDFileFormat::BSS: 1360 if ((pSectHdr.flag() & llvm::ELF::SHF_TLS) != 0x0) 1361 return SHO_TLS_BSS; 1362 return SHO_BSS; 1363 1364 case LDFileFormat::NamePool: { 1365 if (&pSectHdr == &file_format->getDynamic()) 1366 return SHO_RELRO; 1367 return SHO_NAMEPOOL; 1368 } 1369 case LDFileFormat::Relocation: 1370 if (&pSectHdr == &file_format->getRelPlt() || 1371 &pSectHdr == &file_format->getRelaPlt()) 1372 return SHO_REL_PLT; 1373 return SHO_RELOCATION; 1374 1375 // get the order from target for target specific sections 1376 case LDFileFormat::Target: 1377 return getTargetSectionOrder(pSectHdr); 1378 1379 // handle .interp and .note.* sections 1380 case LDFileFormat::Note: 1381 if (file_format->hasInterp() && (&pSectHdr == &file_format->getInterp())) 1382 return SHO_INTERP; 1383 else if (is_write) 1384 return SHO_RW_NOTE; 1385 else 1386 return SHO_RO_NOTE; 1387 1388 case LDFileFormat::EhFrame: 1389 // set writable .eh_frame as relro 1390 if (is_write) 1391 return SHO_RELRO; 1392 case LDFileFormat::EhFrameHdr: 1393 case LDFileFormat::GCCExceptTable: 1394 return SHO_EXCEPTION; 1395 1396 case LDFileFormat::MetaData: 1397 case LDFileFormat::Debug: 1398 case LDFileFormat::DebugString: 1399 default: 1400 return SHO_UNDEFINED; 1401 } 1402 } 1403 1404 /// getSymbolSize 1405 uint64_t GNULDBackend::getSymbolSize(const LDSymbol& pSymbol) const { 1406 // undefined and dynamic symbols should have zero size. 1407 if (pSymbol.isDyn() || pSymbol.desc() == ResolveInfo::Undefined) 1408 return 0x0; 1409 return pSymbol.resolveInfo()->size(); 1410 } 1411 1412 /// getSymbolInfo 1413 uint64_t GNULDBackend::getSymbolInfo(const LDSymbol& pSymbol) const { 1414 // set binding 1415 uint8_t bind = 0x0; 1416 if (pSymbol.resolveInfo()->isLocal()) 1417 bind = llvm::ELF::STB_LOCAL; 1418 else if (pSymbol.resolveInfo()->isGlobal()) 1419 bind = llvm::ELF::STB_GLOBAL; 1420 else if (pSymbol.resolveInfo()->isWeak()) 1421 bind = llvm::ELF::STB_WEAK; 1422 else if (pSymbol.resolveInfo()->isAbsolute()) { 1423 // (Luba) Is a absolute but not global (weak or local) symbol meaningful? 1424 bind = llvm::ELF::STB_GLOBAL; 1425 } 1426 1427 if (config().codeGenType() != LinkerConfig::Object && 1428 (pSymbol.visibility() == llvm::ELF::STV_INTERNAL || 1429 pSymbol.visibility() == llvm::ELF::STV_HIDDEN)) 1430 bind = llvm::ELF::STB_LOCAL; 1431 1432 uint32_t type = pSymbol.resolveInfo()->type(); 1433 // if the IndirectFunc symbol (i.e., STT_GNU_IFUNC) is from dynobj, change 1434 // its type to Function 1435 if (type == ResolveInfo::IndirectFunc && pSymbol.isDyn()) 1436 type = ResolveInfo::Function; 1437 return (type | (bind << 4)); 1438 } 1439 1440 /// getSymbolValue - this function is called after layout() 1441 uint64_t GNULDBackend::getSymbolValue(const LDSymbol& pSymbol) const { 1442 if (pSymbol.isDyn()) 1443 return 0x0; 1444 1445 return pSymbol.value(); 1446 } 1447 1448 /// getSymbolShndx - this function is called after layout() 1449 uint64_t GNULDBackend::getSymbolShndx(const LDSymbol& pSymbol) const { 1450 if (pSymbol.resolveInfo()->isAbsolute()) 1451 return llvm::ELF::SHN_ABS; 1452 if (pSymbol.resolveInfo()->isCommon()) 1453 return llvm::ELF::SHN_COMMON; 1454 if (pSymbol.resolveInfo()->isUndef() || pSymbol.isDyn()) 1455 return llvm::ELF::SHN_UNDEF; 1456 1457 if (pSymbol.resolveInfo()->isDefine() && !pSymbol.hasFragRef()) 1458 return llvm::ELF::SHN_ABS; 1459 1460 assert(pSymbol.hasFragRef() && 1461 "symbols must have fragment reference to get its index"); 1462 return pSymbol.fragRef()->frag()->getParent()->getSection().index(); 1463 } 1464 1465 /// getSymbolIdx - called by emitRelocation to get the ouput symbol table index 1466 size_t GNULDBackend::getSymbolIdx(const LDSymbol* pSymbol) const { 1467 HashTableType::iterator entry = 1468 m_pSymIndexMap->find(const_cast<LDSymbol*>(pSymbol)); 1469 assert(entry != m_pSymIndexMap->end() && 1470 "symbol not found in the symbol table"); 1471 return entry.getEntry()->value(); 1472 } 1473 1474 /// isTemporary - Whether pSymbol is a local label. 1475 bool GNULDBackend::isTemporary(const LDSymbol& pSymbol) const { 1476 if (ResolveInfo::Local != pSymbol.binding()) 1477 return false; 1478 1479 if (pSymbol.nameSize() < 2) 1480 return false; 1481 1482 const char* name = pSymbol.name(); 1483 if ('.' == name[0] && 'L' == name[1]) 1484 return true; 1485 1486 // UnixWare 2.1 cc generate DWARF debugging symbols with `..' prefix. 1487 if (name[0] == '.' && name[1] == '.') 1488 return true; 1489 1490 // Work arround for gcc's bug 1491 // gcc sometimes generate symbols with '_.L_' prefix. 1492 if (pSymbol.nameSize() < 4) 1493 return false; 1494 1495 if (name[0] == '_' && name[1] == '.' && name[2] == 'L' && name[3] == '_') 1496 return true; 1497 1498 return false; 1499 } 1500 1501 /// allocateCommonSymbols - allocate common symbols in the corresponding 1502 /// sections. This is executed at pre-layout stage. 1503 bool GNULDBackend::allocateCommonSymbols(Module& pModule) { 1504 SymbolCategory& symbol_list = pModule.getSymbolTable(); 1505 1506 if (symbol_list.emptyCommons() && symbol_list.emptyFiles() && 1507 symbol_list.emptyLocals() && symbol_list.emptyLocalDyns()) 1508 return true; 1509 1510 SymbolCategory::iterator com_sym, com_end; 1511 1512 // FIXME: If the order of common symbols is defined, then sort common symbols 1513 // std::sort(com_sym, com_end, some kind of order); 1514 1515 // get corresponding BSS LDSection 1516 ELFFileFormat* file_format = getOutputFormat(); 1517 LDSection& bss_sect = file_format->getBSS(); 1518 LDSection& tbss_sect = file_format->getTBSS(); 1519 1520 // get or create corresponding BSS SectionData 1521 SectionData* bss_sect_data = NULL; 1522 if (bss_sect.hasSectionData()) 1523 bss_sect_data = bss_sect.getSectionData(); 1524 else 1525 bss_sect_data = IRBuilder::CreateSectionData(bss_sect); 1526 1527 SectionData* tbss_sect_data = NULL; 1528 if (tbss_sect.hasSectionData()) 1529 tbss_sect_data = tbss_sect.getSectionData(); 1530 else 1531 tbss_sect_data = IRBuilder::CreateSectionData(tbss_sect); 1532 1533 // remember original BSS size 1534 uint64_t bss_offset = bss_sect.size(); 1535 uint64_t tbss_offset = tbss_sect.size(); 1536 1537 // allocate all local common symbols 1538 com_end = symbol_list.localEnd(); 1539 1540 for (com_sym = symbol_list.localBegin(); com_sym != com_end; ++com_sym) { 1541 if (ResolveInfo::Common == (*com_sym)->desc()) { 1542 // We have to reset the description of the symbol here. When doing 1543 // incremental linking, the output relocatable object may have common 1544 // symbols. Therefore, we can not treat common symbols as normal symbols 1545 // when emitting the regular name pools. We must change the symbols' 1546 // description here. 1547 (*com_sym)->resolveInfo()->setDesc(ResolveInfo::Define); 1548 Fragment* frag = new FillFragment(0x0, 1, (*com_sym)->size()); 1549 1550 if (ResolveInfo::ThreadLocal == (*com_sym)->type()) { 1551 // allocate TLS common symbol in tbss section 1552 tbss_offset += ObjectBuilder::AppendFragment( 1553 *frag, *tbss_sect_data, (*com_sym)->value()); 1554 ObjectBuilder::UpdateSectionAlign(tbss_sect, (*com_sym)->value()); 1555 (*com_sym)->setFragmentRef(FragmentRef::Create(*frag, 0)); 1556 } else { 1557 bss_offset += ObjectBuilder::AppendFragment( 1558 *frag, *bss_sect_data, (*com_sym)->value()); 1559 ObjectBuilder::UpdateSectionAlign(bss_sect, (*com_sym)->value()); 1560 (*com_sym)->setFragmentRef(FragmentRef::Create(*frag, 0)); 1561 } 1562 } 1563 } 1564 1565 // allocate all global common symbols 1566 com_end = symbol_list.commonEnd(); 1567 for (com_sym = symbol_list.commonBegin(); com_sym != com_end; ++com_sym) { 1568 // We have to reset the description of the symbol here. When doing 1569 // incremental linking, the output relocatable object may have common 1570 // symbols. Therefore, we can not treat common symbols as normal symbols 1571 // when emitting the regular name pools. We must change the symbols' 1572 // description here. 1573 (*com_sym)->resolveInfo()->setDesc(ResolveInfo::Define); 1574 Fragment* frag = new FillFragment(0x0, 1, (*com_sym)->size()); 1575 1576 if (ResolveInfo::ThreadLocal == (*com_sym)->type()) { 1577 // allocate TLS common symbol in tbss section 1578 tbss_offset += ObjectBuilder::AppendFragment( 1579 *frag, *tbss_sect_data, (*com_sym)->value()); 1580 ObjectBuilder::UpdateSectionAlign(tbss_sect, (*com_sym)->value()); 1581 (*com_sym)->setFragmentRef(FragmentRef::Create(*frag, 0)); 1582 } else { 1583 bss_offset += ObjectBuilder::AppendFragment( 1584 *frag, *bss_sect_data, (*com_sym)->value()); 1585 ObjectBuilder::UpdateSectionAlign(bss_sect, (*com_sym)->value()); 1586 (*com_sym)->setFragmentRef(FragmentRef::Create(*frag, 0)); 1587 } 1588 } 1589 1590 bss_sect.setSize(bss_offset); 1591 tbss_sect.setSize(tbss_offset); 1592 symbol_list.changeCommonsToGlobal(); 1593 return true; 1594 } 1595 1596 /// updateSectionFlags - update pTo's flags when merging pFrom 1597 /// update the output section flags based on input section flags. 1598 bool GNULDBackend::updateSectionFlags(LDSection& pTo, const LDSection& pFrom) { 1599 // union the flags from input 1600 uint32_t flags = pTo.flag(); 1601 flags |= (pFrom.flag() & (llvm::ELF::SHF_WRITE | llvm::ELF::SHF_ALLOC | 1602 llvm::ELF::SHF_EXECINSTR)); 1603 1604 // if there is an input section is not SHF_MERGE, clean this flag 1605 if (0 == (pFrom.flag() & llvm::ELF::SHF_MERGE)) 1606 flags &= ~llvm::ELF::SHF_MERGE; 1607 1608 // if there is an input section is not SHF_STRINGS, clean this flag 1609 if (0 == (pFrom.flag() & llvm::ELF::SHF_STRINGS)) 1610 flags &= ~llvm::ELF::SHF_STRINGS; 1611 1612 pTo.setFlag(flags); 1613 return true; 1614 } 1615 1616 /// readRelocation - read ELF32_Rel entry 1617 bool GNULDBackend::readRelocation(const llvm::ELF::Elf32_Rel& pRel, 1618 Relocation::Type& pType, 1619 uint32_t& pSymIdx, 1620 uint32_t& pOffset) const { 1621 uint32_t r_info = 0x0; 1622 if (llvm::sys::IsLittleEndianHost) { 1623 pOffset = pRel.r_offset; 1624 r_info = pRel.r_info; 1625 } else { 1626 pOffset = mcld::bswap32(pRel.r_offset); 1627 r_info = mcld::bswap32(pRel.r_info); 1628 } 1629 1630 pType = static_cast<unsigned char>(r_info); 1631 pSymIdx = (r_info >> 8); 1632 return true; 1633 } 1634 1635 /// readRelocation - read ELF32_Rela entry 1636 bool GNULDBackend::readRelocation(const llvm::ELF::Elf32_Rela& pRel, 1637 Relocation::Type& pType, 1638 uint32_t& pSymIdx, 1639 uint32_t& pOffset, 1640 int32_t& pAddend) const { 1641 uint32_t r_info = 0x0; 1642 if (llvm::sys::IsLittleEndianHost) { 1643 pOffset = pRel.r_offset; 1644 r_info = pRel.r_info; 1645 pAddend = pRel.r_addend; 1646 } else { 1647 pOffset = mcld::bswap32(pRel.r_offset); 1648 r_info = mcld::bswap32(pRel.r_info); 1649 pAddend = mcld::bswap32(pRel.r_addend); 1650 } 1651 1652 pType = static_cast<unsigned char>(r_info); 1653 pSymIdx = (r_info >> 8); 1654 return true; 1655 } 1656 1657 /// readRelocation - read ELF64_Rel entry 1658 bool GNULDBackend::readRelocation(const llvm::ELF::Elf64_Rel& pRel, 1659 Relocation::Type& pType, 1660 uint32_t& pSymIdx, 1661 uint64_t& pOffset) const { 1662 uint64_t r_info = 0x0; 1663 if (llvm::sys::IsLittleEndianHost) { 1664 pOffset = pRel.r_offset; 1665 r_info = pRel.r_info; 1666 } else { 1667 pOffset = mcld::bswap64(pRel.r_offset); 1668 r_info = mcld::bswap64(pRel.r_info); 1669 } 1670 1671 pType = static_cast<uint32_t>(r_info); 1672 pSymIdx = (r_info >> 32); 1673 return true; 1674 } 1675 1676 /// readRel - read ELF64_Rela entry 1677 bool GNULDBackend::readRelocation(const llvm::ELF::Elf64_Rela& pRel, 1678 Relocation::Type& pType, 1679 uint32_t& pSymIdx, 1680 uint64_t& pOffset, 1681 int64_t& pAddend) const { 1682 uint64_t r_info = 0x0; 1683 if (llvm::sys::IsLittleEndianHost) { 1684 pOffset = pRel.r_offset; 1685 r_info = pRel.r_info; 1686 pAddend = pRel.r_addend; 1687 } else { 1688 pOffset = mcld::bswap64(pRel.r_offset); 1689 r_info = mcld::bswap64(pRel.r_info); 1690 pAddend = mcld::bswap64(pRel.r_addend); 1691 } 1692 1693 pType = static_cast<uint32_t>(r_info); 1694 pSymIdx = (r_info >> 32); 1695 return true; 1696 } 1697 1698 /// emitRelocation - write data to the ELF32_Rel entry 1699 void GNULDBackend::emitRelocation(llvm::ELF::Elf32_Rel& pRel, 1700 Relocation::Type pType, 1701 uint32_t pSymIdx, 1702 uint32_t pOffset) const { 1703 pRel.r_offset = pOffset; 1704 pRel.setSymbolAndType(pSymIdx, pType); 1705 } 1706 1707 /// emitRelocation - write data to the ELF32_Rela entry 1708 void GNULDBackend::emitRelocation(llvm::ELF::Elf32_Rela& pRel, 1709 Relocation::Type pType, 1710 uint32_t pSymIdx, 1711 uint32_t pOffset, 1712 int32_t pAddend) const { 1713 pRel.r_offset = pOffset; 1714 pRel.r_addend = pAddend; 1715 pRel.setSymbolAndType(pSymIdx, pType); 1716 } 1717 1718 /// emitRelocation - write data to the ELF64_Rel entry 1719 void GNULDBackend::emitRelocation(llvm::ELF::Elf64_Rel& pRel, 1720 Relocation::Type pType, 1721 uint32_t pSymIdx, 1722 uint64_t pOffset) const { 1723 pRel.r_offset = pOffset; 1724 pRel.setSymbolAndType(pSymIdx, pType); 1725 } 1726 1727 /// emitRelocation - write data to the ELF64_Rela entry 1728 void GNULDBackend::emitRelocation(llvm::ELF::Elf64_Rela& pRel, 1729 Relocation::Type pType, 1730 uint32_t pSymIdx, 1731 uint64_t pOffset, 1732 int64_t pAddend) const { 1733 pRel.r_offset = pOffset; 1734 pRel.r_addend = pAddend; 1735 pRel.setSymbolAndType(pSymIdx, pType); 1736 } 1737 1738 /// createProgramHdrs - base on output sections to create the program headers 1739 void GNULDBackend::createProgramHdrs(Module& pModule) { 1740 ELFFileFormat* file_format = getOutputFormat(); 1741 1742 // make PT_INTERP 1743 if (file_format->hasInterp()) { 1744 // make PT_PHDR 1745 elfSegmentTable().produce(llvm::ELF::PT_PHDR); 1746 1747 ELFSegment* interp_seg = elfSegmentTable().produce(llvm::ELF::PT_INTERP); 1748 interp_seg->append(&file_format->getInterp()); 1749 } 1750 1751 uint32_t cur_flag, prev_flag = 0x0; 1752 ELFSegment* load_seg = NULL; 1753 // make possible PT_LOAD segments 1754 LinkerScript& ldscript = pModule.getScript(); 1755 LinkerScript::AddressMap::iterator addrEnd = ldscript.addressMap().end(); 1756 SectionMap::iterator out, prev, outBegin, outEnd; 1757 outBegin = ldscript.sectionMap().begin(); 1758 outEnd = ldscript.sectionMap().end(); 1759 for (out = outBegin, prev = outEnd; out != outEnd; prev = out, ++out) { 1760 LDSection* sect = (*out)->getSection(); 1761 1762 if (0 == (sect->flag() & llvm::ELF::SHF_ALLOC) && 1763 LDFileFormat::Null != sect->kind()) 1764 break; 1765 1766 // bypass empty sections 1767 if (!(*out)->hasContent() && 1768 (*out)->getSection()->kind() != LDFileFormat::Null) 1769 continue; 1770 1771 cur_flag = getSegmentFlag(sect->flag()); 1772 bool createPT_LOAD = false; 1773 if (LDFileFormat::Null == sect->kind()) { 1774 // 1. create text segment 1775 createPT_LOAD = true; 1776 } else if (!config().options().omagic() && 1777 (prev_flag & llvm::ELF::PF_W) ^ (cur_flag & llvm::ELF::PF_W)) { 1778 // 2. create data segment if w/o omagic set 1779 createPT_LOAD = true; 1780 } else if (sect->kind() == LDFileFormat::BSS && load_seg->isDataSegment() && 1781 addrEnd != ldscript.addressMap().find(".bss")) { 1782 // 3. create bss segment if w/ -Tbss and there is a data segment 1783 createPT_LOAD = true; 1784 } else if ((sect != &(file_format->getText())) && 1785 (sect != &(file_format->getData())) && 1786 (sect != &(file_format->getBSS())) && 1787 (addrEnd != ldscript.addressMap().find(sect->name()))) { 1788 // 4. create PT_LOAD for sections in address map except for text, data, 1789 // and bss 1790 createPT_LOAD = true; 1791 } else if (LDFileFormat::Null == (*prev)->getSection()->kind() && 1792 !config().options().getScriptList().empty()) { 1793 // 5. create PT_LOAD to hold NULL section if there is a default ldscript 1794 createPT_LOAD = true; 1795 } 1796 1797 if (createPT_LOAD) { 1798 // create new PT_LOAD segment 1799 load_seg = elfSegmentTable().produce(llvm::ELF::PT_LOAD, cur_flag); 1800 if (!config().options().nmagic() && !config().options().omagic()) 1801 load_seg->setAlign(abiPageSize()); 1802 } 1803 1804 assert(load_seg != NULL); 1805 load_seg->append(sect); 1806 if (cur_flag != prev_flag) 1807 load_seg->updateFlag(cur_flag); 1808 1809 prev_flag = cur_flag; 1810 } 1811 1812 // make PT_DYNAMIC 1813 if (file_format->hasDynamic()) { 1814 ELFSegment* dyn_seg = elfSegmentTable().produce( 1815 llvm::ELF::PT_DYNAMIC, llvm::ELF::PF_R | llvm::ELF::PF_W); 1816 dyn_seg->append(&file_format->getDynamic()); 1817 } 1818 1819 if (config().options().hasRelro()) { 1820 // make PT_GNU_RELRO 1821 ELFSegment* relro_seg = elfSegmentTable().produce(llvm::ELF::PT_GNU_RELRO); 1822 for (ELFSegmentFactory::iterator seg = elfSegmentTable().begin(), 1823 segEnd = elfSegmentTable().end(); 1824 seg != segEnd; 1825 ++seg) { 1826 if (llvm::ELF::PT_LOAD != (*seg)->type()) 1827 continue; 1828 1829 for (ELFSegment::iterator sect = (*seg)->begin(), sectEnd = (*seg)->end(); 1830 sect != sectEnd; 1831 ++sect) { 1832 unsigned int order = getSectionOrder(**sect); 1833 if (SHO_RELRO_LOCAL == order || SHO_RELRO == order || 1834 SHO_RELRO_LAST == order) { 1835 relro_seg->append(*sect); 1836 } 1837 } 1838 } 1839 } 1840 1841 // make PT_GNU_EH_FRAME 1842 if (file_format->hasEhFrameHdr()) { 1843 ELFSegment* eh_seg = elfSegmentTable().produce(llvm::ELF::PT_GNU_EH_FRAME); 1844 eh_seg->append(&file_format->getEhFrameHdr()); 1845 } 1846 1847 // make PT_TLS 1848 if (file_format->hasTData() || file_format->hasTBSS()) { 1849 ELFSegment* tls_seg = elfSegmentTable().produce(llvm::ELF::PT_TLS); 1850 if (file_format->hasTData()) 1851 tls_seg->append(&file_format->getTData()); 1852 if (file_format->hasTBSS()) 1853 tls_seg->append(&file_format->getTBSS()); 1854 } 1855 1856 // make PT_GNU_STACK 1857 if (file_format->hasStackNote()) { 1858 uint32_t flag = getSegmentFlag(file_format->getStackNote().flag()); 1859 elfSegmentTable().produce(llvm::ELF::PT_GNU_STACK, 1860 llvm::ELF::PF_R | llvm::ELF::PF_W | flag); 1861 } 1862 1863 // make PT_NOTE 1864 ELFSegment* note_seg = NULL; 1865 prev_flag = 0x0; 1866 Module::iterator sect, sectBegin, sectEnd; 1867 sectBegin = pModule.begin(); 1868 sectEnd = pModule.end(); 1869 for (sect = sectBegin; sect != sectEnd; ++sect) { 1870 if ((*sect)->type() != llvm::ELF::SHT_NOTE || 1871 ((*sect)->flag() & llvm::ELF::SHF_ALLOC) == 0) 1872 continue; 1873 1874 cur_flag = getSegmentFlag((*sect)->flag()); 1875 // we have different section orders for read-only and writable notes, so 1876 // create 2 segments if needed. 1877 if (note_seg == NULL || 1878 (cur_flag & llvm::ELF::PF_W) != (prev_flag & llvm::ELF::PF_W)) 1879 note_seg = elfSegmentTable().produce(llvm::ELF::PT_NOTE, cur_flag); 1880 1881 note_seg->append(*sect); 1882 prev_flag = cur_flag; 1883 } 1884 1885 // create target dependent segments 1886 doCreateProgramHdrs(pModule); 1887 } 1888 1889 /// setupProgramHdrs - set up the attributes of segments 1890 void GNULDBackend::setupProgramHdrs(const LinkerScript& pScript) { 1891 // update segment info 1892 for (ELFSegmentFactory::iterator seg = elfSegmentTable().begin(), 1893 segEnd = elfSegmentTable().end(); 1894 seg != segEnd; 1895 ++seg) { 1896 // bypass if there is no section in this segment (e.g., PT_GNU_STACK) 1897 if ((*seg)->size() == 0) 1898 continue; 1899 1900 // bypass the PT_LOAD that only has NULL section now 1901 if ((*seg)->type() == llvm::ELF::PT_LOAD && 1902 (*seg)->front()->kind() == LDFileFormat::Null && (*seg)->size() == 1) 1903 continue; 1904 1905 (*seg)->setOffset((*seg)->front()->offset()); 1906 if ((*seg)->type() == llvm::ELF::PT_LOAD && 1907 (*seg)->front()->kind() == LDFileFormat::Null) { 1908 const LDSection* second = *((*seg)->begin() + 1); 1909 assert(second != NULL); 1910 (*seg)->setVaddr(second->addr() - second->offset()); 1911 } else { 1912 (*seg)->setVaddr((*seg)->front()->addr()); 1913 } 1914 (*seg)->setPaddr((*seg)->vaddr()); 1915 1916 ELFSegment::reverse_iterator sect, sectREnd = (*seg)->rend(); 1917 for (sect = (*seg)->rbegin(); sect != sectREnd; ++sect) { 1918 if ((*sect)->kind() != LDFileFormat::BSS) 1919 break; 1920 } 1921 if (sect != sectREnd) { 1922 (*seg)->setFilesz((*sect)->offset() + (*sect)->size() - (*seg)->offset()); 1923 } else { 1924 (*seg)->setFilesz(0x0); 1925 } 1926 1927 (*seg)->setMemsz((*seg)->back()->addr() + (*seg)->back()->size() - 1928 (*seg)->vaddr()); 1929 } // end of for 1930 1931 // handle the case if text segment only has NULL section 1932 LDSection* null_sect = &getOutputFormat()->getNULLSection(); 1933 ELFSegmentFactory::iterator null_seg = 1934 elfSegmentTable().find(llvm::ELF::PT_LOAD, null_sect); 1935 1936 if ((*null_seg)->size() == 1) { 1937 // find 2nd PT_LOAD 1938 ELFSegmentFactory::iterator seg, segEnd = elfSegmentTable().end(); 1939 for (seg = null_seg + 1; seg != segEnd; ++seg) { 1940 if ((*seg)->type() == llvm::ELF::PT_LOAD) 1941 break; 1942 } 1943 if (seg != segEnd) { 1944 uint64_t addr = (*seg)->front()->addr() - (*seg)->front()->offset(); 1945 uint64_t size = sectionStartOffset(); 1946 if (addr + size == (*seg)->front()->addr()) { 1947 // if there is no space between the 2 segments, we can merge them. 1948 (*seg)->setOffset(0x0); 1949 (*seg)->setVaddr(addr); 1950 (*seg)->setPaddr(addr); 1951 1952 ELFSegment::iterator sect, sectEnd = (*seg)->end(); 1953 for (sect = (*seg)->begin(); sect != sectEnd; ++sect) { 1954 if ((*sect)->kind() == LDFileFormat::BSS) { 1955 --sect; 1956 break; 1957 } 1958 } 1959 if (sect == sectEnd) { 1960 (*seg)->setFilesz((*seg)->back()->offset() + (*seg)->back()->size() - 1961 (*seg)->offset()); 1962 } else if (*sect != (*seg)->front()) { 1963 --sect; 1964 (*seg)->setFilesz((*sect)->offset() + (*sect)->size() - 1965 (*seg)->offset()); 1966 } else { 1967 (*seg)->setFilesz(0x0); 1968 } 1969 1970 (*seg)->setMemsz((*seg)->back()->addr() + (*seg)->back()->size() - 1971 (*seg)->vaddr()); 1972 1973 (*seg)->insert((*seg)->begin(), null_sect); 1974 elfSegmentTable().erase(null_seg); 1975 1976 } else if (addr + size < (*seg)->vaddr()) { 1977 (*null_seg)->setOffset(0x0); 1978 (*null_seg)->setVaddr(addr); 1979 (*null_seg)->setPaddr(addr); 1980 (*null_seg)->setFilesz(size); 1981 (*null_seg)->setMemsz(size); 1982 } else { 1983 // erase the non valid segment contains NULL. 1984 elfSegmentTable().erase(null_seg); 1985 } 1986 } 1987 } 1988 1989 // set up PT_PHDR 1990 ELFSegmentFactory::iterator phdr = 1991 elfSegmentTable().find(llvm::ELF::PT_PHDR, llvm::ELF::PF_R, 0x0); 1992 1993 if (phdr != elfSegmentTable().end()) { 1994 ELFSegmentFactory::iterator null_seg = 1995 elfSegmentTable().find(llvm::ELF::PT_LOAD, null_sect); 1996 if (null_seg != elfSegmentTable().end()) { 1997 uint64_t offset = 0x0, phdr_size = 0x0; 1998 if (config().targets().is32Bits()) { 1999 offset = sizeof(llvm::ELF::Elf32_Ehdr); 2000 phdr_size = sizeof(llvm::ELF::Elf32_Phdr); 2001 } else { 2002 offset = sizeof(llvm::ELF::Elf64_Ehdr); 2003 phdr_size = sizeof(llvm::ELF::Elf64_Phdr); 2004 } 2005 (*phdr)->setOffset(offset); 2006 (*phdr)->setVaddr((*null_seg)->vaddr() + offset); 2007 (*phdr)->setPaddr((*phdr)->vaddr()); 2008 (*phdr)->setFilesz(elfSegmentTable().size() * phdr_size); 2009 (*phdr)->setMemsz(elfSegmentTable().size() * phdr_size); 2010 (*phdr)->setAlign(config().targets().bitclass() / 8); 2011 } else { 2012 elfSegmentTable().erase(phdr); 2013 } 2014 } 2015 } 2016 2017 /// getSegmentFlag - give a section flag and return the corresponding segment 2018 /// flag 2019 uint32_t GNULDBackend::getSegmentFlag(const uint32_t pSectionFlag) { 2020 uint32_t flag = 0x0; 2021 if ((pSectionFlag & llvm::ELF::SHF_ALLOC) != 0x0) 2022 flag |= llvm::ELF::PF_R; 2023 if ((pSectionFlag & llvm::ELF::SHF_WRITE) != 0x0) 2024 flag |= llvm::ELF::PF_W; 2025 if ((pSectionFlag & llvm::ELF::SHF_EXECINSTR) != 0x0) 2026 flag |= llvm::ELF::PF_X; 2027 return flag; 2028 } 2029 2030 /// setupGNUStackInfo - setup the section flag of .note.GNU-stack in output 2031 void GNULDBackend::setupGNUStackInfo(Module& pModule) { 2032 uint32_t flag = 0x0; 2033 if (config().options().hasStackSet()) { 2034 // 1. check the command line option (-z execstack or -z noexecstack) 2035 if (config().options().hasExecStack()) 2036 flag = llvm::ELF::SHF_EXECINSTR; 2037 } else { 2038 // 2. check the stack info from the input objects 2039 // FIXME: since we alway emit .note.GNU-stack in output now, we may be able 2040 // to check this from the output .note.GNU-stack directly after section 2041 // merging is done 2042 size_t object_count = 0, stack_note_count = 0; 2043 Module::const_obj_iterator obj, objEnd = pModule.obj_end(); 2044 for (obj = pModule.obj_begin(); obj != objEnd; ++obj) { 2045 ++object_count; 2046 const LDSection* sect = (*obj)->context()->getSection(".note.GNU-stack"); 2047 if (sect != NULL) { 2048 ++stack_note_count; 2049 // 2.1 found a stack note that is set as executable 2050 if (0 != (llvm::ELF::SHF_EXECINSTR & sect->flag())) { 2051 flag = llvm::ELF::SHF_EXECINSTR; 2052 break; 2053 } 2054 } 2055 } 2056 2057 // 2.2 there are no stack note sections in all input objects 2058 if (0 == stack_note_count) 2059 return; 2060 2061 // 2.3 a special case. Use the target default to decide if the stack should 2062 // be executable 2063 if (llvm::ELF::SHF_EXECINSTR != flag && object_count != stack_note_count) 2064 if (m_pInfo->isDefaultExecStack()) 2065 flag = llvm::ELF::SHF_EXECINSTR; 2066 } 2067 2068 if (getOutputFormat()->hasStackNote()) { 2069 getOutputFormat()->getStackNote().setFlag(flag); 2070 } 2071 } 2072 2073 /// setOutputSectionOffset - helper function to set output sections' offset. 2074 void GNULDBackend::setOutputSectionOffset(Module& pModule) { 2075 LinkerScript& script = pModule.getScript(); 2076 uint64_t offset = 0x0; 2077 LDSection* cur = NULL; 2078 LDSection* prev = NULL; 2079 SectionMap::iterator out, outBegin, outEnd; 2080 outBegin = script.sectionMap().begin(); 2081 outEnd = script.sectionMap().end(); 2082 for (out = outBegin; out != outEnd; ++out, prev = cur) { 2083 cur = (*out)->getSection(); 2084 if (cur->kind() == LDFileFormat::Null) { 2085 cur->setOffset(0x0); 2086 continue; 2087 } 2088 2089 switch (prev->kind()) { 2090 case LDFileFormat::Null: 2091 offset = sectionStartOffset(); 2092 break; 2093 case LDFileFormat::BSS: 2094 offset = prev->offset(); 2095 break; 2096 default: 2097 offset = prev->offset() + prev->size(); 2098 break; 2099 } 2100 alignAddress(offset, cur->align()); 2101 cur->setOffset(offset); 2102 } 2103 } 2104 2105 /// setOutputSectionAddress - helper function to set output sections' address. 2106 void GNULDBackend::setOutputSectionAddress(Module& pModule) { 2107 RpnEvaluator evaluator(pModule, *this); 2108 LinkerScript& script = pModule.getScript(); 2109 uint64_t vma = 0x0, offset = 0x0; 2110 LDSection* cur = NULL; 2111 LDSection* prev = NULL; 2112 LinkerScript::AddressMap::iterator addr, addrEnd = script.addressMap().end(); 2113 ELFSegmentFactory::iterator seg, segEnd = elfSegmentTable().end(); 2114 SectionMap::Output::dot_iterator dot; 2115 SectionMap::iterator out, outBegin, outEnd; 2116 outBegin = script.sectionMap().begin(); 2117 outEnd = script.sectionMap().end(); 2118 for (out = outBegin; out != outEnd; prev = cur, ++out) { 2119 cur = (*out)->getSection(); 2120 2121 if (cur->kind() == LDFileFormat::Null) { 2122 cur->setOffset(0x0); 2123 continue; 2124 } 2125 2126 // process dot assignments between 2 output sections 2127 for (SectionMap::Output::dot_iterator it = (*out)->dot_begin(), 2128 ie = (*out)->dot_end(); 2129 it != ie; 2130 ++it) { 2131 (*it).assign(evaluator); 2132 } 2133 2134 seg = elfSegmentTable().find(llvm::ELF::PT_LOAD, cur); 2135 if (seg != segEnd && cur == (*seg)->front()) { 2136 if ((*seg)->isBssSegment()) 2137 addr = script.addressMap().find(".bss"); 2138 else if ((*seg)->isDataSegment()) 2139 addr = script.addressMap().find(".data"); 2140 else 2141 addr = script.addressMap().find(cur->name()); 2142 } else 2143 addr = addrEnd; 2144 2145 if (addr != addrEnd) { 2146 // use address mapping in script options 2147 vma = addr.getEntry()->value(); 2148 } else if ((*out)->prolog().hasVMA()) { 2149 // use address from output section description 2150 evaluator.eval((*out)->prolog().vma(), vma); 2151 } else if ((dot = (*out)->find_last_explicit_dot()) != (*out)->dot_end()) { 2152 // assign address based on `.' symbol in ldscript 2153 vma = (*dot).symbol().value(); 2154 alignAddress(vma, cur->align()); 2155 } else { 2156 if ((*out)->prolog().type() == OutputSectDesc::NOLOAD) { 2157 vma = prev->addr() + prev->size(); 2158 } else if ((cur->flag() & llvm::ELF::SHF_ALLOC) != 0) { 2159 if (prev->kind() == LDFileFormat::Null) { 2160 // Let SECTIONS starts at 0 if we have a default ldscript but don't 2161 // have any initial value (VMA or `.'). 2162 if (!config().options().getScriptList().empty()) 2163 vma = 0x0; 2164 else 2165 vma = getSegmentStartAddr(script) + sectionStartOffset(); 2166 } else { 2167 if ((prev->kind() == LDFileFormat::BSS)) 2168 vma = prev->addr(); 2169 else 2170 vma = prev->addr() + prev->size(); 2171 } 2172 alignAddress(vma, cur->align()); 2173 if (config().options().getScriptList().empty()) { 2174 if (seg != segEnd && cur == (*seg)->front()) { 2175 // Try to align p_vaddr at page boundary if not in script options. 2176 // To do so will add more padding in file, but can save one page 2177 // at runtime. 2178 // Avoid doing this optimization if -z relro is given, because there 2179 // seems to be too many padding. 2180 if (!config().options().hasRelro()) { 2181 alignAddress(vma, (*seg)->align()); 2182 } else { 2183 vma += abiPageSize(); 2184 } 2185 } 2186 } 2187 } else { 2188 vma = 0x0; 2189 } 2190 } 2191 2192 if (config().options().hasRelro()) { 2193 // if -z relro is given, we need to adjust sections' offset again, and 2194 // let PT_GNU_RELRO end on a abi page boundary 2195 2196 // check if current is the first non-relro section 2197 SectionMap::iterator relro_last = out - 1; 2198 if (relro_last != outEnd && (*relro_last)->order() <= SHO_RELRO_LAST && 2199 (*out)->order() > SHO_RELRO_LAST) { 2200 // align the first non-relro section to page boundary 2201 alignAddress(vma, abiPageSize()); 2202 2203 // It seems that compiler think .got and .got.plt are continuous (w/o 2204 // any padding between). If .got is the last section in PT_RELRO and 2205 // it's not continuous to its next section (i.e. .got.plt), we need to 2206 // add padding in front of .got instead. 2207 // FIXME: Maybe we can handle this in a more general way. 2208 LDSection& got = getOutputFormat()->getGOT(); 2209 if ((getSectionOrder(got) == SHO_RELRO_LAST) && 2210 (got.addr() + got.size() < vma)) { 2211 uint64_t diff = vma - got.addr() - got.size(); 2212 got.setAddr(vma - got.size()); 2213 got.setOffset(got.offset() + diff); 2214 } 2215 } 2216 } // end of if - for relro processing 2217 2218 cur->setAddr(vma); 2219 2220 switch (prev->kind()) { 2221 case LDFileFormat::Null: 2222 offset = sectionStartOffset(); 2223 break; 2224 case LDFileFormat::BSS: 2225 offset = prev->offset(); 2226 break; 2227 default: 2228 offset = prev->offset() + prev->size(); 2229 break; 2230 } 2231 alignAddress(offset, cur->align()); 2232 // in p75,http://www.sco.com/developers/devspecs/gabi41.pdf 2233 // p_align: As "Program Loading" describes in this chapter of the 2234 // processor supplement, loadable process segments must have congruent 2235 // values for p_vaddr and p_offset, modulo the page size. 2236 // FIXME: Now make all sh_addr and sh_offset are congruent, modulo the page 2237 // size. Otherwise, old objcopy (e.g., binutils 2.17) may fail with our 2238 // output! 2239 if ((cur->flag() & llvm::ELF::SHF_ALLOC) != 0 && 2240 (vma & (abiPageSize() - 1)) != (offset & (abiPageSize() - 1))) { 2241 uint64_t padding = abiPageSize() + (vma & (abiPageSize() - 1)) - 2242 (offset & (abiPageSize() - 1)); 2243 offset += padding; 2244 } 2245 2246 cur->setOffset(offset); 2247 2248 // process dot assignments in the output section 2249 bool changed = false; 2250 Fragment* invalid = NULL; 2251 for (SectionMap::Output::iterator in = (*out)->begin(), 2252 inEnd = (*out)->end(); 2253 in != inEnd; 2254 ++in) { 2255 if (invalid != NULL && !(*in)->dotAssignments().empty()) { 2256 while (invalid != (*in)->dotAssignments().front().first) { 2257 Fragment* prev = invalid->getPrevNode(); 2258 invalid->setOffset(prev->getOffset() + prev->size()); 2259 invalid = invalid->getNextNode(); 2260 } 2261 invalid = NULL; 2262 } 2263 2264 for (SectionMap::Input::dot_iterator it = (*in)->dot_begin(), 2265 ie = (*in)->dot_end(); 2266 it != ie; 2267 ++it) { 2268 (*it).second.assign(evaluator); 2269 if ((*it).first != NULL) { 2270 uint64_t new_offset = (*it).second.symbol().value() - vma; 2271 if (new_offset != (*it).first->getOffset()) { 2272 (*it).first->setOffset(new_offset); 2273 invalid = (*it).first->getNextNode(); 2274 changed = true; 2275 } 2276 } 2277 } // for each dot assignment 2278 } // for each input description 2279 2280 if (changed) { 2281 while (invalid != NULL) { 2282 Fragment* prev = invalid->getPrevNode(); 2283 invalid->setOffset(prev->getOffset() + prev->size()); 2284 invalid = invalid->getNextNode(); 2285 } 2286 2287 cur->setSize(cur->getSectionData()->back().getOffset() + 2288 cur->getSectionData()->back().size()); 2289 } 2290 } // for each output section description 2291 } 2292 2293 /// placeOutputSections - place output sections based on SectionMap 2294 void GNULDBackend::placeOutputSections(Module& pModule) { 2295 typedef std::vector<LDSection*> Orphans; 2296 Orphans orphans; 2297 SectionMap& sectionMap = pModule.getScript().sectionMap(); 2298 2299 for (Module::iterator it = pModule.begin(), ie = pModule.end(); it != ie; 2300 ++it) { 2301 bool wanted = false; 2302 2303 switch ((*it)->kind()) { 2304 // take NULL and StackNote directly 2305 case LDFileFormat::Null: 2306 case LDFileFormat::StackNote: 2307 wanted = true; 2308 break; 2309 // ignore if section size is 0 2310 case LDFileFormat::EhFrame: 2311 if (((*it)->size() != 0) || 2312 ((*it)->hasEhFrame() && 2313 config().codeGenType() == LinkerConfig::Object)) 2314 wanted = true; 2315 break; 2316 case LDFileFormat::Relocation: 2317 if (((*it)->size() != 0) || 2318 ((*it)->hasRelocData() && 2319 config().codeGenType() == LinkerConfig::Object)) 2320 wanted = true; 2321 break; 2322 case LDFileFormat::TEXT: 2323 case LDFileFormat::DATA: 2324 case LDFileFormat::Target: 2325 case LDFileFormat::MetaData: 2326 case LDFileFormat::BSS: 2327 case LDFileFormat::Debug: 2328 case LDFileFormat::DebugString: 2329 case LDFileFormat::GCCExceptTable: 2330 case LDFileFormat::Note: 2331 case LDFileFormat::NamePool: 2332 case LDFileFormat::EhFrameHdr: 2333 if (((*it)->size() != 0) || 2334 ((*it)->hasSectionData() && 2335 config().codeGenType() == LinkerConfig::Object)) 2336 wanted = true; 2337 break; 2338 case LDFileFormat::Group: 2339 if (LinkerConfig::Object == config().codeGenType()) { 2340 // TODO: support incremental linking 2341 } 2342 break; 2343 case LDFileFormat::Version: 2344 if ((*it)->size() != 0) { 2345 wanted = true; 2346 warning(diag::warn_unsupported_symbolic_versioning) << (*it)->name(); 2347 } 2348 break; 2349 default: 2350 if ((*it)->size() != 0) { 2351 error(diag::err_unsupported_section) << (*it)->name() 2352 << (*it)->kind(); 2353 } 2354 break; 2355 } // end of switch 2356 2357 if (wanted) { 2358 SectionMap::iterator out, outBegin, outEnd; 2359 outBegin = sectionMap.begin(); 2360 outEnd = sectionMap.end(); 2361 for (out = outBegin; out != outEnd; ++out) { 2362 bool matched = false; 2363 if ((*it)->name().compare((*out)->name()) == 0) { 2364 switch ((*out)->prolog().constraint()) { 2365 case OutputSectDesc::NO_CONSTRAINT: 2366 matched = true; 2367 break; 2368 case OutputSectDesc::ONLY_IF_RO: 2369 matched = ((*it)->flag() & llvm::ELF::SHF_WRITE) == 0; 2370 break; 2371 case OutputSectDesc::ONLY_IF_RW: 2372 matched = ((*it)->flag() & llvm::ELF::SHF_WRITE) != 0; 2373 break; 2374 } // end of switch 2375 2376 if (matched) 2377 break; 2378 } 2379 } // for each output section description 2380 2381 if (out != outEnd) { 2382 // set up the section 2383 (*out)->setSection(*it); 2384 (*out)->setOrder(getSectionOrder(**it)); 2385 } else { 2386 orphans.push_back(*it); 2387 } 2388 } 2389 } // for each section in Module 2390 2391 // set up sections in SectionMap but do not exist at all. 2392 uint32_t flag = 0x0; 2393 unsigned int order = SHO_UNDEFINED; 2394 OutputSectDesc::Type type = OutputSectDesc::LOAD; 2395 for (SectionMap::reverse_iterator out = sectionMap.rbegin(), 2396 outEnd = sectionMap.rend(); 2397 out != outEnd; 2398 ++out) { 2399 if ((*out)->hasContent() || 2400 (*out)->getSection()->kind() == LDFileFormat::Null || 2401 (*out)->getSection()->kind() == LDFileFormat::StackNote) { 2402 flag = (*out)->getSection()->flag(); 2403 order = (*out)->order(); 2404 type = (*out)->prolog().type(); 2405 } else { 2406 (*out)->getSection()->setFlag(flag); 2407 (*out)->setOrder(order); 2408 (*out)->prolog().setType(type); 2409 } 2410 } // for each output section description 2411 2412 // place orphan sections 2413 for (Orphans::iterator it = orphans.begin(), ie = orphans.end(); it != ie; 2414 ++it) { 2415 size_t order = getSectionOrder(**it); 2416 SectionMap::iterator out, outBegin, outEnd; 2417 outBegin = sectionMap.begin(); 2418 outEnd = sectionMap.end(); 2419 2420 if ((*it)->kind() == LDFileFormat::Null) 2421 out = sectionMap.insert(outBegin, *it); 2422 else { 2423 for (out = outBegin; out != outEnd; ++out) { 2424 if ((*out)->order() > order) 2425 break; 2426 } 2427 out = sectionMap.insert(out, *it); 2428 } 2429 (*out)->setOrder(order); 2430 } // for each orphan section 2431 2432 // sort output section orders if there is no default ldscript 2433 if (config().options().getScriptList().empty()) { 2434 std::stable_sort( 2435 sectionMap.begin(), sectionMap.end(), SectionMap::SHOCompare()); 2436 } 2437 2438 // when section ordering is fixed, now we can make sure dot assignments are 2439 // all set appropriately 2440 sectionMap.fixupDotSymbols(); 2441 } 2442 2443 /// layout - layout method 2444 void GNULDBackend::layout(Module& pModule) { 2445 // 1. place output sections based on SectionMap from SECTIONS command 2446 placeOutputSections(pModule); 2447 2448 // 2. update output sections in Module 2449 SectionMap& sectionMap = pModule.getScript().sectionMap(); 2450 pModule.getSectionTable().clear(); 2451 for (SectionMap::iterator out = sectionMap.begin(), outEnd = sectionMap.end(); 2452 out != outEnd; 2453 ++out) { 2454 if ((*out)->hasContent() || 2455 (*out)->getSection()->kind() == LDFileFormat::Null || 2456 (*out)->getSection()->kind() == LDFileFormat::StackNote || 2457 config().codeGenType() == LinkerConfig::Object) { 2458 (*out)->getSection()->setIndex(pModule.size()); 2459 pModule.getSectionTable().push_back((*out)->getSection()); 2460 } 2461 } // for each output section description 2462 2463 // 3. update the size of .shstrtab 2464 sizeShstrtab(pModule); 2465 2466 // 4. create program headers 2467 if (LinkerConfig::Object != config().codeGenType()) { 2468 createProgramHdrs(pModule); 2469 } 2470 2471 // 5. set output section address/offset 2472 if (LinkerConfig::Object != config().codeGenType()) 2473 setOutputSectionAddress(pModule); 2474 else 2475 setOutputSectionOffset(pModule); 2476 } 2477 2478 void GNULDBackend::createAndSizeEhFrameHdr(Module& pModule) { 2479 if (LinkerConfig::Object != config().codeGenType() && 2480 config().options().hasEhFrameHdr() && getOutputFormat()->hasEhFrame()) { 2481 // init EhFrameHdr and size the output section 2482 ELFFileFormat* format = getOutputFormat(); 2483 m_pEhFrameHdr = 2484 new EhFrameHdr(format->getEhFrameHdr(), format->getEhFrame()); 2485 m_pEhFrameHdr->sizeOutput(); 2486 } 2487 } 2488 2489 /// mayHaveUnsafeFunctionPointerAccess - check if the section may have unsafe 2490 /// function pointer access 2491 bool GNULDBackend::mayHaveUnsafeFunctionPointerAccess( 2492 const LDSection& pSection) const { 2493 llvm::StringRef name(pSection.name()); 2494 return !name.startswith(".rodata._ZTV") && 2495 !name.startswith(".data.rel.ro._ZTV") && 2496 !name.startswith(".rodata._ZTC") && 2497 !name.startswith(".data.rel.ro._ZTC") && !name.startswith(".eh_frame"); 2498 } 2499 2500 /// preLayout - Backend can do any needed modification before layout 2501 void GNULDBackend::preLayout(Module& pModule, IRBuilder& pBuilder) { 2502 // prelayout target first 2503 doPreLayout(pBuilder); 2504 2505 // change .tbss and .tdata section symbol from Local to LocalDyn category 2506 if (f_pTDATA != NULL) 2507 pModule.getSymbolTable().changeToDynamic(*f_pTDATA); 2508 2509 if (f_pTBSS != NULL) 2510 pModule.getSymbolTable().changeToDynamic(*f_pTBSS); 2511 2512 // To merge input's relocation sections into output's relocation sections. 2513 // 2514 // If we are generating relocatables (-r), move input relocation sections 2515 // to corresponding output relocation sections. 2516 if (LinkerConfig::Object == config().codeGenType()) { 2517 Module::obj_iterator input, inEnd = pModule.obj_end(); 2518 for (input = pModule.obj_begin(); input != inEnd; ++input) { 2519 LDContext::sect_iterator rs, rsEnd = (*input)->context()->relocSectEnd(); 2520 for (rs = (*input)->context()->relocSectBegin(); rs != rsEnd; ++rs) { 2521 // get the output relocation LDSection with identical name. 2522 LDSection* output_sect = pModule.getSection((*rs)->name()); 2523 if (output_sect == NULL) { 2524 output_sect = LDSection::Create( 2525 (*rs)->name(), (*rs)->kind(), (*rs)->type(), (*rs)->flag()); 2526 2527 output_sect->setAlign((*rs)->align()); 2528 pModule.getSectionTable().push_back(output_sect); 2529 } 2530 2531 // set output relocation section link 2532 const LDSection* input_link = (*rs)->getLink(); 2533 assert(input_link != NULL && "Illegal input relocation section."); 2534 2535 // get the linked output section 2536 LDSection* output_link = pModule.getSection(input_link->name()); 2537 assert(output_link != NULL); 2538 2539 output_sect->setLink(output_link); 2540 2541 // get output relcoationData, create one if not exist 2542 if (!output_sect->hasRelocData()) 2543 IRBuilder::CreateRelocData(*output_sect); 2544 2545 RelocData* out_reloc_data = output_sect->getRelocData(); 2546 2547 // move relocations from input's to output's RelcoationData 2548 RelocData::RelocationListType& out_list = 2549 out_reloc_data->getRelocationList(); 2550 RelocData::RelocationListType& in_list = 2551 (*rs)->getRelocData()->getRelocationList(); 2552 out_list.splice(out_list.end(), in_list); 2553 2554 // size output 2555 if (llvm::ELF::SHT_REL == output_sect->type()) 2556 output_sect->setSize(out_reloc_data->size() * getRelEntrySize()); 2557 else if (llvm::ELF::SHT_RELA == output_sect->type()) 2558 output_sect->setSize(out_reloc_data->size() * getRelaEntrySize()); 2559 else { 2560 fatal(diag::unknown_reloc_section_type) << output_sect->type() 2561 << output_sect->name(); 2562 } 2563 } // end of for each relocation section 2564 } // end of for each input 2565 } // end of if 2566 2567 // set up the section flag of .note.GNU-stack section 2568 setupGNUStackInfo(pModule); 2569 } 2570 2571 /// postLayout - Backend can do any needed modification after layout 2572 void GNULDBackend::postLayout(Module& pModule, IRBuilder& pBuilder) { 2573 if (LinkerConfig::Object != config().codeGenType()) { 2574 // do relaxation 2575 relax(pModule, pBuilder); 2576 // set up the attributes of program headers 2577 setupProgramHdrs(pModule.getScript()); 2578 } 2579 2580 doPostLayout(pModule, pBuilder); 2581 } 2582 2583 void GNULDBackend::postProcessing(FileOutputBuffer& pOutput) { 2584 if (LinkerConfig::Object != config().codeGenType() && 2585 config().options().hasEhFrameHdr() && getOutputFormat()->hasEhFrame()) { 2586 // emit eh_frame_hdr 2587 m_pEhFrameHdr->emitOutput<32>(pOutput); 2588 } 2589 } 2590 2591 /// getHashBucketCount - calculate hash bucket count. 2592 unsigned GNULDBackend::getHashBucketCount(unsigned pNumOfSymbols, 2593 bool pIsGNUStyle) { 2594 static const unsigned int buckets[] = { 2595 1, 3, 17, 37, 67, 97, 131, 197, 263, 521, 1031, 2053, 4099, 8209, 16411, 2596 32771, 65537, 131101, 262147 2597 }; 2598 const unsigned buckets_count = sizeof buckets / sizeof buckets[0]; 2599 2600 unsigned int result = 1; 2601 for (unsigned i = 0; i < buckets_count; ++i) { 2602 if (pNumOfSymbols < buckets[i]) 2603 break; 2604 result = buckets[i]; 2605 } 2606 2607 if (pIsGNUStyle && result < 2) 2608 result = 2; 2609 2610 return result; 2611 } 2612 2613 /// getGNUHashMaskbitslog2 - calculate the number of mask bits in log2 2614 unsigned GNULDBackend::getGNUHashMaskbitslog2(unsigned pNumOfSymbols) const { 2615 uint32_t maskbitslog2 = 1; 2616 for (uint32_t x = pNumOfSymbols >> 1; x != 0; x >>= 1) 2617 ++maskbitslog2; 2618 2619 if (maskbitslog2 < 3) 2620 maskbitslog2 = 5; 2621 else if (((1U << (maskbitslog2 - 2)) & pNumOfSymbols) != 0) 2622 maskbitslog2 += 3; 2623 else 2624 maskbitslog2 += 2; 2625 2626 if (config().targets().bitclass() == 64 && maskbitslog2 == 5) 2627 maskbitslog2 = 6; 2628 2629 return maskbitslog2; 2630 } 2631 2632 /// isDynamicSymbol 2633 bool GNULDBackend::isDynamicSymbol(const LDSymbol& pSymbol) const { 2634 // If a local symbol is in the LDContext's symbol table, it's a real local 2635 // symbol. We should not add it 2636 if (pSymbol.binding() == ResolveInfo::Local) 2637 return false; 2638 2639 // If we are building shared object, and the visibility is external, we 2640 // need to add it. 2641 if (LinkerConfig::DynObj == config().codeGenType() || 2642 LinkerConfig::Exec == config().codeGenType() || 2643 LinkerConfig::Binary == config().codeGenType()) { 2644 if (pSymbol.resolveInfo()->visibility() == ResolveInfo::Default || 2645 pSymbol.resolveInfo()->visibility() == ResolveInfo::Protected) 2646 return true; 2647 } 2648 return false; 2649 } 2650 2651 /// isDynamicSymbol 2652 bool GNULDBackend::isDynamicSymbol(const ResolveInfo& pResolveInfo) const { 2653 // If a local symbol is in the LDContext's symbol table, it's a real local 2654 // symbol. We should not add it 2655 if (pResolveInfo.binding() == ResolveInfo::Local) 2656 return false; 2657 2658 // If we are building shared object, and the visibility is external, we 2659 // need to add it. 2660 if (LinkerConfig::DynObj == config().codeGenType() || 2661 LinkerConfig::Exec == config().codeGenType() || 2662 LinkerConfig::Binary == config().codeGenType()) { 2663 if (pResolveInfo.visibility() == ResolveInfo::Default || 2664 pResolveInfo.visibility() == ResolveInfo::Protected) 2665 return true; 2666 } 2667 return false; 2668 } 2669 2670 /// elfSegmentTable - return the reference of the elf segment table 2671 ELFSegmentFactory& GNULDBackend::elfSegmentTable() { 2672 assert(m_pELFSegmentTable != NULL && "Do not create ELFSegmentTable!"); 2673 return *m_pELFSegmentTable; 2674 } 2675 2676 /// elfSegmentTable - return the reference of the elf segment table 2677 const ELFSegmentFactory& GNULDBackend::elfSegmentTable() const { 2678 assert(m_pELFSegmentTable != NULL && "Do not create ELFSegmentTable!"); 2679 return *m_pELFSegmentTable; 2680 } 2681 2682 /// commonPageSize - the common page size of the target machine. 2683 uint64_t GNULDBackend::commonPageSize() const { 2684 if (config().options().commPageSize() > 0) 2685 return std::min(config().options().commPageSize(), abiPageSize()); 2686 else 2687 return std::min(m_pInfo->commonPageSize(), abiPageSize()); 2688 } 2689 2690 /// abiPageSize - the abi page size of the target machine. 2691 uint64_t GNULDBackend::abiPageSize() const { 2692 if (config().options().maxPageSize() > 0) 2693 return config().options().maxPageSize(); 2694 else 2695 return m_pInfo->abiPageSize(); 2696 } 2697 2698 /// isSymbolPreemtible - whether the symbol can be preemted by other 2699 /// link unit 2700 bool GNULDBackend::isSymbolPreemptible(const ResolveInfo& pSym) const { 2701 if (pSym.other() != ResolveInfo::Default) 2702 return false; 2703 2704 // This is because the codeGenType of pie is DynObj. And gold linker check 2705 // the "shared" option instead. 2706 if (config().options().isPIE()) 2707 return false; 2708 2709 if (LinkerConfig::DynObj != config().codeGenType()) 2710 return false; 2711 2712 if (config().options().Bsymbolic()) 2713 return false; 2714 2715 // A local defined symbol should be non-preemptible. 2716 // This issue is found when linking libstdc++ on freebsd. A R_386_GOT32 2717 // relocation refers to a local defined symbol, and we should generate a 2718 // relative dynamic relocation when applying the relocation. 2719 if (pSym.isDefine() && pSym.binding() == ResolveInfo::Local) 2720 return false; 2721 2722 return true; 2723 } 2724 2725 /// symbolNeedsDynRel - return whether the symbol needs a dynamic relocation 2726 bool GNULDBackend::symbolNeedsDynRel(const ResolveInfo& pSym, 2727 bool pSymHasPLT, 2728 bool isAbsReloc) const { 2729 // an undefined reference in the executables should be statically 2730 // resolved to 0 and no need a dynamic relocation 2731 if (pSym.isUndef() && !pSym.isDyn() && 2732 (LinkerConfig::Exec == config().codeGenType() || 2733 LinkerConfig::Binary == config().codeGenType())) 2734 return false; 2735 2736 // An absolute symbol can be resolved directly if it is either local 2737 // or we are linking statically. Otherwise it can still be overridden 2738 // at runtime. 2739 if (pSym.isAbsolute() && 2740 (pSym.binding() == ResolveInfo::Local || config().isCodeStatic())) 2741 return false; 2742 if (config().isCodeIndep() && isAbsReloc) 2743 return true; 2744 if (pSymHasPLT && ResolveInfo::Function == pSym.type()) 2745 return false; 2746 if (!config().isCodeIndep() && pSymHasPLT) 2747 return false; 2748 if (pSym.isDyn() || pSym.isUndef() || isSymbolPreemptible(pSym)) 2749 return true; 2750 2751 return false; 2752 } 2753 2754 /// symbolNeedsPLT - return whether the symbol needs a PLT entry 2755 bool GNULDBackend::symbolNeedsPLT(const ResolveInfo& pSym) const { 2756 if (pSym.isUndef() && !pSym.isDyn() && 2757 LinkerConfig::DynObj != config().codeGenType()) 2758 return false; 2759 2760 // An IndirectFunc symbol (i.e., STT_GNU_IFUNC) always needs a plt entry 2761 if (pSym.type() == ResolveInfo::IndirectFunc) 2762 return true; 2763 2764 if (pSym.type() != ResolveInfo::Function) 2765 return false; 2766 2767 if (config().isCodeStatic()) 2768 return false; 2769 2770 if (config().options().isPIE()) 2771 return false; 2772 2773 return (pSym.isDyn() || pSym.isUndef() || isSymbolPreemptible(pSym)); 2774 } 2775 2776 /// symbolHasFinalValue - return true if the symbol's value can be decided at 2777 /// link time 2778 bool GNULDBackend::symbolFinalValueIsKnown(const ResolveInfo& pSym) const { 2779 // if the output is pic code or if not executables, symbols' value may change 2780 // at runtime 2781 // FIXME: CodeIndep() || LinkerConfig::Relocatable == CodeGenType 2782 if (config().isCodeIndep() || 2783 (LinkerConfig::Exec != config().codeGenType() && 2784 LinkerConfig::Binary != config().codeGenType())) 2785 return false; 2786 2787 // if the symbol is from dynamic object, then its value is unknown 2788 if (pSym.isDyn()) 2789 return false; 2790 2791 // if the symbol is not in dynamic object and is not undefined, then its value 2792 // is known 2793 if (!pSym.isUndef()) 2794 return true; 2795 2796 // if the symbol is undefined and not in dynamic objects, for example, a weak 2797 // undefined symbol, then whether the symbol's final value can be known 2798 // depends on whrther we're doing static link 2799 return config().isCodeStatic(); 2800 } 2801 2802 /// symbolNeedsCopyReloc - return whether the symbol needs a copy relocation 2803 bool GNULDBackend::symbolNeedsCopyReloc(const Relocation& pReloc, 2804 const ResolveInfo& pSym) const { 2805 // only the reference from dynamic executable to non-function symbol in 2806 // the dynamic objects may need copy relocation 2807 if (config().isCodeIndep() || !pSym.isDyn() || 2808 pSym.type() == ResolveInfo::Function || pSym.size() == 0) 2809 return false; 2810 2811 // check if the option -z nocopyreloc is given 2812 if (config().options().hasNoCopyReloc()) 2813 return false; 2814 2815 // TODO: Is this check necessary? 2816 // if relocation target place is readonly, a copy relocation is needed 2817 uint32_t flag = pReloc.targetRef().frag()->getParent()->getSection().flag(); 2818 if (0 == (flag & llvm::ELF::SHF_WRITE)) 2819 return true; 2820 2821 return false; 2822 } 2823 2824 LDSymbol& GNULDBackend::getTDATASymbol() { 2825 assert(f_pTDATA != NULL); 2826 return *f_pTDATA; 2827 } 2828 2829 const LDSymbol& GNULDBackend::getTDATASymbol() const { 2830 assert(f_pTDATA != NULL); 2831 return *f_pTDATA; 2832 } 2833 2834 LDSymbol& GNULDBackend::getTBSSSymbol() { 2835 assert(f_pTBSS != NULL); 2836 return *f_pTBSS; 2837 } 2838 2839 const LDSymbol& GNULDBackend::getTBSSSymbol() const { 2840 assert(f_pTBSS != NULL); 2841 return *f_pTBSS; 2842 } 2843 2844 llvm::StringRef GNULDBackend::getEntry(const Module& pModule) const { 2845 if (pModule.getScript().hasEntry()) 2846 return pModule.getScript().entry(); 2847 else 2848 return getInfo().entry(); 2849 } 2850 2851 void GNULDBackend::checkAndSetHasTextRel(const LDSection& pSection) { 2852 if (m_bHasTextRel) 2853 return; 2854 2855 // if the target section of the dynamic relocation is ALLOCATE but is not 2856 // writable, than we should set DF_TEXTREL 2857 const uint32_t flag = pSection.flag(); 2858 if (0 == (flag & llvm::ELF::SHF_WRITE) && (flag & llvm::ELF::SHF_ALLOC)) 2859 m_bHasTextRel = true; 2860 2861 return; 2862 } 2863 2864 /// sortRelocation - sort the dynamic relocations to let dynamic linker 2865 /// process relocations more efficiently 2866 void GNULDBackend::sortRelocation(LDSection& pSection) { 2867 if (!config().options().hasCombReloc()) 2868 return; 2869 2870 assert(pSection.kind() == LDFileFormat::Relocation); 2871 2872 switch (config().codeGenType()) { 2873 case LinkerConfig::DynObj: 2874 case LinkerConfig::Exec: 2875 if (&pSection == &getOutputFormat()->getRelDyn() || 2876 &pSection == &getOutputFormat()->getRelaDyn()) { 2877 if (pSection.hasRelocData()) 2878 pSection.getRelocData()->sort(RelocCompare(*this)); 2879 } 2880 default: 2881 return; 2882 } 2883 } 2884 2885 unsigned GNULDBackend::stubGroupSize() const { 2886 const unsigned group_size = config().targets().getStubGroupSize(); 2887 if (group_size == 0) { 2888 return m_pInfo->stubGroupSize(); 2889 } else { 2890 return group_size; 2891 } 2892 } 2893 2894 /// initBRIslandFactory - initialize the branch island factory for relaxation 2895 bool GNULDBackend::initBRIslandFactory() { 2896 if (m_pBRIslandFactory == NULL) { 2897 m_pBRIslandFactory = new BranchIslandFactory(maxFwdBranchOffset(), 2898 maxBwdBranchOffset(), 2899 stubGroupSize()); 2900 } 2901 return true; 2902 } 2903 2904 /// initStubFactory - initialize the stub factory for relaxation 2905 bool GNULDBackend::initStubFactory() { 2906 if (m_pStubFactory == NULL) { 2907 m_pStubFactory = new StubFactory(); 2908 } 2909 return true; 2910 } 2911 2912 bool GNULDBackend::relax(Module& pModule, IRBuilder& pBuilder) { 2913 if (!mayRelax()) 2914 return true; 2915 2916 getBRIslandFactory()->group(pModule); 2917 2918 bool finished = true; 2919 do { 2920 if (doRelax(pModule, pBuilder, finished)) { 2921 setOutputSectionAddress(pModule); 2922 } 2923 } while (!finished); 2924 2925 return true; 2926 } 2927 2928 bool GNULDBackend::DynsymCompare::needGNUHash(const LDSymbol& X) const { 2929 // FIXME: in bfd and gold linker, an undefined symbol might be hashed 2930 // when the ouput is not PIC, if the symbol is referred by a non pc-relative 2931 // reloc, and its value is set to the addr of the plt entry. 2932 return !X.resolveInfo()->isUndef() && !X.isDyn(); 2933 } 2934 2935 bool GNULDBackend::DynsymCompare::operator()(const LDSymbol* X, 2936 const LDSymbol* Y) const { 2937 return !needGNUHash(*X) && needGNUHash(*Y); 2938 } 2939 2940 bool GNULDBackend::RelocCompare::operator()(const Relocation& X, 2941 const Relocation& Y) const { 2942 // 1. compare if relocation is relative 2943 if (X.symInfo() == NULL) { 2944 if (Y.symInfo() != NULL) 2945 return true; 2946 } else if (Y.symInfo() == NULL) { 2947 return false; 2948 } else { 2949 // 2. compare the symbol index 2950 size_t symIdxX = m_Backend.getSymbolIdx(X.symInfo()->outSymbol()); 2951 size_t symIdxY = m_Backend.getSymbolIdx(Y.symInfo()->outSymbol()); 2952 if (symIdxX < symIdxY) 2953 return true; 2954 if (symIdxX > symIdxY) 2955 return false; 2956 } 2957 2958 // 3. compare the relocation address 2959 if (X.place() < Y.place()) 2960 return true; 2961 if (X.place() > Y.place()) 2962 return false; 2963 2964 // 4. compare the relocation type 2965 if (X.type() < Y.type()) 2966 return true; 2967 if (X.type() > Y.type()) 2968 return false; 2969 2970 // 5. compare the addend 2971 if (X.addend() < Y.addend()) 2972 return true; 2973 if (X.addend() > Y.addend()) 2974 return false; 2975 2976 return false; 2977 } 2978 2979 } // namespace mcld 2980