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