1 //===- SyntheticSection.h ---------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Synthetic sections represent chunks of linker-created data. If you 10 // need to create a chunk of data that to be included in some section 11 // in the result, you probably want to create that as a synthetic section. 12 // 13 // Synthetic sections are designed as input sections as opposed to 14 // output sections because we want to allow them to be manipulated 15 // using linker scripts just like other input sections from regular 16 // files. 17 // 18 //===----------------------------------------------------------------------===// 19 20 #ifndef LLD_ELF_SYNTHETIC_SECTIONS_H 21 #define LLD_ELF_SYNTHETIC_SECTIONS_H 22 23 #include "DWARF.h" 24 #include "EhFrame.h" 25 #include "InputSection.h" 26 #include "llvm/ADT/MapVector.h" 27 #include "llvm/MC/StringTableBuilder.h" 28 #include "llvm/Support/Endian.h" 29 #include <functional> 30 31 namespace lld { 32 namespace elf { 33 class Defined; 34 struct PhdrEntry; 35 class SymbolTableBaseSection; 36 class VersionNeedBaseSection; 37 38 class SyntheticSection : public InputSection { 39 public: 40 SyntheticSection(uint64_t flags, uint32_t type, uint32_t alignment, 41 StringRef name) 42 : InputSection(nullptr, flags, type, alignment, {}, name, 43 InputSectionBase::Synthetic) { 44 markLive(); 45 } 46 47 virtual ~SyntheticSection() = default; 48 virtual void writeTo(uint8_t *buf) = 0; 49 virtual size_t getSize() const = 0; 50 virtual void finalizeContents() {} 51 // If the section has the SHF_ALLOC flag and the size may be changed if 52 // thunks are added, update the section size. 53 virtual bool updateAllocSize() { return false; } 54 virtual bool isNeeded() const { return true; } 55 56 static bool classof(const SectionBase *d) { 57 return d->kind() == InputSectionBase::Synthetic; 58 } 59 }; 60 61 struct CieRecord { 62 EhSectionPiece *cie = nullptr; 63 std::vector<EhSectionPiece *> fdes; 64 }; 65 66 // Section for .eh_frame. 67 class EhFrameSection final : public SyntheticSection { 68 public: 69 EhFrameSection(); 70 void writeTo(uint8_t *buf) override; 71 void finalizeContents() override; 72 bool isNeeded() const override { return !sections.empty(); } 73 size_t getSize() const override { return size; } 74 75 static bool classof(const SectionBase *d) { 76 return SyntheticSection::classof(d) && d->name == ".eh_frame"; 77 } 78 79 void addSection(EhInputSection *sec); 80 81 std::vector<EhInputSection *> sections; 82 size_t numFdes = 0; 83 84 struct FdeData { 85 uint32_t pcRel; 86 uint32_t fdeVARel; 87 }; 88 89 std::vector<FdeData> getFdeData() const; 90 ArrayRef<CieRecord *> getCieRecords() const { return cieRecords; } 91 92 private: 93 // This is used only when parsing EhInputSection. We keep it here to avoid 94 // allocating one for each EhInputSection. 95 llvm::DenseMap<size_t, CieRecord *> offsetToCie; 96 97 uint64_t size = 0; 98 99 template <class ELFT, class RelTy> 100 void addRecords(EhInputSection *s, llvm::ArrayRef<RelTy> rels); 101 template <class ELFT> 102 void addSectionAux(EhInputSection *s); 103 104 template <class ELFT, class RelTy> 105 CieRecord *addCie(EhSectionPiece &piece, ArrayRef<RelTy> rels); 106 107 template <class ELFT, class RelTy> 108 bool isFdeLive(EhSectionPiece &piece, ArrayRef<RelTy> rels); 109 110 uint64_t getFdePc(uint8_t *buf, size_t off, uint8_t enc) const; 111 112 std::vector<CieRecord *> cieRecords; 113 114 // CIE records are uniquified by their contents and personality functions. 115 llvm::DenseMap<std::pair<ArrayRef<uint8_t>, Symbol *>, CieRecord *> cieMap; 116 }; 117 118 class GotSection : public SyntheticSection { 119 public: 120 GotSection(); 121 size_t getSize() const override { return size; } 122 void finalizeContents() override; 123 bool isNeeded() const override; 124 void writeTo(uint8_t *buf) override; 125 126 void addEntry(Symbol &sym); 127 bool addDynTlsEntry(Symbol &sym); 128 bool addTlsIndex(); 129 uint64_t getGlobalDynAddr(const Symbol &b) const; 130 uint64_t getGlobalDynOffset(const Symbol &b) const; 131 132 uint64_t getTlsIndexVA() { return this->getVA() + tlsIndexOff; } 133 uint32_t getTlsIndexOff() const { return tlsIndexOff; } 134 135 // Flag to force GOT to be in output if we have relocations 136 // that relies on its address. 137 bool hasGotOffRel = false; 138 139 protected: 140 size_t numEntries = 0; 141 uint32_t tlsIndexOff = -1; 142 uint64_t size = 0; 143 }; 144 145 // .note.GNU-stack section. 146 class GnuStackSection : public SyntheticSection { 147 public: 148 GnuStackSection() 149 : SyntheticSection(0, llvm::ELF::SHT_PROGBITS, 1, ".note.GNU-stack") {} 150 void writeTo(uint8_t *buf) override {} 151 size_t getSize() const override { return 0; } 152 }; 153 154 class GnuPropertySection : public SyntheticSection { 155 public: 156 GnuPropertySection(); 157 void writeTo(uint8_t *buf) override; 158 size_t getSize() const override; 159 }; 160 161 // .note.gnu.build-id section. 162 class BuildIdSection : public SyntheticSection { 163 // First 16 bytes are a header. 164 static const unsigned headerSize = 16; 165 166 public: 167 const size_t hashSize; 168 BuildIdSection(); 169 void writeTo(uint8_t *buf) override; 170 size_t getSize() const override { return headerSize + hashSize; } 171 void writeBuildId(llvm::ArrayRef<uint8_t> buf); 172 173 private: 174 uint8_t *hashBuf; 175 }; 176 177 // BssSection is used to reserve space for copy relocations and common symbols. 178 // We create three instances of this class for .bss, .bss.rel.ro and "COMMON", 179 // that are used for writable symbols, read-only symbols and common symbols, 180 // respectively. 181 class BssSection final : public SyntheticSection { 182 public: 183 BssSection(StringRef name, uint64_t size, uint32_t alignment); 184 void writeTo(uint8_t *) override { 185 llvm_unreachable("unexpected writeTo() call for SHT_NOBITS section"); 186 } 187 bool isNeeded() const override { return size != 0; } 188 size_t getSize() const override { return size; } 189 190 static bool classof(const SectionBase *s) { return s->bss; } 191 uint64_t size; 192 }; 193 194 class MipsGotSection final : public SyntheticSection { 195 public: 196 MipsGotSection(); 197 void writeTo(uint8_t *buf) override; 198 size_t getSize() const override { return size; } 199 bool updateAllocSize() override; 200 void finalizeContents() override; 201 bool isNeeded() const override; 202 203 // Join separate GOTs built for each input file to generate 204 // primary and optional multiple secondary GOTs. 205 void build(); 206 207 void addEntry(InputFile &file, Symbol &sym, int64_t addend, RelExpr expr); 208 void addDynTlsEntry(InputFile &file, Symbol &sym); 209 void addTlsIndex(InputFile &file); 210 211 uint64_t getPageEntryOffset(const InputFile *f, const Symbol &s, 212 int64_t addend) const; 213 uint64_t getSymEntryOffset(const InputFile *f, const Symbol &s, 214 int64_t addend) const; 215 uint64_t getGlobalDynOffset(const InputFile *f, const Symbol &s) const; 216 uint64_t getTlsIndexOffset(const InputFile *f) const; 217 218 // Returns the symbol which corresponds to the first entry of the global part 219 // of GOT on MIPS platform. It is required to fill up MIPS-specific dynamic 220 // table properties. 221 // Returns nullptr if the global part is empty. 222 const Symbol *getFirstGlobalEntry() const; 223 224 // Returns the number of entries in the local part of GOT including 225 // the number of reserved entries. 226 unsigned getLocalEntriesNum() const; 227 228 // Return _gp value for primary GOT (nullptr) or particular input file. 229 uint64_t getGp(const InputFile *f = nullptr) const; 230 231 private: 232 // MIPS GOT consists of three parts: local, global and tls. Each part 233 // contains different types of entries. Here is a layout of GOT: 234 // - Header entries | 235 // - Page entries | Local part 236 // - Local entries (16-bit access) | 237 // - Local entries (32-bit access) | 238 // - Normal global entries || Global part 239 // - Reloc-only global entries || 240 // - TLS entries ||| TLS part 241 // 242 // Header: 243 // Two entries hold predefined value 0x0 and 0x80000000. 244 // Page entries: 245 // These entries created by R_MIPS_GOT_PAGE relocation and R_MIPS_GOT16 246 // relocation against local symbols. They are initialized by higher 16-bit 247 // of the corresponding symbol's value. So each 64kb of address space 248 // requires a single GOT entry. 249 // Local entries (16-bit access): 250 // These entries created by GOT relocations against global non-preemptible 251 // symbols so dynamic linker is not necessary to resolve the symbol's 252 // values. "16-bit access" means that corresponding relocations address 253 // GOT using 16-bit index. Each unique Symbol-Addend pair has its own 254 // GOT entry. 255 // Local entries (32-bit access): 256 // These entries are the same as above but created by relocations which 257 // address GOT using 32-bit index (R_MIPS_GOT_HI16/LO16 etc). 258 // Normal global entries: 259 // These entries created by GOT relocations against preemptible global 260 // symbols. They need to be initialized by dynamic linker and they ordered 261 // exactly as the corresponding entries in the dynamic symbols table. 262 // Reloc-only global entries: 263 // These entries created for symbols that are referenced by dynamic 264 // relocations R_MIPS_REL32. These entries are not accessed with gp-relative 265 // addressing, but MIPS ABI requires that these entries be present in GOT. 266 // TLS entries: 267 // Entries created by TLS relocations. 268 // 269 // If the sum of local, global and tls entries is less than 64K only single 270 // got is enough. Otherwise, multi-got is created. Series of primary and 271 // multiple secondary GOTs have the following layout: 272 // - Primary GOT 273 // Header 274 // Local entries 275 // Global entries 276 // Relocation only entries 277 // TLS entries 278 // 279 // - Secondary GOT 280 // Local entries 281 // Global entries 282 // TLS entries 283 // ... 284 // 285 // All GOT entries required by relocations from a single input file entirely 286 // belong to either primary or one of secondary GOTs. To reference GOT entries 287 // each GOT has its own _gp value points to the "middle" of the GOT. 288 // In the code this value loaded to the register which is used for GOT access. 289 // 290 // MIPS 32 function's prologue: 291 // lui v0,0x0 292 // 0: R_MIPS_HI16 _gp_disp 293 // addiu v0,v0,0 294 // 4: R_MIPS_LO16 _gp_disp 295 // 296 // MIPS 64: 297 // lui at,0x0 298 // 14: R_MIPS_GPREL16 main 299 // 300 // Dynamic linker does not know anything about secondary GOTs and cannot 301 // use a regular MIPS mechanism for GOT entries initialization. So we have 302 // to use an approach accepted by other architectures and create dynamic 303 // relocations R_MIPS_REL32 to initialize global entries (and local in case 304 // of PIC code) in secondary GOTs. But ironically MIPS dynamic linker 305 // requires GOT entries and correspondingly ordered dynamic symbol table 306 // entries to deal with dynamic relocations. To handle this problem 307 // relocation-only section in the primary GOT contains entries for all 308 // symbols referenced in global parts of secondary GOTs. Although the sum 309 // of local and normal global entries of the primary got should be less 310 // than 64K, the size of the primary got (including relocation-only entries 311 // can be greater than 64K, because parts of the primary got that overflow 312 // the 64K limit are used only by the dynamic linker at dynamic link-time 313 // and not by 16-bit gp-relative addressing at run-time. 314 // 315 // For complete multi-GOT description see the following link 316 // https://dmz-portal.mips.com/wiki/MIPS_Multi_GOT 317 318 // Number of "Header" entries. 319 static const unsigned headerEntriesNum = 2; 320 321 uint64_t size = 0; 322 323 // Symbol and addend. 324 using GotEntry = std::pair<Symbol *, int64_t>; 325 326 struct FileGot { 327 InputFile *file = nullptr; 328 size_t startIndex = 0; 329 330 struct PageBlock { 331 size_t firstIndex; 332 size_t count; 333 PageBlock() : firstIndex(0), count(0) {} 334 }; 335 336 // Map output sections referenced by MIPS GOT relocations 337 // to the description (index/count) "page" entries allocated 338 // for this section. 339 llvm::SmallMapVector<const OutputSection *, PageBlock, 16> pagesMap; 340 // Maps from Symbol+Addend pair or just Symbol to the GOT entry index. 341 llvm::MapVector<GotEntry, size_t> local16; 342 llvm::MapVector<GotEntry, size_t> local32; 343 llvm::MapVector<Symbol *, size_t> global; 344 llvm::MapVector<Symbol *, size_t> relocs; 345 llvm::MapVector<Symbol *, size_t> tls; 346 // Set of symbols referenced by dynamic TLS relocations. 347 llvm::MapVector<Symbol *, size_t> dynTlsSymbols; 348 349 // Total number of all entries. 350 size_t getEntriesNum() const; 351 // Number of "page" entries. 352 size_t getPageEntriesNum() const; 353 // Number of entries require 16-bit index to access. 354 size_t getIndexedEntriesNum() const; 355 }; 356 357 // Container of GOT created for each input file. 358 // After building a final series of GOTs this container 359 // holds primary and secondary GOT's. 360 std::vector<FileGot> gots; 361 362 // Return (and create if necessary) `FileGot`. 363 FileGot &getGot(InputFile &f); 364 365 // Try to merge two GOTs. In case of success the `Dst` contains 366 // result of merging and the function returns true. In case of 367 // ovwerflow the `Dst` is unchanged and the function returns false. 368 bool tryMergeGots(FileGot & dst, FileGot & src, bool isPrimary); 369 }; 370 371 class GotPltSection final : public SyntheticSection { 372 public: 373 GotPltSection(); 374 void addEntry(Symbol &sym); 375 size_t getSize() const override; 376 void writeTo(uint8_t *buf) override; 377 bool isNeeded() const override; 378 379 // Flag to force GotPlt to be in output if we have relocations 380 // that relies on its address. 381 bool hasGotPltOffRel = false; 382 383 private: 384 std::vector<const Symbol *> entries; 385 }; 386 387 // The IgotPltSection is a Got associated with the PltSection for GNU Ifunc 388 // Symbols that will be relocated by Target->IRelativeRel. 389 // On most Targets the IgotPltSection will immediately follow the GotPltSection 390 // on ARM the IgotPltSection will immediately follow the GotSection. 391 class IgotPltSection final : public SyntheticSection { 392 public: 393 IgotPltSection(); 394 void addEntry(Symbol &sym); 395 size_t getSize() const override; 396 void writeTo(uint8_t *buf) override; 397 bool isNeeded() const override { return !entries.empty(); } 398 399 private: 400 std::vector<const Symbol *> entries; 401 }; 402 403 class StringTableSection final : public SyntheticSection { 404 public: 405 StringTableSection(StringRef name, bool dynamic); 406 unsigned addString(StringRef s, bool hashIt = true); 407 void writeTo(uint8_t *buf) override; 408 size_t getSize() const override { return size; } 409 bool isDynamic() const { return dynamic; } 410 411 private: 412 const bool dynamic; 413 414 uint64_t size = 0; 415 416 llvm::DenseMap<StringRef, unsigned> stringMap; 417 std::vector<StringRef> strings; 418 }; 419 420 class DynamicReloc { 421 public: 422 DynamicReloc(RelType type, const InputSectionBase *inputSec, 423 uint64_t offsetInSec, bool useSymVA, Symbol *sym, int64_t addend) 424 : type(type), sym(sym), inputSec(inputSec), offsetInSec(offsetInSec), 425 useSymVA(useSymVA), addend(addend), outputSec(nullptr) {} 426 // This constructor records dynamic relocation settings used by MIPS 427 // multi-GOT implementation. It's to relocate addresses of 64kb pages 428 // lie inside the output section. 429 DynamicReloc(RelType type, const InputSectionBase *inputSec, 430 uint64_t offsetInSec, const OutputSection *outputSec, 431 int64_t addend) 432 : type(type), sym(nullptr), inputSec(inputSec), offsetInSec(offsetInSec), 433 useSymVA(false), addend(addend), outputSec(outputSec) {} 434 435 uint64_t getOffset() const; 436 uint32_t getSymIndex(SymbolTableBaseSection *symTab) const; 437 438 // Computes the addend of the dynamic relocation. Note that this is not the 439 // same as the addend member variable as it also includes the symbol address 440 // if useSymVA is true. 441 int64_t computeAddend() const; 442 443 RelType type; 444 445 Symbol *sym; 446 const InputSectionBase *inputSec = nullptr; 447 uint64_t offsetInSec; 448 // If this member is true, the dynamic relocation will not be against the 449 // symbol but will instead be a relative relocation that simply adds the 450 // load address. This means we need to write the symbol virtual address 451 // plus the original addend as the final relocation addend. 452 bool useSymVA; 453 int64_t addend; 454 const OutputSection *outputSec; 455 }; 456 457 template <class ELFT> class DynamicSection final : public SyntheticSection { 458 using Elf_Dyn = typename ELFT::Dyn; 459 using Elf_Rel = typename ELFT::Rel; 460 using Elf_Rela = typename ELFT::Rela; 461 using Elf_Relr = typename ELFT::Relr; 462 using Elf_Shdr = typename ELFT::Shdr; 463 using Elf_Sym = typename ELFT::Sym; 464 465 // finalizeContents() fills this vector with the section contents. 466 std::vector<std::pair<int32_t, std::function<uint64_t()>>> entries; 467 468 public: 469 DynamicSection(); 470 void finalizeContents() override; 471 void writeTo(uint8_t *buf) override; 472 size_t getSize() const override { return size; } 473 474 private: 475 void add(int32_t tag, std::function<uint64_t()> fn); 476 void addInt(int32_t tag, uint64_t val); 477 void addInSec(int32_t tag, InputSection *sec); 478 void addInSecRelative(int32_t tag, InputSection *sec); 479 void addOutSec(int32_t tag, OutputSection *sec); 480 void addSize(int32_t tag, OutputSection *sec); 481 void addSym(int32_t tag, Symbol *sym); 482 483 uint64_t size = 0; 484 }; 485 486 class RelocationBaseSection : public SyntheticSection { 487 public: 488 RelocationBaseSection(StringRef name, uint32_t type, int32_t dynamicTag, 489 int32_t sizeDynamicTag); 490 void addReloc(RelType dynType, InputSectionBase *isec, uint64_t offsetInSec, 491 Symbol *sym); 492 // Add a dynamic relocation that might need an addend. This takes care of 493 // writing the addend to the output section if needed. 494 void addReloc(RelType dynType, InputSectionBase *inputSec, 495 uint64_t offsetInSec, Symbol *sym, int64_t addend, RelExpr expr, 496 RelType type); 497 void addReloc(const DynamicReloc &reloc); 498 bool isNeeded() const override { return !relocs.empty(); } 499 size_t getSize() const override { return relocs.size() * this->entsize; } 500 size_t getRelativeRelocCount() const { return numRelativeRelocs; } 501 void finalizeContents() override; 502 int32_t dynamicTag, sizeDynamicTag; 503 std::vector<DynamicReloc> relocs; 504 505 protected: 506 size_t numRelativeRelocs = 0; 507 }; 508 509 template <class ELFT> 510 class RelocationSection final : public RelocationBaseSection { 511 using Elf_Rel = typename ELFT::Rel; 512 using Elf_Rela = typename ELFT::Rela; 513 514 public: 515 RelocationSection(StringRef name, bool sort); 516 void writeTo(uint8_t *buf) override; 517 518 private: 519 bool sort; 520 }; 521 522 template <class ELFT> 523 class AndroidPackedRelocationSection final : public RelocationBaseSection { 524 using Elf_Rel = typename ELFT::Rel; 525 using Elf_Rela = typename ELFT::Rela; 526 527 public: 528 AndroidPackedRelocationSection(StringRef name); 529 530 bool updateAllocSize() override; 531 size_t getSize() const override { return relocData.size(); } 532 void writeTo(uint8_t *buf) override { 533 memcpy(buf, relocData.data(), relocData.size()); 534 } 535 536 private: 537 SmallVector<char, 0> relocData; 538 }; 539 540 struct RelativeReloc { 541 uint64_t getOffset() const { return inputSec->getVA(offsetInSec); } 542 543 const InputSectionBase *inputSec; 544 uint64_t offsetInSec; 545 }; 546 547 class RelrBaseSection : public SyntheticSection { 548 public: 549 RelrBaseSection(); 550 bool isNeeded() const override { return !relocs.empty(); } 551 std::vector<RelativeReloc> relocs; 552 }; 553 554 // RelrSection is used to encode offsets for relative relocations. 555 // Proposal for adding SHT_RELR sections to generic-abi is here: 556 // https://groups.google.com/forum/#!topic/generic-abi/bX460iggiKg 557 // For more details, see the comment in RelrSection::updateAllocSize(). 558 template <class ELFT> class RelrSection final : public RelrBaseSection { 559 using Elf_Relr = typename ELFT::Relr; 560 561 public: 562 RelrSection(); 563 564 bool updateAllocSize() override; 565 size_t getSize() const override { return relrRelocs.size() * this->entsize; } 566 void writeTo(uint8_t *buf) override { 567 memcpy(buf, relrRelocs.data(), getSize()); 568 } 569 570 private: 571 std::vector<Elf_Relr> relrRelocs; 572 }; 573 574 struct SymbolTableEntry { 575 Symbol *sym; 576 size_t strTabOffset; 577 }; 578 579 class SymbolTableBaseSection : public SyntheticSection { 580 public: 581 SymbolTableBaseSection(StringTableSection &strTabSec); 582 void finalizeContents() override; 583 size_t getSize() const override { return getNumSymbols() * entsize; } 584 void addSymbol(Symbol *sym); 585 unsigned getNumSymbols() const { return symbols.size() + 1; } 586 size_t getSymbolIndex(Symbol *sym); 587 ArrayRef<SymbolTableEntry> getSymbols() const { return symbols; } 588 589 protected: 590 void sortSymTabSymbols(); 591 592 // A vector of symbols and their string table offsets. 593 std::vector<SymbolTableEntry> symbols; 594 595 StringTableSection &strTabSec; 596 597 llvm::once_flag onceFlag; 598 llvm::DenseMap<Symbol *, size_t> symbolIndexMap; 599 llvm::DenseMap<OutputSection *, size_t> sectionIndexMap; 600 }; 601 602 template <class ELFT> 603 class SymbolTableSection final : public SymbolTableBaseSection { 604 using Elf_Sym = typename ELFT::Sym; 605 606 public: 607 SymbolTableSection(StringTableSection &strTabSec); 608 void writeTo(uint8_t *buf) override; 609 }; 610 611 class SymtabShndxSection final : public SyntheticSection { 612 public: 613 SymtabShndxSection(); 614 615 void writeTo(uint8_t *buf) override; 616 size_t getSize() const override; 617 bool isNeeded() const override; 618 void finalizeContents() override; 619 }; 620 621 // Outputs GNU Hash section. For detailed explanation see: 622 // https://blogs.oracle.com/ali/entry/gnu_hash_elf_sections 623 class GnuHashTableSection final : public SyntheticSection { 624 public: 625 GnuHashTableSection(); 626 void finalizeContents() override; 627 void writeTo(uint8_t *buf) override; 628 size_t getSize() const override { return size; } 629 630 // Adds symbols to the hash table. 631 // Sorts the input to satisfy GNU hash section requirements. 632 void addSymbols(std::vector<SymbolTableEntry> &symbols); 633 634 private: 635 // See the comment in writeBloomFilter. 636 enum { Shift2 = 26 }; 637 638 void writeBloomFilter(uint8_t *buf); 639 void writeHashTable(uint8_t *buf); 640 641 struct Entry { 642 Symbol *sym; 643 size_t strTabOffset; 644 uint32_t hash; 645 uint32_t bucketIdx; 646 }; 647 648 std::vector<Entry> symbols; 649 size_t maskWords; 650 size_t nBuckets = 0; 651 size_t size = 0; 652 }; 653 654 class HashTableSection final : public SyntheticSection { 655 public: 656 HashTableSection(); 657 void finalizeContents() override; 658 void writeTo(uint8_t *buf) override; 659 size_t getSize() const override { return size; } 660 661 private: 662 size_t size = 0; 663 }; 664 665 // Used for PLT entries. It usually has a PLT header for lazy binding. Each PLT 666 // entry is associated with a JUMP_SLOT relocation, which may be resolved lazily 667 // at runtime. 668 // 669 // On PowerPC, this section contains lazy symbol resolvers. A branch instruction 670 // jumps to a PLT call stub, which will then jump to the target (BIND_NOW) or a 671 // lazy symbol resolver. 672 // 673 // On x86 when IBT is enabled, this section (.plt.sec) contains PLT call stubs. 674 // A call instruction jumps to a .plt.sec entry, which will then jump to the 675 // target (BIND_NOW) or a .plt entry. 676 class PltSection : public SyntheticSection { 677 public: 678 PltSection(); 679 void writeTo(uint8_t *buf) override; 680 size_t getSize() const override; 681 bool isNeeded() const override; 682 void addSymbols(); 683 void addEntry(Symbol &sym); 684 size_t getNumEntries() const { return entries.size(); } 685 686 size_t headerSize = 0; 687 688 private: 689 std::vector<const Symbol *> entries; 690 }; 691 692 // Used for non-preemptible ifuncs. It does not have a header. Each entry is 693 // associated with an IRELATIVE relocation, which will be resolved eagerly at 694 // runtime. PltSection can only contain entries associated with JUMP_SLOT 695 // relocations, so IPLT entries are in a separate section. 696 class IpltSection final : public SyntheticSection { 697 std::vector<const Symbol *> entries; 698 699 public: 700 IpltSection(); 701 void writeTo(uint8_t *buf) override; 702 size_t getSize() const override; 703 bool isNeeded() const override { return !entries.empty(); } 704 void addSymbols(); 705 void addEntry(Symbol &sym); 706 }; 707 708 // This is x86-only. 709 class IBTPltSection : public SyntheticSection { 710 public: 711 IBTPltSection(); 712 void writeTo(uint8_t *Buf) override; 713 size_t getSize() const override; 714 }; 715 716 class GdbIndexSection final : public SyntheticSection { 717 public: 718 struct AddressEntry { 719 InputSection *section; 720 uint64_t lowAddress; 721 uint64_t highAddress; 722 uint32_t cuIndex; 723 }; 724 725 struct CuEntry { 726 uint64_t cuOffset; 727 uint64_t cuLength; 728 }; 729 730 struct NameAttrEntry { 731 llvm::CachedHashStringRef name; 732 uint32_t cuIndexAndAttrs; 733 }; 734 735 struct GdbChunk { 736 InputSection *sec; 737 std::vector<AddressEntry> addressAreas; 738 std::vector<CuEntry> compilationUnits; 739 }; 740 741 struct GdbSymbol { 742 llvm::CachedHashStringRef name; 743 std::vector<uint32_t> cuVector; 744 uint32_t nameOff; 745 uint32_t cuVectorOff; 746 }; 747 748 GdbIndexSection(); 749 template <typename ELFT> static GdbIndexSection *create(); 750 void writeTo(uint8_t *buf) override; 751 size_t getSize() const override { return size; } 752 bool isNeeded() const override; 753 754 private: 755 struct GdbIndexHeader { 756 llvm::support::ulittle32_t version; 757 llvm::support::ulittle32_t cuListOff; 758 llvm::support::ulittle32_t cuTypesOff; 759 llvm::support::ulittle32_t addressAreaOff; 760 llvm::support::ulittle32_t symtabOff; 761 llvm::support::ulittle32_t constantPoolOff; 762 }; 763 764 void initOutputSize(); 765 size_t computeSymtabSize() const; 766 767 // Each chunk contains information gathered from debug sections of a 768 // single object file. 769 std::vector<GdbChunk> chunks; 770 771 // A symbol table for this .gdb_index section. 772 std::vector<GdbSymbol> symbols; 773 774 size_t size; 775 }; 776 777 // --eh-frame-hdr option tells linker to construct a header for all the 778 // .eh_frame sections. This header is placed to a section named .eh_frame_hdr 779 // and also to a PT_GNU_EH_FRAME segment. 780 // At runtime the unwinder then can find all the PT_GNU_EH_FRAME segments by 781 // calling dl_iterate_phdr. 782 // This section contains a lookup table for quick binary search of FDEs. 783 // Detailed info about internals can be found in Ian Lance Taylor's blog: 784 // http://www.airs.com/blog/archives/460 (".eh_frame") 785 // http://www.airs.com/blog/archives/462 (".eh_frame_hdr") 786 class EhFrameHeader final : public SyntheticSection { 787 public: 788 EhFrameHeader(); 789 void write(); 790 void writeTo(uint8_t *buf) override; 791 size_t getSize() const override; 792 bool isNeeded() const override; 793 }; 794 795 // For more information about .gnu.version and .gnu.version_r see: 796 // https://www.akkadia.org/drepper/symbol-versioning 797 798 // The .gnu.version_d section which has a section type of SHT_GNU_verdef shall 799 // contain symbol version definitions. The number of entries in this section 800 // shall be contained in the DT_VERDEFNUM entry of the .dynamic section. 801 // The section shall contain an array of Elf_Verdef structures, optionally 802 // followed by an array of Elf_Verdaux structures. 803 class VersionDefinitionSection final : public SyntheticSection { 804 public: 805 VersionDefinitionSection(); 806 void finalizeContents() override; 807 size_t getSize() const override; 808 void writeTo(uint8_t *buf) override; 809 810 private: 811 enum { EntrySize = 28 }; 812 void writeOne(uint8_t *buf, uint32_t index, StringRef name, size_t nameOff); 813 StringRef getFileDefName(); 814 815 unsigned fileDefNameOff; 816 std::vector<unsigned> verDefNameOffs; 817 }; 818 819 // The .gnu.version section specifies the required version of each symbol in the 820 // dynamic symbol table. It contains one Elf_Versym for each dynamic symbol 821 // table entry. An Elf_Versym is just a 16-bit integer that refers to a version 822 // identifier defined in the either .gnu.version_r or .gnu.version_d section. 823 // The values 0 and 1 are reserved. All other values are used for versions in 824 // the own object or in any of the dependencies. 825 class VersionTableSection final : public SyntheticSection { 826 public: 827 VersionTableSection(); 828 void finalizeContents() override; 829 size_t getSize() const override; 830 void writeTo(uint8_t *buf) override; 831 bool isNeeded() const override; 832 }; 833 834 // The .gnu.version_r section defines the version identifiers used by 835 // .gnu.version. It contains a linked list of Elf_Verneed data structures. Each 836 // Elf_Verneed specifies the version requirements for a single DSO, and contains 837 // a reference to a linked list of Elf_Vernaux data structures which define the 838 // mapping from version identifiers to version names. 839 template <class ELFT> 840 class VersionNeedSection final : public SyntheticSection { 841 using Elf_Verneed = typename ELFT::Verneed; 842 using Elf_Vernaux = typename ELFT::Vernaux; 843 844 struct Vernaux { 845 uint64_t hash; 846 uint32_t verneedIndex; 847 uint64_t nameStrTab; 848 }; 849 850 struct Verneed { 851 uint64_t nameStrTab; 852 std::vector<Vernaux> vernauxs; 853 }; 854 855 std::vector<Verneed> verneeds; 856 857 public: 858 VersionNeedSection(); 859 void finalizeContents() override; 860 void writeTo(uint8_t *buf) override; 861 size_t getSize() const override; 862 bool isNeeded() const override; 863 }; 864 865 // MergeSyntheticSection is a class that allows us to put mergeable sections 866 // with different attributes in a single output sections. To do that 867 // we put them into MergeSyntheticSection synthetic input sections which are 868 // attached to regular output sections. 869 class MergeSyntheticSection : public SyntheticSection { 870 public: 871 void addSection(MergeInputSection *ms); 872 std::vector<MergeInputSection *> sections; 873 874 protected: 875 MergeSyntheticSection(StringRef name, uint32_t type, uint64_t flags, 876 uint32_t alignment) 877 : SyntheticSection(flags, type, alignment, name) {} 878 }; 879 880 class MergeTailSection final : public MergeSyntheticSection { 881 public: 882 MergeTailSection(StringRef name, uint32_t type, uint64_t flags, 883 uint32_t alignment); 884 885 size_t getSize() const override; 886 void writeTo(uint8_t *buf) override; 887 void finalizeContents() override; 888 889 private: 890 llvm::StringTableBuilder builder; 891 }; 892 893 class MergeNoTailSection final : public MergeSyntheticSection { 894 public: 895 MergeNoTailSection(StringRef name, uint32_t type, uint64_t flags, 896 uint32_t alignment) 897 : MergeSyntheticSection(name, type, flags, alignment) {} 898 899 size_t getSize() const override { return size; } 900 void writeTo(uint8_t *buf) override; 901 void finalizeContents() override; 902 903 private: 904 // We use the most significant bits of a hash as a shard ID. 905 // The reason why we don't want to use the least significant bits is 906 // because DenseMap also uses lower bits to determine a bucket ID. 907 // If we use lower bits, it significantly increases the probability of 908 // hash collisons. 909 size_t getShardId(uint32_t hash) { 910 assert((hash >> 31) == 0); 911 return hash >> (31 - llvm::countTrailingZeros(numShards)); 912 } 913 914 // Section size 915 size_t size; 916 917 // String table contents 918 constexpr static size_t numShards = 32; 919 std::vector<llvm::StringTableBuilder> shards; 920 size_t shardOffsets[numShards]; 921 }; 922 923 // .MIPS.abiflags section. 924 template <class ELFT> 925 class MipsAbiFlagsSection final : public SyntheticSection { 926 using Elf_Mips_ABIFlags = llvm::object::Elf_Mips_ABIFlags<ELFT>; 927 928 public: 929 static MipsAbiFlagsSection *create(); 930 931 MipsAbiFlagsSection(Elf_Mips_ABIFlags flags); 932 size_t getSize() const override { return sizeof(Elf_Mips_ABIFlags); } 933 void writeTo(uint8_t *buf) override; 934 935 private: 936 Elf_Mips_ABIFlags flags; 937 }; 938 939 // .MIPS.options section. 940 template <class ELFT> class MipsOptionsSection final : public SyntheticSection { 941 using Elf_Mips_Options = llvm::object::Elf_Mips_Options<ELFT>; 942 using Elf_Mips_RegInfo = llvm::object::Elf_Mips_RegInfo<ELFT>; 943 944 public: 945 static MipsOptionsSection *create(); 946 947 MipsOptionsSection(Elf_Mips_RegInfo reginfo); 948 void writeTo(uint8_t *buf) override; 949 950 size_t getSize() const override { 951 return sizeof(Elf_Mips_Options) + sizeof(Elf_Mips_RegInfo); 952 } 953 954 private: 955 Elf_Mips_RegInfo reginfo; 956 }; 957 958 // MIPS .reginfo section. 959 template <class ELFT> class MipsReginfoSection final : public SyntheticSection { 960 using Elf_Mips_RegInfo = llvm::object::Elf_Mips_RegInfo<ELFT>; 961 962 public: 963 static MipsReginfoSection *create(); 964 965 MipsReginfoSection(Elf_Mips_RegInfo reginfo); 966 size_t getSize() const override { return sizeof(Elf_Mips_RegInfo); } 967 void writeTo(uint8_t *buf) override; 968 969 private: 970 Elf_Mips_RegInfo reginfo; 971 }; 972 973 // This is a MIPS specific section to hold a space within the data segment 974 // of executable file which is pointed to by the DT_MIPS_RLD_MAP entry. 975 // See "Dynamic section" in Chapter 5 in the following document: 976 // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf 977 class MipsRldMapSection : public SyntheticSection { 978 public: 979 MipsRldMapSection(); 980 size_t getSize() const override { return config->wordsize; } 981 void writeTo(uint8_t *buf) override {} 982 }; 983 984 // Representation of the combined .ARM.Exidx input sections. We process these 985 // as a SyntheticSection like .eh_frame as we need to merge duplicate entries 986 // and add terminating sentinel entries. 987 // 988 // The .ARM.exidx input sections after SHF_LINK_ORDER processing is done form 989 // a table that the unwinder can derive (Addresses are encoded as offsets from 990 // table): 991 // | Address of function | Unwind instructions for function | 992 // where the unwind instructions are either a small number of unwind or the 993 // special EXIDX_CANTUNWIND entry representing no unwinding information. 994 // When an exception is thrown from an address A, the unwinder searches the 995 // table for the closest table entry with Address of function <= A. This means 996 // that for two consecutive table entries: 997 // | A1 | U1 | 998 // | A2 | U2 | 999 // The range of addresses described by U1 is [A1, A2) 1000 // 1001 // There are two cases where we need a linker generated table entry to fixup 1002 // the address ranges in the table 1003 // Case 1: 1004 // - A sentinel entry added with an address higher than all 1005 // executable sections. This was needed to work around libunwind bug pr31091. 1006 // - After address assignment we need to find the highest addressed executable 1007 // section and use the limit of that section so that the unwinder never 1008 // matches it. 1009 // Case 2: 1010 // - InputSections without a .ARM.exidx section (usually from Assembly) 1011 // need a table entry so that they terminate the range of the previously 1012 // function. This is pr40277. 1013 // 1014 // Instead of storing pointers to the .ARM.exidx InputSections from 1015 // InputObjects, we store pointers to the executable sections that need 1016 // .ARM.exidx sections. We can then use the dependentSections of these to 1017 // either find the .ARM.exidx section or know that we need to generate one. 1018 class ARMExidxSyntheticSection : public SyntheticSection { 1019 public: 1020 ARMExidxSyntheticSection(); 1021 1022 // Add an input section to the ARMExidxSyntheticSection. Returns whether the 1023 // section needs to be removed from the main input section list. 1024 bool addSection(InputSection *isec); 1025 1026 size_t getSize() const override { return size; } 1027 void writeTo(uint8_t *buf) override; 1028 bool isNeeded() const override; 1029 // Sort and remove duplicate entries. 1030 void finalizeContents() override; 1031 InputSection *getLinkOrderDep() const; 1032 1033 static bool classof(const SectionBase *d); 1034 1035 // Links to the ARMExidxSections so we can transfer the relocations once the 1036 // layout is known. 1037 std::vector<InputSection *> exidxSections; 1038 1039 private: 1040 size_t size; 1041 1042 // Instead of storing pointers to the .ARM.exidx InputSections from 1043 // InputObjects, we store pointers to the executable sections that need 1044 // .ARM.exidx sections. We can then use the dependentSections of these to 1045 // either find the .ARM.exidx section or know that we need to generate one. 1046 std::vector<InputSection *> executableSections; 1047 1048 // The executable InputSection with the highest address to use for the 1049 // sentinel. We store separately from ExecutableSections as merging of 1050 // duplicate entries may mean this InputSection is removed from 1051 // ExecutableSections. 1052 InputSection *sentinel = nullptr; 1053 }; 1054 1055 // A container for one or more linker generated thunks. Instances of these 1056 // thunks including ARM interworking and Mips LA25 PI to non-PI thunks. 1057 class ThunkSection : public SyntheticSection { 1058 public: 1059 // ThunkSection in OS, with desired outSecOff of Off 1060 ThunkSection(OutputSection *os, uint64_t off); 1061 1062 // Add a newly created Thunk to this container: 1063 // Thunk is given offset from start of this InputSection 1064 // Thunk defines a symbol in this InputSection that can be used as target 1065 // of a relocation 1066 void addThunk(Thunk *t); 1067 size_t getSize() const override; 1068 void writeTo(uint8_t *buf) override; 1069 InputSection *getTargetInputSection() const; 1070 bool assignOffsets(); 1071 1072 private: 1073 std::vector<Thunk *> thunks; 1074 size_t size = 0; 1075 }; 1076 1077 // Used to compute outSecOff of .got2 in each object file. This is needed to 1078 // synthesize PLT entries for PPC32 Secure PLT ABI. 1079 class PPC32Got2Section final : public SyntheticSection { 1080 public: 1081 PPC32Got2Section(); 1082 size_t getSize() const override { return 0; } 1083 bool isNeeded() const override; 1084 void finalizeContents() override; 1085 void writeTo(uint8_t *buf) override {} 1086 }; 1087 1088 // This section is used to store the addresses of functions that are called 1089 // in range-extending thunks on PowerPC64. When producing position dependent 1090 // code the addresses are link-time constants and the table is written out to 1091 // the binary. When producing position-dependent code the table is allocated and 1092 // filled in by the dynamic linker. 1093 class PPC64LongBranchTargetSection final : public SyntheticSection { 1094 public: 1095 PPC64LongBranchTargetSection(); 1096 uint64_t getEntryVA(const Symbol *sym, int64_t addend); 1097 llvm::Optional<uint32_t> addEntry(const Symbol *sym, int64_t addend); 1098 size_t getSize() const override; 1099 void writeTo(uint8_t *buf) override; 1100 bool isNeeded() const override; 1101 void finalizeContents() override { finalized = true; } 1102 1103 private: 1104 std::vector<std::pair<const Symbol *, int64_t>> entries; 1105 llvm::DenseMap<std::pair<const Symbol *, int64_t>, uint32_t> entry_index; 1106 bool finalized = false; 1107 }; 1108 1109 template <typename ELFT> 1110 class PartitionElfHeaderSection : public SyntheticSection { 1111 public: 1112 PartitionElfHeaderSection(); 1113 size_t getSize() const override; 1114 void writeTo(uint8_t *buf) override; 1115 }; 1116 1117 template <typename ELFT> 1118 class PartitionProgramHeadersSection : public SyntheticSection { 1119 public: 1120 PartitionProgramHeadersSection(); 1121 size_t getSize() const override; 1122 void writeTo(uint8_t *buf) override; 1123 }; 1124 1125 class PartitionIndexSection : public SyntheticSection { 1126 public: 1127 PartitionIndexSection(); 1128 size_t getSize() const override; 1129 void finalizeContents() override; 1130 void writeTo(uint8_t *buf) override; 1131 }; 1132 1133 InputSection *createInterpSection(); 1134 MergeInputSection *createCommentSection(); 1135 MergeSyntheticSection *createMergeSynthetic(StringRef name, uint32_t type, 1136 uint64_t flags, uint32_t alignment); 1137 template <class ELFT> void splitSections(); 1138 1139 template <typename ELFT> void writeEhdr(uint8_t *buf, Partition &part); 1140 template <typename ELFT> void writePhdrs(uint8_t *buf, Partition &part); 1141 1142 Defined *addSyntheticLocal(StringRef name, uint8_t type, uint64_t value, 1143 uint64_t size, InputSectionBase §ion); 1144 1145 void addVerneed(Symbol *ss); 1146 1147 // Linker generated per-partition sections. 1148 struct Partition { 1149 StringRef name; 1150 uint64_t nameStrTab; 1151 1152 SyntheticSection *elfHeader; 1153 SyntheticSection *programHeaders; 1154 std::vector<PhdrEntry *> phdrs; 1155 1156 ARMExidxSyntheticSection *armExidx; 1157 BuildIdSection *buildId; 1158 SyntheticSection *dynamic; 1159 StringTableSection *dynStrTab; 1160 SymbolTableBaseSection *dynSymTab; 1161 EhFrameHeader *ehFrameHdr; 1162 EhFrameSection *ehFrame; 1163 GnuHashTableSection *gnuHashTab; 1164 HashTableSection *hashTab; 1165 RelocationBaseSection *relaDyn; 1166 RelrBaseSection *relrDyn; 1167 VersionDefinitionSection *verDef; 1168 SyntheticSection *verNeed; 1169 VersionTableSection *verSym; 1170 1171 unsigned getNumber() const { return this - &partitions[0] + 1; } 1172 }; 1173 1174 extern Partition *mainPart; 1175 1176 inline Partition &SectionBase::getPartition() const { 1177 assert(isLive()); 1178 return partitions[partition - 1]; 1179 } 1180 1181 // Linker generated sections which can be used as inputs and are not specific to 1182 // a partition. 1183 struct InStruct { 1184 InputSection *armAttributes; 1185 BssSection *bss; 1186 BssSection *bssRelRo; 1187 GotSection *got; 1188 GotPltSection *gotPlt; 1189 IgotPltSection *igotPlt; 1190 PPC64LongBranchTargetSection *ppc64LongBranchTarget; 1191 MipsGotSection *mipsGot; 1192 MipsRldMapSection *mipsRldMap; 1193 SyntheticSection *partEnd; 1194 SyntheticSection *partIndex; 1195 PltSection *plt; 1196 IpltSection *iplt; 1197 PPC32Got2Section *ppc32Got2; 1198 IBTPltSection *ibtPlt; 1199 RelocationBaseSection *relaPlt; 1200 RelocationBaseSection *relaIplt; 1201 StringTableSection *shStrTab; 1202 StringTableSection *strTab; 1203 SymbolTableBaseSection *symTab; 1204 SymtabShndxSection *symTabShndx; 1205 }; 1206 1207 extern InStruct in; 1208 1209 } // namespace elf 1210 } // namespace lld 1211 1212 #endif 1213