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