Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/lld/ELF/SyntheticSections.h
34870 views
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(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 headerSize = 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 headerEntriesNum = 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(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({expr, addendRelType, offsetInSec, addend, &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(relocsVec, [](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(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(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(buf, relocData.data(), 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(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(relocsVec, [](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 headerSize;
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 footerSize = 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(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
parseDebugNames(InputChunk &inputChunk, OutputChunk &chunk,
878
llvm::DWARFDataExtractor &namesExtractor,
879
llvm::DataExtractor &strExtractor,
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 readOffsets(InputChunk &inputChunk, OutputChunk &chunk,
925
llvm::DWARFDataExtractor &namesExtractor,
926
llvm::DataExtractor &strExtractor);
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 GdbIndexHeader {
969
llvm::support::ulittle32_t version;
970
llvm::support::ulittle32_t cuListOff;
971
llvm::support::ulittle32_t cuTypesOff;
972
llvm::support::ulittle32_t addressAreaOff;
973
llvm::support::ulittle32_t symtabOff;
974
llvm::support::ulittle32_t constantPoolOff;
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 EhFrameHeader final : public SyntheticSection {
999
public:
1000
EhFrameHeader();
1001
void write();
1002
void writeTo(uint8_t *buf) override;
1003
size_t getSize() const override;
1004
bool isNeeded() 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(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 PartitionElfHeaderSection final : public SyntheticSection {
1359
public:
1360
PartitionElfHeaderSection();
1361
size_t getSize() const override;
1362
void writeTo(uint8_t *buf) override;
1363
};
1364
1365
template <typename ELFT>
1366
class PartitionProgramHeadersSection final : public SyntheticSection {
1367
public:
1368
PartitionProgramHeadersSection();
1369
size_t getSize() const override;
1370
void writeTo(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(&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 *createCommentSection();
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 &section);
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> elfHeader;
1451
std::unique_ptr<SyntheticSection> programHeaders;
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
1525