1 //===- SyntheticSections.cpp ----------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 // This file contains linker-synthesized sections. Currently,
10 // synthetic sections are created either output sections or input sections,
11 // but we are rewriting code so that all synthetic sections are created as
14 //===----------------------------------------------------------------------===//
16 #include "SyntheticSections.h"
20 #include "InputFiles.h"
21 #include "LinkerScript.h"
22 #include "OutputSections.h"
23 #include "SymbolTable.h"
28 #include "lld/Common/CommonLinkerContext.h"
29 #include "lld/Common/DWARF.h"
30 #include "lld/Common/Strings.h"
31 #include "lld/Common/Version.h"
32 #include "llvm/ADT/STLExtras.h"
33 #include "llvm/ADT/SetOperations.h"
34 #include "llvm/ADT/StringExtras.h"
35 #include "llvm/BinaryFormat/Dwarf.h"
36 #include "llvm/BinaryFormat/ELF.h"
37 #include "llvm/DebugInfo/DWARF/DWARFDebugPubTable.h"
38 #include "llvm/Support/Endian.h"
39 #include "llvm/Support/LEB128.h"
40 #include "llvm/Support/Parallel.h"
41 #include "llvm/Support/TimeProfiler.h"
45 using namespace llvm::dwarf
;
46 using namespace llvm::ELF
;
47 using namespace llvm::object
;
48 using namespace llvm::support
;
50 using namespace lld::elf
;
52 using llvm::support::endian::read32le
;
53 using llvm::support::endian::write32le
;
54 using llvm::support::endian::write64le
;
56 constexpr size_t MergeNoTailSection::numShards
;
58 static uint64_t readUint(uint8_t *buf
) {
59 return config
->is64
? read64(buf
) : read32(buf
);
62 static void writeUint(uint8_t *buf
, uint64_t val
) {
69 // Returns an LLD version string.
70 static ArrayRef
<uint8_t> getVersion() {
71 // Check LLD_VERSION first for ease of testing.
72 // You can get consistent output by using the environment variable.
73 // This is only for testing.
74 StringRef s
= getenv("LLD_VERSION");
76 s
= saver().save(Twine("Linker: ") + getLLDVersion());
78 // +1 to include the terminating '\0'.
79 return {(const uint8_t *)s
.data(), s
.size() + 1};
82 // Creates a .comment section containing LLD version info.
83 // With this feature, you can identify LLD-generated binaries easily
84 // by "readelf --string-dump .comment <file>".
85 // The returned object is a mergeable string section.
86 MergeInputSection
*elf::createCommentSection() {
87 auto *sec
= make
<MergeInputSection
>(SHF_MERGE
| SHF_STRINGS
, SHT_PROGBITS
, 1,
88 getVersion(), ".comment");
89 sec
->splitIntoPieces();
93 // .MIPS.abiflags section.
95 MipsAbiFlagsSection
<ELFT
>::MipsAbiFlagsSection(Elf_Mips_ABIFlags flags
)
96 : SyntheticSection(SHF_ALLOC
, SHT_MIPS_ABIFLAGS
, 8, ".MIPS.abiflags"),
98 this->entsize
= sizeof(Elf_Mips_ABIFlags
);
101 template <class ELFT
> void MipsAbiFlagsSection
<ELFT
>::writeTo(uint8_t *buf
) {
102 memcpy(buf
, &flags
, sizeof(flags
));
105 template <class ELFT
>
106 std::unique_ptr
<MipsAbiFlagsSection
<ELFT
>> MipsAbiFlagsSection
<ELFT
>::create() {
107 Elf_Mips_ABIFlags flags
= {};
110 for (InputSectionBase
*sec
: ctx
.inputSections
) {
111 if (sec
->type
!= SHT_MIPS_ABIFLAGS
)
116 std::string filename
= toString(sec
->file
);
117 const size_t size
= sec
->content().size();
118 // Older version of BFD (such as the default FreeBSD linker) concatenate
119 // .MIPS.abiflags instead of merging. To allow for this case (or potential
120 // zero padding) we ignore everything after the first Elf_Mips_ABIFlags
121 if (size
< sizeof(Elf_Mips_ABIFlags
)) {
122 error(filename
+ ": invalid size of .MIPS.abiflags section: got " +
123 Twine(size
) + " instead of " + Twine(sizeof(Elf_Mips_ABIFlags
)));
127 reinterpret_cast<const Elf_Mips_ABIFlags
*>(sec
->content().data());
128 if (s
->version
!= 0) {
129 error(filename
+ ": unexpected .MIPS.abiflags version " +
134 // LLD checks ISA compatibility in calcMipsEFlags(). Here we just
135 // select the highest number of ISA/Rev/Ext.
136 flags
.isa_level
= std::max(flags
.isa_level
, s
->isa_level
);
137 flags
.isa_rev
= std::max(flags
.isa_rev
, s
->isa_rev
);
138 flags
.isa_ext
= std::max(flags
.isa_ext
, s
->isa_ext
);
139 flags
.gpr_size
= std::max(flags
.gpr_size
, s
->gpr_size
);
140 flags
.cpr1_size
= std::max(flags
.cpr1_size
, s
->cpr1_size
);
141 flags
.cpr2_size
= std::max(flags
.cpr2_size
, s
->cpr2_size
);
142 flags
.ases
|= s
->ases
;
143 flags
.flags1
|= s
->flags1
;
144 flags
.flags2
|= s
->flags2
;
145 flags
.fp_abi
= elf::getMipsFpAbiFlag(flags
.fp_abi
, s
->fp_abi
, filename
);
149 return std::make_unique
<MipsAbiFlagsSection
<ELFT
>>(flags
);
153 // .MIPS.options section.
154 template <class ELFT
>
155 MipsOptionsSection
<ELFT
>::MipsOptionsSection(Elf_Mips_RegInfo reginfo
)
156 : SyntheticSection(SHF_ALLOC
, SHT_MIPS_OPTIONS
, 8, ".MIPS.options"),
158 this->entsize
= sizeof(Elf_Mips_Options
) + sizeof(Elf_Mips_RegInfo
);
161 template <class ELFT
> void MipsOptionsSection
<ELFT
>::writeTo(uint8_t *buf
) {
162 auto *options
= reinterpret_cast<Elf_Mips_Options
*>(buf
);
163 options
->kind
= ODK_REGINFO
;
164 options
->size
= getSize();
166 if (!config
->relocatable
)
167 reginfo
.ri_gp_value
= in
.mipsGot
->getGp();
168 memcpy(buf
+ sizeof(Elf_Mips_Options
), ®info
, sizeof(reginfo
));
171 template <class ELFT
>
172 std::unique_ptr
<MipsOptionsSection
<ELFT
>> MipsOptionsSection
<ELFT
>::create() {
177 SmallVector
<InputSectionBase
*, 0> sections
;
178 for (InputSectionBase
*sec
: ctx
.inputSections
)
179 if (sec
->type
== SHT_MIPS_OPTIONS
)
180 sections
.push_back(sec
);
182 if (sections
.empty())
185 Elf_Mips_RegInfo reginfo
= {};
186 for (InputSectionBase
*sec
: sections
) {
189 std::string filename
= toString(sec
->file
);
190 ArrayRef
<uint8_t> d
= sec
->content();
193 if (d
.size() < sizeof(Elf_Mips_Options
)) {
194 error(filename
+ ": invalid size of .MIPS.options section");
198 auto *opt
= reinterpret_cast<const Elf_Mips_Options
*>(d
.data());
199 if (opt
->kind
== ODK_REGINFO
) {
200 reginfo
.ri_gprmask
|= opt
->getRegInfo().ri_gprmask
;
201 sec
->getFile
<ELFT
>()->mipsGp0
= opt
->getRegInfo().ri_gp_value
;
206 fatal(filename
+ ": zero option descriptor size");
207 d
= d
.slice(opt
->size
);
211 return std::make_unique
<MipsOptionsSection
<ELFT
>>(reginfo
);
214 // MIPS .reginfo section.
215 template <class ELFT
>
216 MipsReginfoSection
<ELFT
>::MipsReginfoSection(Elf_Mips_RegInfo reginfo
)
217 : SyntheticSection(SHF_ALLOC
, SHT_MIPS_REGINFO
, 4, ".reginfo"),
219 this->entsize
= sizeof(Elf_Mips_RegInfo
);
222 template <class ELFT
> void MipsReginfoSection
<ELFT
>::writeTo(uint8_t *buf
) {
223 if (!config
->relocatable
)
224 reginfo
.ri_gp_value
= in
.mipsGot
->getGp();
225 memcpy(buf
, ®info
, sizeof(reginfo
));
228 template <class ELFT
>
229 std::unique_ptr
<MipsReginfoSection
<ELFT
>> MipsReginfoSection
<ELFT
>::create() {
230 // Section should be alive for O32 and N32 ABIs only.
234 SmallVector
<InputSectionBase
*, 0> sections
;
235 for (InputSectionBase
*sec
: ctx
.inputSections
)
236 if (sec
->type
== SHT_MIPS_REGINFO
)
237 sections
.push_back(sec
);
239 if (sections
.empty())
242 Elf_Mips_RegInfo reginfo
= {};
243 for (InputSectionBase
*sec
: sections
) {
246 if (sec
->content().size() != sizeof(Elf_Mips_RegInfo
)) {
247 error(toString(sec
->file
) + ": invalid size of .reginfo section");
251 auto *r
= reinterpret_cast<const Elf_Mips_RegInfo
*>(sec
->content().data());
252 reginfo
.ri_gprmask
|= r
->ri_gprmask
;
253 sec
->getFile
<ELFT
>()->mipsGp0
= r
->ri_gp_value
;
256 return std::make_unique
<MipsReginfoSection
<ELFT
>>(reginfo
);
259 InputSection
*elf::createInterpSection() {
260 // StringSaver guarantees that the returned string ends with '\0'.
261 StringRef s
= saver().save(config
->dynamicLinker
);
262 ArrayRef
<uint8_t> contents
= {(const uint8_t *)s
.data(), s
.size() + 1};
264 return make
<InputSection
>(nullptr, SHF_ALLOC
, SHT_PROGBITS
, 1, contents
,
268 Defined
*elf::addSyntheticLocal(StringRef name
, uint8_t type
, uint64_t value
,
269 uint64_t size
, InputSectionBase
§ion
) {
270 Defined
*s
= makeDefined(section
.file
, name
, STB_LOCAL
, STV_DEFAULT
, type
,
271 value
, size
, §ion
);
273 in
.symTab
->addSymbol(s
);
275 if (config
->emachine
== EM_ARM
&& !config
->isLE
&& config
->armBe8
&&
276 (section
.flags
& SHF_EXECINSTR
))
277 // Adding Linker generated mapping symbols to the arm specific mapping
279 addArmSyntheticSectionMappingSymbol(s
);
284 static size_t getHashSize() {
285 switch (config
->buildId
) {
286 case BuildIdKind::Fast
:
288 case BuildIdKind::Md5
:
289 case BuildIdKind::Uuid
:
291 case BuildIdKind::Sha1
:
293 case BuildIdKind::Hexstring
:
294 return config
->buildIdVector
.size();
296 llvm_unreachable("unknown BuildIdKind");
300 // This class represents a linker-synthesized .note.gnu.property section.
302 // In x86 and AArch64, object files may contain feature flags indicating the
303 // features that they have used. The flags are stored in a .note.gnu.property
306 // lld reads the sections from input files and merges them by computing AND of
307 // the flags. The result is written as a new .note.gnu.property section.
309 // If the flag is zero (which indicates that the intersection of the feature
310 // sets is empty, or some input files didn't have .note.gnu.property sections),
311 // we don't create this section.
312 GnuPropertySection::GnuPropertySection()
313 : SyntheticSection(llvm::ELF::SHF_ALLOC
, llvm::ELF::SHT_NOTE
,
314 config
->wordsize
, ".note.gnu.property") {}
316 void GnuPropertySection::writeTo(uint8_t *buf
) {
317 uint32_t featureAndType
= config
->emachine
== EM_AARCH64
318 ? GNU_PROPERTY_AARCH64_FEATURE_1_AND
319 : GNU_PROPERTY_X86_FEATURE_1_AND
;
321 write32(buf
, 4); // Name size
322 write32(buf
+ 4, config
->is64
? 16 : 12); // Content size
323 write32(buf
+ 8, NT_GNU_PROPERTY_TYPE_0
); // Type
324 memcpy(buf
+ 12, "GNU", 4); // Name string
325 write32(buf
+ 16, featureAndType
); // Feature type
326 write32(buf
+ 20, 4); // Feature size
327 write32(buf
+ 24, config
->andFeatures
); // Feature flags
329 write32(buf
+ 28, 0); // Padding
332 size_t GnuPropertySection::getSize() const { return config
->is64
? 32 : 28; }
334 BuildIdSection::BuildIdSection()
335 : SyntheticSection(SHF_ALLOC
, SHT_NOTE
, 4, ".note.gnu.build-id"),
336 hashSize(getHashSize()) {}
338 void BuildIdSection::writeTo(uint8_t *buf
) {
339 write32(buf
, 4); // Name size
340 write32(buf
+ 4, hashSize
); // Content size
341 write32(buf
+ 8, NT_GNU_BUILD_ID
); // Type
342 memcpy(buf
+ 12, "GNU", 4); // Name string
346 void BuildIdSection::writeBuildId(ArrayRef
<uint8_t> buf
) {
347 assert(buf
.size() == hashSize
);
348 memcpy(hashBuf
, buf
.data(), hashSize
);
351 BssSection::BssSection(StringRef name
, uint64_t size
, uint32_t alignment
)
352 : SyntheticSection(SHF_ALLOC
| SHF_WRITE
, SHT_NOBITS
, alignment
, name
) {
357 EhFrameSection::EhFrameSection()
358 : SyntheticSection(SHF_ALLOC
, SHT_PROGBITS
, 1, ".eh_frame") {}
360 // Search for an existing CIE record or create a new one.
361 // CIE records from input object files are uniquified by their contents
362 // and where their relocations point to.
363 template <class ELFT
, class RelTy
>
364 CieRecord
*EhFrameSection::addCie(EhSectionPiece
&cie
, ArrayRef
<RelTy
> rels
) {
365 Symbol
*personality
= nullptr;
366 unsigned firstRelI
= cie
.firstRelocation
;
367 if (firstRelI
!= (unsigned)-1)
369 &cie
.sec
->template getFile
<ELFT
>()->getRelocTargetSym(rels
[firstRelI
]);
371 // Search for an existing CIE by CIE contents/relocation target pair.
372 CieRecord
*&rec
= cieMap
[{cie
.data(), personality
}];
374 // If not found, create a new one.
376 rec
= make
<CieRecord
>();
378 cieRecords
.push_back(rec
);
383 // There is one FDE per function. Returns a non-null pointer to the function
384 // symbol if the given FDE points to a live function.
385 template <class ELFT
, class RelTy
>
386 Defined
*EhFrameSection::isFdeLive(EhSectionPiece
&fde
, ArrayRef
<RelTy
> rels
) {
387 auto *sec
= cast
<EhInputSection
>(fde
.sec
);
388 unsigned firstRelI
= fde
.firstRelocation
;
390 // An FDE should point to some function because FDEs are to describe
391 // functions. That's however not always the case due to an issue of
392 // ld.gold with -r. ld.gold may discard only functions and leave their
393 // corresponding FDEs, which results in creating bad .eh_frame sections.
394 // To deal with that, we ignore such FDEs.
395 if (firstRelI
== (unsigned)-1)
398 const RelTy
&rel
= rels
[firstRelI
];
399 Symbol
&b
= sec
->template getFile
<ELFT
>()->getRelocTargetSym(rel
);
401 // FDEs for garbage-collected or merged-by-ICF sections, or sections in
402 // another partition, are dead.
403 if (auto *d
= dyn_cast
<Defined
>(&b
))
404 if (!d
->folded
&& d
->section
&& d
->section
->partition
== partition
)
409 // .eh_frame is a sequence of CIE or FDE records. In general, there
410 // is one CIE record per input object file which is followed by
411 // a list of FDEs. This function searches an existing CIE or create a new
412 // one and associates FDEs to the CIE.
413 template <class ELFT
, class RelTy
>
414 void EhFrameSection::addRecords(EhInputSection
*sec
, ArrayRef
<RelTy
> rels
) {
416 for (EhSectionPiece
&cie
: sec
->cies
)
417 offsetToCie
[cie
.inputOff
] = addCie
<ELFT
>(cie
, rels
);
418 for (EhSectionPiece
&fde
: sec
->fdes
) {
419 uint32_t id
= endian::read32
<ELFT::TargetEndianness
>(fde
.data().data() + 4);
420 CieRecord
*rec
= offsetToCie
[fde
.inputOff
+ 4 - id
];
422 fatal(toString(sec
) + ": invalid CIE reference");
424 if (!isFdeLive
<ELFT
>(fde
, rels
))
426 rec
->fdes
.push_back(&fde
);
431 template <class ELFT
>
432 void EhFrameSection::addSectionAux(EhInputSection
*sec
) {
435 const RelsOrRelas
<ELFT
> rels
= sec
->template relsOrRelas
<ELFT
>();
436 if (rels
.areRelocsRel())
437 addRecords
<ELFT
>(sec
, rels
.rels
);
439 addRecords
<ELFT
>(sec
, rels
.relas
);
442 // Used by ICF<ELFT>::handleLSDA(). This function is very similar to
443 // EhFrameSection::addRecords().
444 template <class ELFT
, class RelTy
>
445 void EhFrameSection::iterateFDEWithLSDAAux(
446 EhInputSection
&sec
, ArrayRef
<RelTy
> rels
, DenseSet
<size_t> &ciesWithLSDA
,
447 llvm::function_ref
<void(InputSection
&)> fn
) {
448 for (EhSectionPiece
&cie
: sec
.cies
)
450 ciesWithLSDA
.insert(cie
.inputOff
);
451 for (EhSectionPiece
&fde
: sec
.fdes
) {
452 uint32_t id
= endian::read32
<ELFT::TargetEndianness
>(fde
.data().data() + 4);
453 if (!ciesWithLSDA
.contains(fde
.inputOff
+ 4 - id
))
456 // The CIE has a LSDA argument. Call fn with d's section.
457 if (Defined
*d
= isFdeLive
<ELFT
>(fde
, rels
))
458 if (auto *s
= dyn_cast_or_null
<InputSection
>(d
->section
))
463 template <class ELFT
>
464 void EhFrameSection::iterateFDEWithLSDA(
465 llvm::function_ref
<void(InputSection
&)> fn
) {
466 DenseSet
<size_t> ciesWithLSDA
;
467 for (EhInputSection
*sec
: sections
) {
468 ciesWithLSDA
.clear();
469 const RelsOrRelas
<ELFT
> rels
= sec
->template relsOrRelas
<ELFT
>();
470 if (rels
.areRelocsRel())
471 iterateFDEWithLSDAAux
<ELFT
>(*sec
, rels
.rels
, ciesWithLSDA
, fn
);
473 iterateFDEWithLSDAAux
<ELFT
>(*sec
, rels
.relas
, ciesWithLSDA
, fn
);
477 static void writeCieFde(uint8_t *buf
, ArrayRef
<uint8_t> d
) {
478 memcpy(buf
, d
.data(), d
.size());
479 // Fix the size field. -4 since size does not include the size field itself.
480 write32(buf
, d
.size() - 4);
483 void EhFrameSection::finalizeContents() {
484 assert(!this->size
); // Not finalized.
486 switch (config
->ekind
) {
488 llvm_unreachable("invalid ekind");
490 for (EhInputSection
*sec
: sections
)
491 addSectionAux
<ELF32LE
>(sec
);
494 for (EhInputSection
*sec
: sections
)
495 addSectionAux
<ELF32BE
>(sec
);
498 for (EhInputSection
*sec
: sections
)
499 addSectionAux
<ELF64LE
>(sec
);
502 for (EhInputSection
*sec
: sections
)
503 addSectionAux
<ELF64BE
>(sec
);
508 for (CieRecord
*rec
: cieRecords
) {
509 rec
->cie
->outputOff
= off
;
510 off
+= rec
->cie
->size
;
512 for (EhSectionPiece
*fde
: rec
->fdes
) {
513 fde
->outputOff
= off
;
518 // The LSB standard does not allow a .eh_frame section with zero
519 // Call Frame Information records. glibc unwind-dw2-fde.c
520 // classify_object_over_fdes expects there is a CIE record length 0 as a
521 // terminator. Thus we add one unconditionally.
527 // Returns data for .eh_frame_hdr. .eh_frame_hdr is a binary search table
528 // to get an FDE from an address to which FDE is applied. This function
529 // returns a list of such pairs.
530 SmallVector
<EhFrameSection::FdeData
, 0> EhFrameSection::getFdeData() const {
531 uint8_t *buf
= Out::bufferStart
+ getParent()->offset
+ outSecOff
;
532 SmallVector
<FdeData
, 0> ret
;
534 uint64_t va
= getPartition().ehFrameHdr
->getVA();
535 for (CieRecord
*rec
: cieRecords
) {
536 uint8_t enc
= getFdeEncoding(rec
->cie
);
537 for (EhSectionPiece
*fde
: rec
->fdes
) {
538 uint64_t pc
= getFdePc(buf
, fde
->outputOff
, enc
);
539 uint64_t fdeVA
= getParent()->addr
+ fde
->outputOff
;
540 if (!isInt
<32>(pc
- va
))
541 fatal(toString(fde
->sec
) + ": PC offset is too large: 0x" +
542 Twine::utohexstr(pc
- va
));
543 ret
.push_back({uint32_t(pc
- va
), uint32_t(fdeVA
- va
)});
547 // Sort the FDE list by their PC and uniqueify. Usually there is only
548 // one FDE for a PC (i.e. function), but if ICF merges two functions
549 // into one, there can be more than one FDEs pointing to the address.
550 auto less
= [](const FdeData
&a
, const FdeData
&b
) {
551 return a
.pcRel
< b
.pcRel
;
553 llvm::stable_sort(ret
, less
);
554 auto eq
= [](const FdeData
&a
, const FdeData
&b
) {
555 return a
.pcRel
== b
.pcRel
;
557 ret
.erase(std::unique(ret
.begin(), ret
.end(), eq
), ret
.end());
562 static uint64_t readFdeAddr(uint8_t *buf
, int size
) {
564 case DW_EH_PE_udata2
:
566 case DW_EH_PE_sdata2
:
567 return (int16_t)read16(buf
);
568 case DW_EH_PE_udata4
:
570 case DW_EH_PE_sdata4
:
571 return (int32_t)read32(buf
);
572 case DW_EH_PE_udata8
:
573 case DW_EH_PE_sdata8
:
575 case DW_EH_PE_absptr
:
576 return readUint(buf
);
578 fatal("unknown FDE size encoding");
581 // Returns the VA to which a given FDE (on a mmap'ed buffer) is applied to.
582 // We need it to create .eh_frame_hdr section.
583 uint64_t EhFrameSection::getFdePc(uint8_t *buf
, size_t fdeOff
,
585 // The starting address to which this FDE applies is
586 // stored at FDE + 8 byte. And this offset is within
587 // the .eh_frame section.
588 size_t off
= fdeOff
+ 8;
589 uint64_t addr
= readFdeAddr(buf
+ off
, enc
& 0xf);
590 if ((enc
& 0x70) == DW_EH_PE_absptr
)
592 if ((enc
& 0x70) == DW_EH_PE_pcrel
)
593 return addr
+ getParent()->addr
+ off
+ outSecOff
;
594 fatal("unknown FDE size relative encoding");
597 void EhFrameSection::writeTo(uint8_t *buf
) {
598 // Write CIE and FDE records.
599 for (CieRecord
*rec
: cieRecords
) {
600 size_t cieOffset
= rec
->cie
->outputOff
;
601 writeCieFde(buf
+ cieOffset
, rec
->cie
->data());
603 for (EhSectionPiece
*fde
: rec
->fdes
) {
604 size_t off
= fde
->outputOff
;
605 writeCieFde(buf
+ off
, fde
->data());
607 // FDE's second word should have the offset to an associated CIE.
609 write32(buf
+ off
+ 4, off
+ 4 - cieOffset
);
613 // Apply relocations. .eh_frame section contents are not contiguous
614 // in the output buffer, but relocateAlloc() still works because
615 // getOffset() takes care of discontiguous section pieces.
616 for (EhInputSection
*s
: sections
)
617 target
->relocateAlloc(*s
, buf
);
619 if (getPartition().ehFrameHdr
&& getPartition().ehFrameHdr
->getParent())
620 getPartition().ehFrameHdr
->write();
623 GotSection::GotSection()
624 : SyntheticSection(SHF_ALLOC
| SHF_WRITE
, SHT_PROGBITS
,
625 target
->gotEntrySize
, ".got") {
626 numEntries
= target
->gotHeaderEntriesNum
;
629 void GotSection::addConstant(const Relocation
&r
) { relocations
.push_back(r
); }
630 void GotSection::addEntry(Symbol
&sym
) {
631 assert(sym
.auxIdx
== symAux
.size() - 1);
632 symAux
.back().gotIdx
= numEntries
++;
635 bool GotSection::addTlsDescEntry(Symbol
&sym
) {
636 assert(sym
.auxIdx
== symAux
.size() - 1);
637 symAux
.back().tlsDescIdx
= numEntries
;
642 bool GotSection::addDynTlsEntry(Symbol
&sym
) {
643 assert(sym
.auxIdx
== symAux
.size() - 1);
644 symAux
.back().tlsGdIdx
= numEntries
;
645 // Global Dynamic TLS entries take two GOT slots.
650 // Reserves TLS entries for a TLS module ID and a TLS block offset.
651 // In total it takes two GOT slots.
652 bool GotSection::addTlsIndex() {
653 if (tlsIndexOff
!= uint32_t(-1))
655 tlsIndexOff
= numEntries
* config
->wordsize
;
660 uint32_t GotSection::getTlsDescOffset(const Symbol
&sym
) const {
661 return sym
.getTlsDescIdx() * config
->wordsize
;
664 uint64_t GotSection::getTlsDescAddr(const Symbol
&sym
) const {
665 return getVA() + getTlsDescOffset(sym
);
668 uint64_t GotSection::getGlobalDynAddr(const Symbol
&b
) const {
669 return this->getVA() + b
.getTlsGdIdx() * config
->wordsize
;
672 uint64_t GotSection::getGlobalDynOffset(const Symbol
&b
) const {
673 return b
.getTlsGdIdx() * config
->wordsize
;
676 void GotSection::finalizeContents() {
677 if (config
->emachine
== EM_PPC64
&&
678 numEntries
<= target
->gotHeaderEntriesNum
&& !ElfSym::globalOffsetTable
)
681 size
= numEntries
* config
->wordsize
;
684 bool GotSection::isNeeded() const {
685 // Needed if the GOT symbol is used or the number of entries is more than just
686 // the header. A GOT with just the header may not be needed.
687 return hasGotOffRel
|| numEntries
> target
->gotHeaderEntriesNum
;
690 void GotSection::writeTo(uint8_t *buf
) {
691 // On PPC64 .got may be needed but empty. Skip the write.
694 target
->writeGotHeader(buf
);
695 target
->relocateAlloc(*this, buf
);
698 static uint64_t getMipsPageAddr(uint64_t addr
) {
699 return (addr
+ 0x8000) & ~0xffff;
702 static uint64_t getMipsPageCount(uint64_t size
) {
703 return (size
+ 0xfffe) / 0xffff + 1;
706 MipsGotSection::MipsGotSection()
707 : SyntheticSection(SHF_ALLOC
| SHF_WRITE
| SHF_MIPS_GPREL
, SHT_PROGBITS
, 16,
710 void MipsGotSection::addEntry(InputFile
&file
, Symbol
&sym
, int64_t addend
,
712 FileGot
&g
= getGot(file
);
713 if (expr
== R_MIPS_GOT_LOCAL_PAGE
) {
714 if (const OutputSection
*os
= sym
.getOutputSection())
715 g
.pagesMap
.insert({os
, {}});
717 g
.local16
.insert({{nullptr, getMipsPageAddr(sym
.getVA(addend
))}, 0});
718 } else if (sym
.isTls())
719 g
.tls
.insert({&sym
, 0});
720 else if (sym
.isPreemptible
&& expr
== R_ABS
)
721 g
.relocs
.insert({&sym
, 0});
722 else if (sym
.isPreemptible
)
723 g
.global
.insert({&sym
, 0});
724 else if (expr
== R_MIPS_GOT_OFF32
)
725 g
.local32
.insert({{&sym
, addend
}, 0});
727 g
.local16
.insert({{&sym
, addend
}, 0});
730 void MipsGotSection::addDynTlsEntry(InputFile
&file
, Symbol
&sym
) {
731 getGot(file
).dynTlsSymbols
.insert({&sym
, 0});
734 void MipsGotSection::addTlsIndex(InputFile
&file
) {
735 getGot(file
).dynTlsSymbols
.insert({nullptr, 0});
738 size_t MipsGotSection::FileGot::getEntriesNum() const {
739 return getPageEntriesNum() + local16
.size() + global
.size() + relocs
.size() +
740 tls
.size() + dynTlsSymbols
.size() * 2;
743 size_t MipsGotSection::FileGot::getPageEntriesNum() const {
745 for (const std::pair
<const OutputSection
*, FileGot::PageBlock
> &p
: pagesMap
)
746 num
+= p
.second
.count
;
750 size_t MipsGotSection::FileGot::getIndexedEntriesNum() const {
751 size_t count
= getPageEntriesNum() + local16
.size() + global
.size();
752 // If there are relocation-only entries in the GOT, TLS entries
753 // are allocated after them. TLS entries should be addressable
754 // by 16-bit index so count both reloc-only and TLS entries.
755 if (!tls
.empty() || !dynTlsSymbols
.empty())
756 count
+= relocs
.size() + tls
.size() + dynTlsSymbols
.size() * 2;
760 MipsGotSection::FileGot
&MipsGotSection::getGot(InputFile
&f
) {
761 if (f
.mipsGotIndex
== uint32_t(-1)) {
763 gots
.back().file
= &f
;
764 f
.mipsGotIndex
= gots
.size() - 1;
766 return gots
[f
.mipsGotIndex
];
769 uint64_t MipsGotSection::getPageEntryOffset(const InputFile
*f
,
771 int64_t addend
) const {
772 const FileGot
&g
= gots
[f
->mipsGotIndex
];
774 if (const OutputSection
*outSec
= sym
.getOutputSection()) {
775 uint64_t secAddr
= getMipsPageAddr(outSec
->addr
);
776 uint64_t symAddr
= getMipsPageAddr(sym
.getVA(addend
));
777 index
= g
.pagesMap
.lookup(outSec
).firstIndex
+ (symAddr
- secAddr
) / 0xffff;
779 index
= g
.local16
.lookup({nullptr, getMipsPageAddr(sym
.getVA(addend
))});
781 return index
* config
->wordsize
;
784 uint64_t MipsGotSection::getSymEntryOffset(const InputFile
*f
, const Symbol
&s
,
785 int64_t addend
) const {
786 const FileGot
&g
= gots
[f
->mipsGotIndex
];
787 Symbol
*sym
= const_cast<Symbol
*>(&s
);
789 return g
.tls
.lookup(sym
) * config
->wordsize
;
790 if (sym
->isPreemptible
)
791 return g
.global
.lookup(sym
) * config
->wordsize
;
792 return g
.local16
.lookup({sym
, addend
}) * config
->wordsize
;
795 uint64_t MipsGotSection::getTlsIndexOffset(const InputFile
*f
) const {
796 const FileGot
&g
= gots
[f
->mipsGotIndex
];
797 return g
.dynTlsSymbols
.lookup(nullptr) * config
->wordsize
;
800 uint64_t MipsGotSection::getGlobalDynOffset(const InputFile
*f
,
801 const Symbol
&s
) const {
802 const FileGot
&g
= gots
[f
->mipsGotIndex
];
803 Symbol
*sym
= const_cast<Symbol
*>(&s
);
804 return g
.dynTlsSymbols
.lookup(sym
) * config
->wordsize
;
807 const Symbol
*MipsGotSection::getFirstGlobalEntry() const {
810 const FileGot
&primGot
= gots
.front();
811 if (!primGot
.global
.empty())
812 return primGot
.global
.front().first
;
813 if (!primGot
.relocs
.empty())
814 return primGot
.relocs
.front().first
;
818 unsigned MipsGotSection::getLocalEntriesNum() const {
820 return headerEntriesNum
;
821 return headerEntriesNum
+ gots
.front().getPageEntriesNum() +
822 gots
.front().local16
.size();
825 bool MipsGotSection::tryMergeGots(FileGot
&dst
, FileGot
&src
, bool isPrimary
) {
827 set_union(tmp
.pagesMap
, src
.pagesMap
);
828 set_union(tmp
.local16
, src
.local16
);
829 set_union(tmp
.global
, src
.global
);
830 set_union(tmp
.relocs
, src
.relocs
);
831 set_union(tmp
.tls
, src
.tls
);
832 set_union(tmp
.dynTlsSymbols
, src
.dynTlsSymbols
);
834 size_t count
= isPrimary
? headerEntriesNum
: 0;
835 count
+= tmp
.getIndexedEntriesNum();
837 if (count
* config
->wordsize
> config
->mipsGotSize
)
844 void MipsGotSection::finalizeContents() { updateAllocSize(); }
846 bool MipsGotSection::updateAllocSize() {
847 size
= headerEntriesNum
* config
->wordsize
;
848 for (const FileGot
&g
: gots
)
849 size
+= g
.getEntriesNum() * config
->wordsize
;
853 void MipsGotSection::build() {
857 std::vector
<FileGot
> mergedGots(1);
859 // For each GOT move non-preemptible symbols from the `Global`
860 // to `Local16` list. Preemptible symbol might become non-preemptible
861 // one if, for example, it gets a related copy relocation.
862 for (FileGot
&got
: gots
) {
863 for (auto &p
: got
.global
)
864 if (!p
.first
->isPreemptible
)
865 got
.local16
.insert({{p
.first
, 0}, 0});
866 got
.global
.remove_if([&](const std::pair
<Symbol
*, size_t> &p
) {
867 return !p
.first
->isPreemptible
;
871 // For each GOT remove "reloc-only" entry if there is "global"
872 // entry for the same symbol. And add local entries which indexed
873 // using 32-bit value at the end of 16-bit entries.
874 for (FileGot
&got
: gots
) {
875 got
.relocs
.remove_if([&](const std::pair
<Symbol
*, size_t> &p
) {
876 return got
.global
.count(p
.first
);
878 set_union(got
.local16
, got
.local32
);
882 // Evaluate number of "reloc-only" entries in the resulting GOT.
883 // To do that put all unique "reloc-only" and "global" entries
884 // from all GOTs to the future primary GOT.
885 FileGot
*primGot
= &mergedGots
.front();
886 for (FileGot
&got
: gots
) {
887 set_union(primGot
->relocs
, got
.global
);
888 set_union(primGot
->relocs
, got
.relocs
);
892 // Evaluate number of "page" entries in each GOT.
893 for (FileGot
&got
: gots
) {
894 for (std::pair
<const OutputSection
*, FileGot::PageBlock
> &p
:
896 const OutputSection
*os
= p
.first
;
897 uint64_t secSize
= 0;
898 for (SectionCommand
*cmd
: os
->commands
) {
899 if (auto *isd
= dyn_cast
<InputSectionDescription
>(cmd
))
900 for (InputSection
*isec
: isd
->sections
) {
901 uint64_t off
= alignToPowerOf2(secSize
, isec
->addralign
);
902 secSize
= off
+ isec
->getSize();
905 p
.second
.count
= getMipsPageCount(secSize
);
909 // Merge GOTs. Try to join as much as possible GOTs but do not exceed
910 // maximum GOT size. At first, try to fill the primary GOT because
911 // the primary GOT can be accessed in the most effective way. If it
912 // is not possible, try to fill the last GOT in the list, and finally
913 // create a new GOT if both attempts failed.
914 for (FileGot
&srcGot
: gots
) {
915 InputFile
*file
= srcGot
.file
;
916 if (tryMergeGots(mergedGots
.front(), srcGot
, true)) {
917 file
->mipsGotIndex
= 0;
919 // If this is the first time we failed to merge with the primary GOT,
920 // MergedGots.back() will also be the primary GOT. We must make sure not
921 // to try to merge again with isPrimary=false, as otherwise, if the
922 // inputs are just right, we could allow the primary GOT to become 1 or 2
923 // words bigger due to ignoring the header size.
924 if (mergedGots
.size() == 1 ||
925 !tryMergeGots(mergedGots
.back(), srcGot
, false)) {
926 mergedGots
.emplace_back();
927 std::swap(mergedGots
.back(), srcGot
);
929 file
->mipsGotIndex
= mergedGots
.size() - 1;
932 std::swap(gots
, mergedGots
);
934 // Reduce number of "reloc-only" entries in the primary GOT
935 // by subtracting "global" entries in the primary GOT.
936 primGot
= &gots
.front();
937 primGot
->relocs
.remove_if([&](const std::pair
<Symbol
*, size_t> &p
) {
938 return primGot
->global
.count(p
.first
);
941 // Calculate indexes for each GOT entry.
942 size_t index
= headerEntriesNum
;
943 for (FileGot
&got
: gots
) {
944 got
.startIndex
= &got
== primGot
? 0 : index
;
945 for (std::pair
<const OutputSection
*, FileGot::PageBlock
> &p
:
947 // For each output section referenced by GOT page relocations calculate
948 // and save into pagesMap an upper bound of MIPS GOT entries required
949 // to store page addresses of local symbols. We assume the worst case -
950 // each 64kb page of the output section has at least one GOT relocation
951 // against it. And take in account the case when the section intersects
953 p
.second
.firstIndex
= index
;
954 index
+= p
.second
.count
;
956 for (auto &p
: got
.local16
)
958 for (auto &p
: got
.global
)
960 for (auto &p
: got
.relocs
)
962 for (auto &p
: got
.tls
)
964 for (auto &p
: got
.dynTlsSymbols
) {
970 // Update SymbolAux::gotIdx field to use this
971 // value later in the `sortMipsSymbols` function.
972 for (auto &p
: primGot
->global
) {
973 if (p
.first
->auxIdx
== 0)
974 p
.first
->allocateAux();
975 symAux
.back().gotIdx
= p
.second
;
977 for (auto &p
: primGot
->relocs
) {
978 if (p
.first
->auxIdx
== 0)
979 p
.first
->allocateAux();
980 symAux
.back().gotIdx
= p
.second
;
983 // Create dynamic relocations.
984 for (FileGot
&got
: gots
) {
985 // Create dynamic relocations for TLS entries.
986 for (std::pair
<Symbol
*, size_t> &p
: got
.tls
) {
988 uint64_t offset
= p
.second
* config
->wordsize
;
989 // When building a shared library we still need a dynamic relocation
990 // for the TP-relative offset as we don't know how much other data will
991 // be allocated before us in the static TLS block.
992 if (s
->isPreemptible
|| config
->shared
)
993 mainPart
->relaDyn
->addReloc({target
->tlsGotRel
, this, offset
,
994 DynamicReloc::AgainstSymbolWithTargetVA
,
997 for (std::pair
<Symbol
*, size_t> &p
: got
.dynTlsSymbols
) {
999 uint64_t offset
= p
.second
* config
->wordsize
;
1001 if (!config
->shared
)
1003 mainPart
->relaDyn
->addReloc({target
->tlsModuleIndexRel
, this, offset
});
1005 // When building a shared library we still need a dynamic relocation
1006 // for the module index. Therefore only checking for
1007 // S->isPreemptible is not sufficient (this happens e.g. for
1008 // thread-locals that have been marked as local through a linker script)
1009 if (!s
->isPreemptible
&& !config
->shared
)
1011 mainPart
->relaDyn
->addSymbolReloc(target
->tlsModuleIndexRel
, *this,
1013 // However, we can skip writing the TLS offset reloc for non-preemptible
1014 // symbols since it is known even in shared libraries
1015 if (!s
->isPreemptible
)
1017 offset
+= config
->wordsize
;
1018 mainPart
->relaDyn
->addSymbolReloc(target
->tlsOffsetRel
, *this, offset
,
1023 // Do not create dynamic relocations for non-TLS
1024 // entries in the primary GOT.
1025 if (&got
== primGot
)
1028 // Dynamic relocations for "global" entries.
1029 for (const std::pair
<Symbol
*, size_t> &p
: got
.global
) {
1030 uint64_t offset
= p
.second
* config
->wordsize
;
1031 mainPart
->relaDyn
->addSymbolReloc(target
->relativeRel
, *this, offset
,
1036 // Dynamic relocations for "local" entries in case of PIC.
1037 for (const std::pair
<const OutputSection
*, FileGot::PageBlock
> &l
:
1039 size_t pageCount
= l
.second
.count
;
1040 for (size_t pi
= 0; pi
< pageCount
; ++pi
) {
1041 uint64_t offset
= (l
.second
.firstIndex
+ pi
) * config
->wordsize
;
1042 mainPart
->relaDyn
->addReloc({target
->relativeRel
, this, offset
, l
.first
,
1043 int64_t(pi
* 0x10000)});
1046 for (const std::pair
<GotEntry
, size_t> &p
: got
.local16
) {
1047 uint64_t offset
= p
.second
* config
->wordsize
;
1048 mainPart
->relaDyn
->addReloc({target
->relativeRel
, this, offset
,
1049 DynamicReloc::AddendOnlyWithTargetVA
,
1050 *p
.first
.first
, p
.first
.second
, R_ABS
});
1055 bool MipsGotSection::isNeeded() const {
1056 // We add the .got section to the result for dynamic MIPS target because
1057 // its address and properties are mentioned in the .dynamic section.
1058 return !config
->relocatable
;
1061 uint64_t MipsGotSection::getGp(const InputFile
*f
) const {
1062 // For files without related GOT or files refer a primary GOT
1063 // returns "common" _gp value. For secondary GOTs calculate
1064 // individual _gp values.
1065 if (!f
|| f
->mipsGotIndex
== uint32_t(-1) || f
->mipsGotIndex
== 0)
1066 return ElfSym::mipsGp
->getVA(0);
1067 return getVA() + gots
[f
->mipsGotIndex
].startIndex
* config
->wordsize
+ 0x7ff0;
1070 void MipsGotSection::writeTo(uint8_t *buf
) {
1071 // Set the MSB of the second GOT slot. This is not required by any
1072 // MIPS ABI documentation, though.
1074 // There is a comment in glibc saying that "The MSB of got[1] of a
1075 // gnu object is set to identify gnu objects," and in GNU gold it
1076 // says "the second entry will be used by some runtime loaders".
1077 // But how this field is being used is unclear.
1079 // We are not really willing to mimic other linkers behaviors
1080 // without understanding why they do that, but because all files
1081 // generated by GNU tools have this special GOT value, and because
1082 // we've been doing this for years, it is probably a safe bet to
1083 // keep doing this for now. We really need to revisit this to see
1084 // if we had to do this.
1085 writeUint(buf
+ config
->wordsize
, (uint64_t)1 << (config
->wordsize
* 8 - 1));
1086 for (const FileGot
&g
: gots
) {
1087 auto write
= [&](size_t i
, const Symbol
*s
, int64_t a
) {
1091 writeUint(buf
+ i
* config
->wordsize
, va
);
1093 // Write 'page address' entries to the local part of the GOT.
1094 for (const std::pair
<const OutputSection
*, FileGot::PageBlock
> &l
:
1096 size_t pageCount
= l
.second
.count
;
1097 uint64_t firstPageAddr
= getMipsPageAddr(l
.first
->addr
);
1098 for (size_t pi
= 0; pi
< pageCount
; ++pi
)
1099 write(l
.second
.firstIndex
+ pi
, nullptr, firstPageAddr
+ pi
* 0x10000);
1101 // Local, global, TLS, reloc-only entries.
1102 // If TLS entry has a corresponding dynamic relocations, leave it
1103 // initialized by zero. Write down adjusted TLS symbol's values otherwise.
1104 // To calculate the adjustments use offsets for thread-local storage.
1105 // http://web.archive.org/web/20190324223224/https://www.linux-mips.org/wiki/NPTL
1106 for (const std::pair
<GotEntry
, size_t> &p
: g
.local16
)
1107 write(p
.second
, p
.first
.first
, p
.first
.second
);
1108 // Write VA to the primary GOT only. For secondary GOTs that
1109 // will be done by REL32 dynamic relocations.
1110 if (&g
== &gots
.front())
1111 for (const std::pair
<Symbol
*, size_t> &p
: g
.global
)
1112 write(p
.second
, p
.first
, 0);
1113 for (const std::pair
<Symbol
*, size_t> &p
: g
.relocs
)
1114 write(p
.second
, p
.first
, 0);
1115 for (const std::pair
<Symbol
*, size_t> &p
: g
.tls
)
1116 write(p
.second
, p
.first
,
1117 p
.first
->isPreemptible
|| config
->shared
? 0 : -0x7000);
1118 for (const std::pair
<Symbol
*, size_t> &p
: g
.dynTlsSymbols
) {
1119 if (p
.first
== nullptr && !config
->shared
)
1120 write(p
.second
, nullptr, 1);
1121 else if (p
.first
&& !p
.first
->isPreemptible
) {
1122 // If we are emitting a shared library with relocations we mustn't write
1123 // anything to the GOT here. When using Elf_Rel relocations the value
1124 // one will be treated as an addend and will cause crashes at runtime
1125 if (!config
->shared
)
1126 write(p
.second
, nullptr, 1);
1127 write(p
.second
+ 1, p
.first
, -0x8000);
1133 // On PowerPC the .plt section is used to hold the table of function addresses
1134 // instead of the .got.plt, and the type is SHT_NOBITS similar to a .bss
1135 // section. I don't know why we have a BSS style type for the section but it is
1136 // consistent across both 64-bit PowerPC ABIs as well as the 32-bit PowerPC ABI.
1137 GotPltSection::GotPltSection()
1138 : SyntheticSection(SHF_ALLOC
| SHF_WRITE
, SHT_PROGBITS
, config
->wordsize
,
1140 if (config
->emachine
== EM_PPC
) {
1142 } else if (config
->emachine
== EM_PPC64
) {
1148 void GotPltSection::addEntry(Symbol
&sym
) {
1149 assert(sym
.auxIdx
== symAux
.size() - 1 &&
1150 symAux
.back().pltIdx
== entries
.size());
1151 entries
.push_back(&sym
);
1154 size_t GotPltSection::getSize() const {
1155 return (target
->gotPltHeaderEntriesNum
+ entries
.size()) *
1156 target
->gotEntrySize
;
1159 void GotPltSection::writeTo(uint8_t *buf
) {
1160 target
->writeGotPltHeader(buf
);
1161 buf
+= target
->gotPltHeaderEntriesNum
* target
->gotEntrySize
;
1162 for (const Symbol
*b
: entries
) {
1163 target
->writeGotPlt(buf
, *b
);
1164 buf
+= target
->gotEntrySize
;
1168 bool GotPltSection::isNeeded() const {
1169 // We need to emit GOTPLT even if it's empty if there's a relocation relative
1171 return !entries
.empty() || hasGotPltOffRel
;
1174 static StringRef
getIgotPltName() {
1175 // On ARM the IgotPltSection is part of the GotSection.
1176 if (config
->emachine
== EM_ARM
)
1179 // On PowerPC64 the GotPltSection is renamed to '.plt' so the IgotPltSection
1180 // needs to be named the same.
1181 if (config
->emachine
== EM_PPC64
)
1187 // On PowerPC64 the GotPltSection type is SHT_NOBITS so we have to follow suit
1188 // with the IgotPltSection.
1189 IgotPltSection::IgotPltSection()
1190 : SyntheticSection(SHF_ALLOC
| SHF_WRITE
,
1191 config
->emachine
== EM_PPC64
? SHT_NOBITS
: SHT_PROGBITS
,
1192 target
->gotEntrySize
, getIgotPltName()) {}
1194 void IgotPltSection::addEntry(Symbol
&sym
) {
1195 assert(symAux
.back().pltIdx
== entries
.size());
1196 entries
.push_back(&sym
);
1199 size_t IgotPltSection::getSize() const {
1200 return entries
.size() * target
->gotEntrySize
;
1203 void IgotPltSection::writeTo(uint8_t *buf
) {
1204 for (const Symbol
*b
: entries
) {
1205 target
->writeIgotPlt(buf
, *b
);
1206 buf
+= target
->gotEntrySize
;
1210 StringTableSection::StringTableSection(StringRef name
, bool dynamic
)
1211 : SyntheticSection(dynamic
? (uint64_t)SHF_ALLOC
: 0, SHT_STRTAB
, 1, name
),
1213 // ELF string tables start with a NUL byte.
1214 strings
.push_back("");
1215 stringMap
.try_emplace(CachedHashStringRef(""), 0);
1219 // Adds a string to the string table. If `hashIt` is true we hash and check for
1220 // duplicates. It is optional because the name of global symbols are already
1221 // uniqued and hashing them again has a big cost for a small value: uniquing
1222 // them with some other string that happens to be the same.
1223 unsigned StringTableSection::addString(StringRef s
, bool hashIt
) {
1225 auto r
= stringMap
.try_emplace(CachedHashStringRef(s
), size
);
1227 return r
.first
->second
;
1231 unsigned ret
= this->size
;
1232 this->size
= this->size
+ s
.size() + 1;
1233 strings
.push_back(s
);
1237 void StringTableSection::writeTo(uint8_t *buf
) {
1238 for (StringRef s
: strings
) {
1239 memcpy(buf
, s
.data(), s
.size());
1240 buf
[s
.size()] = '\0';
1241 buf
+= s
.size() + 1;
1245 // Returns the number of entries in .gnu.version_d: the number of
1246 // non-VER_NDX_LOCAL-non-VER_NDX_GLOBAL definitions, plus 1.
1247 // Note that we don't support vd_cnt > 1 yet.
1248 static unsigned getVerDefNum() {
1249 return namedVersionDefs().size() + 1;
1252 template <class ELFT
>
1253 DynamicSection
<ELFT
>::DynamicSection()
1254 : SyntheticSection(SHF_ALLOC
| SHF_WRITE
, SHT_DYNAMIC
, config
->wordsize
,
1256 this->entsize
= ELFT::Is64Bits
? 16 : 8;
1258 // .dynamic section is not writable on MIPS and on Fuchsia OS
1259 // which passes -z rodynamic.
1260 // See "Special Section" in Chapter 4 in the following document:
1261 // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
1262 if (config
->emachine
== EM_MIPS
|| config
->zRodynamic
)
1263 this->flags
= SHF_ALLOC
;
1266 // The output section .rela.dyn may include these synthetic sections:
1269 // - in.relaIplt: this is included if in.relaIplt is named .rela.dyn
1270 // - in.relaPlt: this is included if a linker script places .rela.plt inside
1273 // DT_RELASZ is the total size of the included sections.
1274 static uint64_t addRelaSz(const RelocationBaseSection
&relaDyn
) {
1275 size_t size
= relaDyn
.getSize();
1276 if (in
.relaIplt
->getParent() == relaDyn
.getParent())
1277 size
+= in
.relaIplt
->getSize();
1278 if (in
.relaPlt
->getParent() == relaDyn
.getParent())
1279 size
+= in
.relaPlt
->getSize();
1283 // A Linker script may assign the RELA relocation sections to the same
1284 // output section. When this occurs we cannot just use the OutputSection
1285 // Size. Moreover the [DT_JMPREL, DT_JMPREL + DT_PLTRELSZ) is permitted to
1286 // overlap with the [DT_RELA, DT_RELA + DT_RELASZ).
1287 static uint64_t addPltRelSz() {
1288 size_t size
= in
.relaPlt
->getSize();
1289 if (in
.relaIplt
->getParent() == in
.relaPlt
->getParent() &&
1290 in
.relaIplt
->name
== in
.relaPlt
->name
)
1291 size
+= in
.relaIplt
->getSize();
1295 // Add remaining entries to complete .dynamic contents.
1296 template <class ELFT
>
1297 std::vector
<std::pair
<int32_t, uint64_t>>
1298 DynamicSection
<ELFT
>::computeContents() {
1299 elf::Partition
&part
= getPartition();
1300 bool isMain
= part
.name
.empty();
1301 std::vector
<std::pair
<int32_t, uint64_t>> entries
;
1303 auto addInt
= [&](int32_t tag
, uint64_t val
) {
1304 entries
.emplace_back(tag
, val
);
1306 auto addInSec
= [&](int32_t tag
, const InputSection
&sec
) {
1307 entries
.emplace_back(tag
, sec
.getVA());
1310 for (StringRef s
: config
->filterList
)
1311 addInt(DT_FILTER
, part
.dynStrTab
->addString(s
));
1312 for (StringRef s
: config
->auxiliaryList
)
1313 addInt(DT_AUXILIARY
, part
.dynStrTab
->addString(s
));
1315 if (!config
->rpath
.empty())
1316 addInt(config
->enableNewDtags
? DT_RUNPATH
: DT_RPATH
,
1317 part
.dynStrTab
->addString(config
->rpath
));
1319 for (SharedFile
*file
: ctx
.sharedFiles
)
1321 addInt(DT_NEEDED
, part
.dynStrTab
->addString(file
->soName
));
1324 if (!config
->soName
.empty())
1325 addInt(DT_SONAME
, part
.dynStrTab
->addString(config
->soName
));
1327 if (!config
->soName
.empty())
1328 addInt(DT_NEEDED
, part
.dynStrTab
->addString(config
->soName
));
1329 addInt(DT_SONAME
, part
.dynStrTab
->addString(part
.name
));
1332 // Set DT_FLAGS and DT_FLAGS_1.
1333 uint32_t dtFlags
= 0;
1334 uint32_t dtFlags1
= 0;
1335 if (config
->bsymbolic
== BsymbolicKind::All
)
1336 dtFlags
|= DF_SYMBOLIC
;
1337 if (config
->zGlobal
)
1338 dtFlags1
|= DF_1_GLOBAL
;
1339 if (config
->zInitfirst
)
1340 dtFlags1
|= DF_1_INITFIRST
;
1341 if (config
->zInterpose
)
1342 dtFlags1
|= DF_1_INTERPOSE
;
1343 if (config
->zNodefaultlib
)
1344 dtFlags1
|= DF_1_NODEFLIB
;
1345 if (config
->zNodelete
)
1346 dtFlags1
|= DF_1_NODELETE
;
1347 if (config
->zNodlopen
)
1348 dtFlags1
|= DF_1_NOOPEN
;
1350 dtFlags1
|= DF_1_PIE
;
1352 dtFlags
|= DF_BIND_NOW
;
1353 dtFlags1
|= DF_1_NOW
;
1355 if (config
->zOrigin
) {
1356 dtFlags
|= DF_ORIGIN
;
1357 dtFlags1
|= DF_1_ORIGIN
;
1360 dtFlags
|= DF_TEXTREL
;
1361 if (ctx
.hasTlsIe
&& config
->shared
)
1362 dtFlags
|= DF_STATIC_TLS
;
1365 addInt(DT_FLAGS
, dtFlags
);
1367 addInt(DT_FLAGS_1
, dtFlags1
);
1369 // DT_DEBUG is a pointer to debug information used by debuggers at runtime. We
1370 // need it for each process, so we don't write it for DSOs. The loader writes
1371 // the pointer into this entry.
1373 // DT_DEBUG is the only .dynamic entry that needs to be written to. Some
1374 // systems (currently only Fuchsia OS) provide other means to give the
1375 // debugger this information. Such systems may choose make .dynamic read-only.
1376 // If the target is such a system (used -z rodynamic) don't write DT_DEBUG.
1377 if (!config
->shared
&& !config
->relocatable
&& !config
->zRodynamic
)
1378 addInt(DT_DEBUG
, 0);
1380 if (part
.relaDyn
->isNeeded() ||
1381 (in
.relaIplt
->isNeeded() &&
1382 part
.relaDyn
->getParent() == in
.relaIplt
->getParent())) {
1383 addInSec(part
.relaDyn
->dynamicTag
, *part
.relaDyn
);
1384 entries
.emplace_back(part
.relaDyn
->sizeDynamicTag
,
1385 addRelaSz(*part
.relaDyn
));
1387 bool isRela
= config
->isRela
;
1388 addInt(isRela
? DT_RELAENT
: DT_RELENT
,
1389 isRela
? sizeof(Elf_Rela
) : sizeof(Elf_Rel
));
1391 // MIPS dynamic loader does not support RELCOUNT tag.
1392 // The problem is in the tight relation between dynamic
1393 // relocations and GOT. So do not emit this tag on MIPS.
1394 if (config
->emachine
!= EM_MIPS
) {
1395 size_t numRelativeRels
= part
.relaDyn
->getRelativeRelocCount();
1396 if (config
->zCombreloc
&& numRelativeRels
)
1397 addInt(isRela
? DT_RELACOUNT
: DT_RELCOUNT
, numRelativeRels
);
1400 if (part
.relrDyn
&& part
.relrDyn
->getParent() &&
1401 !part
.relrDyn
->relocs
.empty()) {
1402 addInSec(config
->useAndroidRelrTags
? DT_ANDROID_RELR
: DT_RELR
,
1404 addInt(config
->useAndroidRelrTags
? DT_ANDROID_RELRSZ
: DT_RELRSZ
,
1405 part
.relrDyn
->getParent()->size
);
1406 addInt(config
->useAndroidRelrTags
? DT_ANDROID_RELRENT
: DT_RELRENT
,
1409 // .rel[a].plt section usually consists of two parts, containing plt and
1410 // iplt relocations. It is possible to have only iplt relocations in the
1411 // output. In that case relaPlt is empty and have zero offset, the same offset
1412 // as relaIplt has. And we still want to emit proper dynamic tags for that
1413 // case, so here we always use relaPlt as marker for the beginning of
1414 // .rel[a].plt section.
1415 if (isMain
&& (in
.relaPlt
->isNeeded() || in
.relaIplt
->isNeeded())) {
1416 addInSec(DT_JMPREL
, *in
.relaPlt
);
1417 entries
.emplace_back(DT_PLTRELSZ
, addPltRelSz());
1418 switch (config
->emachine
) {
1420 addInSec(DT_MIPS_PLTGOT
, *in
.gotPlt
);
1423 addInSec(DT_PLTGOT
, *in
.plt
);
1426 if (llvm::find_if(in
.relaPlt
->relocs
, [](const DynamicReloc
&r
) {
1427 return r
.type
== target
->pltRel
&&
1428 r
.sym
->stOther
& STO_AARCH64_VARIANT_PCS
;
1429 }) != in
.relaPlt
->relocs
.end())
1430 addInt(DT_AARCH64_VARIANT_PCS
, 0);
1431 addInSec(DT_PLTGOT
, *in
.gotPlt
);
1434 if (llvm::any_of(in
.relaPlt
->relocs
, [](const DynamicReloc
&r
) {
1435 return r
.type
== target
->pltRel
&&
1436 (r
.sym
->stOther
& STO_RISCV_VARIANT_CC
);
1438 addInt(DT_RISCV_VARIANT_CC
, 0);
1441 addInSec(DT_PLTGOT
, *in
.gotPlt
);
1444 addInt(DT_PLTREL
, config
->isRela
? DT_RELA
: DT_REL
);
1447 if (config
->emachine
== EM_AARCH64
) {
1448 if (config
->andFeatures
& GNU_PROPERTY_AARCH64_FEATURE_1_BTI
)
1449 addInt(DT_AARCH64_BTI_PLT
, 0);
1450 if (config
->zPacPlt
)
1451 addInt(DT_AARCH64_PAC_PLT
, 0);
1453 if (config
->androidMemtagMode
!= ELF::NT_MEMTAG_LEVEL_NONE
) {
1454 addInt(DT_AARCH64_MEMTAG_MODE
, config
->androidMemtagMode
== NT_MEMTAG_LEVEL_ASYNC
);
1455 addInt(DT_AARCH64_MEMTAG_HEAP
, config
->androidMemtagHeap
);
1456 addInt(DT_AARCH64_MEMTAG_STACK
, config
->androidMemtagStack
);
1457 if (mainPart
->memtagDescriptors
->isNeeded()) {
1458 addInSec(DT_AARCH64_MEMTAG_GLOBALS
, *mainPart
->memtagDescriptors
);
1459 addInt(DT_AARCH64_MEMTAG_GLOBALSSZ
, mainPart
->memtagDescriptors
->getSize());
1464 addInSec(DT_SYMTAB
, *part
.dynSymTab
);
1465 addInt(DT_SYMENT
, sizeof(Elf_Sym
));
1466 addInSec(DT_STRTAB
, *part
.dynStrTab
);
1467 addInt(DT_STRSZ
, part
.dynStrTab
->getSize());
1469 addInt(DT_TEXTREL
, 0);
1470 if (part
.gnuHashTab
&& part
.gnuHashTab
->getParent())
1471 addInSec(DT_GNU_HASH
, *part
.gnuHashTab
);
1472 if (part
.hashTab
&& part
.hashTab
->getParent())
1473 addInSec(DT_HASH
, *part
.hashTab
);
1476 if (Out::preinitArray
) {
1477 addInt(DT_PREINIT_ARRAY
, Out::preinitArray
->addr
);
1478 addInt(DT_PREINIT_ARRAYSZ
, Out::preinitArray
->size
);
1480 if (Out::initArray
) {
1481 addInt(DT_INIT_ARRAY
, Out::initArray
->addr
);
1482 addInt(DT_INIT_ARRAYSZ
, Out::initArray
->size
);
1484 if (Out::finiArray
) {
1485 addInt(DT_FINI_ARRAY
, Out::finiArray
->addr
);
1486 addInt(DT_FINI_ARRAYSZ
, Out::finiArray
->size
);
1489 if (Symbol
*b
= symtab
.find(config
->init
))
1491 addInt(DT_INIT
, b
->getVA());
1492 if (Symbol
*b
= symtab
.find(config
->fini
))
1494 addInt(DT_FINI
, b
->getVA());
1497 if (part
.verSym
&& part
.verSym
->isNeeded())
1498 addInSec(DT_VERSYM
, *part
.verSym
);
1499 if (part
.verDef
&& part
.verDef
->isLive()) {
1500 addInSec(DT_VERDEF
, *part
.verDef
);
1501 addInt(DT_VERDEFNUM
, getVerDefNum());
1503 if (part
.verNeed
&& part
.verNeed
->isNeeded()) {
1504 addInSec(DT_VERNEED
, *part
.verNeed
);
1505 unsigned needNum
= 0;
1506 for (SharedFile
*f
: ctx
.sharedFiles
)
1507 if (!f
->vernauxs
.empty())
1509 addInt(DT_VERNEEDNUM
, needNum
);
1512 if (config
->emachine
== EM_MIPS
) {
1513 addInt(DT_MIPS_RLD_VERSION
, 1);
1514 addInt(DT_MIPS_FLAGS
, RHF_NOTPOT
);
1515 addInt(DT_MIPS_BASE_ADDRESS
, target
->getImageBase());
1516 addInt(DT_MIPS_SYMTABNO
, part
.dynSymTab
->getNumSymbols());
1517 addInt(DT_MIPS_LOCAL_GOTNO
, in
.mipsGot
->getLocalEntriesNum());
1519 if (const Symbol
*b
= in
.mipsGot
->getFirstGlobalEntry())
1520 addInt(DT_MIPS_GOTSYM
, b
->dynsymIndex
);
1522 addInt(DT_MIPS_GOTSYM
, part
.dynSymTab
->getNumSymbols());
1523 addInSec(DT_PLTGOT
, *in
.mipsGot
);
1524 if (in
.mipsRldMap
) {
1526 addInSec(DT_MIPS_RLD_MAP
, *in
.mipsRldMap
);
1527 // Store the offset to the .rld_map section
1528 // relative to the address of the tag.
1529 addInt(DT_MIPS_RLD_MAP_REL
,
1530 in
.mipsRldMap
->getVA() - (getVA() + entries
.size() * entsize
));
1534 // DT_PPC_GOT indicates to glibc Secure PLT is used. If DT_PPC_GOT is absent,
1535 // glibc assumes the old-style BSS PLT layout which we don't support.
1536 if (config
->emachine
== EM_PPC
)
1537 addInSec(DT_PPC_GOT
, *in
.got
);
1539 // Glink dynamic tag is required by the V2 abi if the plt section isn't empty.
1540 if (config
->emachine
== EM_PPC64
&& in
.plt
->isNeeded()) {
1541 // The Glink tag points to 32 bytes before the first lazy symbol resolution
1542 // stub, which starts directly after the header.
1543 addInt(DT_PPC64_GLINK
, in
.plt
->getVA() + target
->pltHeaderSize
- 32);
1546 if (config
->emachine
== EM_PPC64
)
1547 addInt(DT_PPC64_OPT
, getPPC64TargetInfo()->ppc64DynamicSectionOpt
);
1553 template <class ELFT
> void DynamicSection
<ELFT
>::finalizeContents() {
1554 if (OutputSection
*sec
= getPartition().dynStrTab
->getParent())
1555 getParent()->link
= sec
->sectionIndex
;
1556 this->size
= computeContents().size() * this->entsize
;
1559 template <class ELFT
> void DynamicSection
<ELFT
>::writeTo(uint8_t *buf
) {
1560 auto *p
= reinterpret_cast<Elf_Dyn
*>(buf
);
1562 for (std::pair
<int32_t, uint64_t> kv
: computeContents()) {
1563 p
->d_tag
= kv
.first
;
1564 p
->d_un
.d_val
= kv
.second
;
1569 uint64_t DynamicReloc::getOffset() const {
1570 return inputSec
->getVA(offsetInSec
);
1573 int64_t DynamicReloc::computeAddend() const {
1576 assert(sym
== nullptr);
1579 assert(sym
!= nullptr);
1581 case AddendOnlyWithTargetVA
:
1582 case AgainstSymbolWithTargetVA
: {
1583 uint64_t ca
= InputSection::getRelocTargetVA(inputSec
->file
, type
, addend
,
1584 getOffset(), *sym
, expr
);
1585 return config
->is64
? ca
: SignExtend64
<32>(ca
);
1587 case MipsMultiGotPage
:
1588 assert(sym
== nullptr);
1589 return getMipsPageAddr(outputSec
->addr
) + addend
;
1591 llvm_unreachable("Unknown DynamicReloc::Kind enum");
1594 uint32_t DynamicReloc::getSymIndex(SymbolTableBaseSection
*symTab
) const {
1595 if (!needsDynSymIndex())
1598 size_t index
= symTab
->getSymbolIndex(sym
);
1599 assert((index
!= 0 || (type
!= target
->gotRel
&& type
!= target
->pltRel
) ||
1600 !mainPart
->dynSymTab
->getParent()) &&
1601 "GOT or PLT relocation must refer to symbol in dynamic symbol table");
1605 RelocationBaseSection::RelocationBaseSection(StringRef name
, uint32_t type
,
1607 int32_t sizeDynamicTag
,
1609 unsigned concurrency
)
1610 : SyntheticSection(SHF_ALLOC
, type
, config
->wordsize
, name
),
1611 dynamicTag(dynamicTag
), sizeDynamicTag(sizeDynamicTag
),
1612 relocsVec(concurrency
), combreloc(combreloc
) {}
1614 void RelocationBaseSection::addSymbolReloc(
1615 RelType dynType
, InputSectionBase
&isec
, uint64_t offsetInSec
, Symbol
&sym
,
1616 int64_t addend
, std::optional
<RelType
> addendRelType
) {
1617 addReloc(DynamicReloc::AgainstSymbol
, dynType
, isec
, offsetInSec
, sym
, addend
,
1618 R_ADDEND
, addendRelType
? *addendRelType
: target
->noneRel
);
1621 void RelocationBaseSection::addAddendOnlyRelocIfNonPreemptible(
1622 RelType dynType
, GotSection
&sec
, uint64_t offsetInSec
, Symbol
&sym
,
1623 RelType addendRelType
) {
1624 // No need to write an addend to the section for preemptible symbols.
1625 if (sym
.isPreemptible
)
1626 addReloc({dynType
, &sec
, offsetInSec
, DynamicReloc::AgainstSymbol
, sym
, 0,
1629 addReloc(DynamicReloc::AddendOnlyWithTargetVA
, dynType
, sec
, offsetInSec
,
1630 sym
, 0, R_ABS
, addendRelType
);
1633 void RelocationBaseSection::mergeRels() {
1634 size_t newSize
= relocs
.size();
1635 for (const auto &v
: relocsVec
)
1636 newSize
+= v
.size();
1637 relocs
.reserve(newSize
);
1638 for (const auto &v
: relocsVec
)
1639 llvm::append_range(relocs
, v
);
1643 void RelocationBaseSection::partitionRels() {
1646 const RelType relativeRel
= target
->relativeRel
;
1648 llvm::partition(relocs
, [=](auto &r
) { return r
.type
== relativeRel
; }) -
1652 void RelocationBaseSection::finalizeContents() {
1653 SymbolTableBaseSection
*symTab
= getPartition().dynSymTab
.get();
1655 // When linking glibc statically, .rel{,a}.plt contains R_*_IRELATIVE
1656 // relocations due to IFUNC (e.g. strcpy). sh_link will be set to 0 in that
1658 if (symTab
&& symTab
->getParent())
1659 getParent()->link
= symTab
->getParent()->sectionIndex
;
1661 getParent()->link
= 0;
1663 if (in
.relaPlt
.get() == this && in
.gotPlt
->getParent()) {
1664 getParent()->flags
|= ELF::SHF_INFO_LINK
;
1665 getParent()->info
= in
.gotPlt
->getParent()->sectionIndex
;
1667 if (in
.relaIplt
.get() == this && in
.igotPlt
->getParent()) {
1668 getParent()->flags
|= ELF::SHF_INFO_LINK
;
1669 getParent()->info
= in
.igotPlt
->getParent()->sectionIndex
;
1673 void DynamicReloc::computeRaw(SymbolTableBaseSection
*symtab
) {
1674 r_offset
= getOffset();
1675 r_sym
= getSymIndex(symtab
);
1676 addend
= computeAddend();
1677 kind
= AddendOnly
; // Catch errors
1680 void RelocationBaseSection::computeRels() {
1681 SymbolTableBaseSection
*symTab
= getPartition().dynSymTab
.get();
1682 parallelForEach(relocs
,
1683 [symTab
](DynamicReloc
&rel
) { rel
.computeRaw(symTab
); });
1684 // Sort by (!IsRelative,SymIndex,r_offset). DT_REL[A]COUNT requires us to
1685 // place R_*_RELATIVE first. SymIndex is to improve locality, while r_offset
1686 // is to make results easier to read.
1688 auto nonRelative
= relocs
.begin() + numRelativeRelocs
;
1689 parallelSort(relocs
.begin(), nonRelative
,
1690 [&](auto &a
, auto &b
) { return a
.r_offset
< b
.r_offset
; });
1691 // Non-relative relocations are few, so don't bother with parallelSort.
1692 llvm::sort(nonRelative
, relocs
.end(), [&](auto &a
, auto &b
) {
1693 return std::tie(a
.r_sym
, a
.r_offset
) < std::tie(b
.r_sym
, b
.r_offset
);
1698 template <class ELFT
>
1699 RelocationSection
<ELFT
>::RelocationSection(StringRef name
, bool combreloc
,
1700 unsigned concurrency
)
1701 : RelocationBaseSection(name
, config
->isRela
? SHT_RELA
: SHT_REL
,
1702 config
->isRela
? DT_RELA
: DT_REL
,
1703 config
->isRela
? DT_RELASZ
: DT_RELSZ
, combreloc
,
1705 this->entsize
= config
->isRela
? sizeof(Elf_Rela
) : sizeof(Elf_Rel
);
1708 template <class ELFT
> void RelocationSection
<ELFT
>::writeTo(uint8_t *buf
) {
1710 for (const DynamicReloc
&rel
: relocs
) {
1711 auto *p
= reinterpret_cast<Elf_Rela
*>(buf
);
1712 p
->r_offset
= rel
.r_offset
;
1713 p
->setSymbolAndType(rel
.r_sym
, rel
.type
, config
->isMips64EL
);
1715 p
->r_addend
= rel
.addend
;
1716 buf
+= config
->isRela
? sizeof(Elf_Rela
) : sizeof(Elf_Rel
);
1720 RelrBaseSection::RelrBaseSection(unsigned concurrency
)
1721 : SyntheticSection(SHF_ALLOC
,
1722 config
->useAndroidRelrTags
? SHT_ANDROID_RELR
: SHT_RELR
,
1723 config
->wordsize
, ".relr.dyn"),
1724 relocsVec(concurrency
) {}
1726 void RelrBaseSection::mergeRels() {
1727 size_t newSize
= relocs
.size();
1728 for (const auto &v
: relocsVec
)
1729 newSize
+= v
.size();
1730 relocs
.reserve(newSize
);
1731 for (const auto &v
: relocsVec
)
1732 llvm::append_range(relocs
, v
);
1736 template <class ELFT
>
1737 AndroidPackedRelocationSection
<ELFT
>::AndroidPackedRelocationSection(
1738 StringRef name
, unsigned concurrency
)
1739 : RelocationBaseSection(
1740 name
, config
->isRela
? SHT_ANDROID_RELA
: SHT_ANDROID_REL
,
1741 config
->isRela
? DT_ANDROID_RELA
: DT_ANDROID_REL
,
1742 config
->isRela
? DT_ANDROID_RELASZ
: DT_ANDROID_RELSZ
,
1743 /*combreloc=*/false, concurrency
) {
1747 template <class ELFT
>
1748 bool AndroidPackedRelocationSection
<ELFT
>::updateAllocSize() {
1749 // This function computes the contents of an Android-format packed relocation
1752 // This format compresses relocations by using relocation groups to factor out
1753 // fields that are common between relocations and storing deltas from previous
1754 // relocations in SLEB128 format (which has a short representation for small
1755 // numbers). A good example of a relocation type with common fields is
1756 // R_*_RELATIVE, which is normally used to represent function pointers in
1757 // vtables. In the REL format, each relative relocation has the same r_info
1758 // field, and is only different from other relative relocations in terms of
1759 // the r_offset field. By sorting relocations by offset, grouping them by
1760 // r_info and representing each relocation with only the delta from the
1761 // previous offset, each 8-byte relocation can be compressed to as little as 1
1762 // byte (or less with run-length encoding). This relocation packer was able to
1763 // reduce the size of the relocation section in an Android Chromium DSO from
1764 // 2,911,184 bytes to 174,693 bytes, or 6% of the original size.
1766 // A relocation section consists of a header containing the literal bytes
1767 // 'APS2' followed by a sequence of SLEB128-encoded integers. The first two
1768 // elements are the total number of relocations in the section and an initial
1769 // r_offset value. The remaining elements define a sequence of relocation
1770 // groups. Each relocation group starts with a header consisting of the
1771 // following elements:
1773 // - the number of relocations in the relocation group
1774 // - flags for the relocation group
1775 // - (if RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG is set) the r_offset delta
1776 // for each relocation in the group.
1777 // - (if RELOCATION_GROUPED_BY_INFO_FLAG is set) the value of the r_info
1778 // field for each relocation in the group.
1779 // - (if RELOCATION_GROUP_HAS_ADDEND_FLAG and
1780 // RELOCATION_GROUPED_BY_ADDEND_FLAG are set) the r_addend delta for
1781 // each relocation in the group.
1783 // Following the relocation group header are descriptions of each of the
1784 // relocations in the group. They consist of the following elements:
1786 // - (if RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG is not set) the r_offset
1787 // delta for this relocation.
1788 // - (if RELOCATION_GROUPED_BY_INFO_FLAG is not set) the value of the r_info
1789 // field for this relocation.
1790 // - (if RELOCATION_GROUP_HAS_ADDEND_FLAG is set and
1791 // RELOCATION_GROUPED_BY_ADDEND_FLAG is not set) the r_addend delta for
1794 size_t oldSize
= relocData
.size();
1796 relocData
= {'A', 'P', 'S', '2'};
1797 raw_svector_ostream
os(relocData
);
1798 auto add
= [&](int64_t v
) { encodeSLEB128(v
, os
); };
1800 // The format header includes the number of relocations and the initial
1801 // offset (we set this to zero because the first relocation group will
1802 // perform the initial adjustment).
1806 std::vector
<Elf_Rela
> relatives
, nonRelatives
;
1808 for (const DynamicReloc
&rel
: relocs
) {
1810 r
.r_offset
= rel
.getOffset();
1811 r
.setSymbolAndType(rel
.getSymIndex(getPartition().dynSymTab
.get()),
1813 r
.r_addend
= config
->isRela
? rel
.computeAddend() : 0;
1815 if (r
.getType(config
->isMips64EL
) == target
->relativeRel
)
1816 relatives
.push_back(r
);
1818 nonRelatives
.push_back(r
);
1821 llvm::sort(relatives
, [](const Elf_Rel
&a
, const Elf_Rel
&b
) {
1822 return a
.r_offset
< b
.r_offset
;
1825 // Try to find groups of relative relocations which are spaced one word
1826 // apart from one another. These generally correspond to vtable entries. The
1827 // format allows these groups to be encoded using a sort of run-length
1828 // encoding, but each group will cost 7 bytes in addition to the offset from
1829 // the previous group, so it is only profitable to do this for groups of
1830 // size 8 or larger.
1831 std::vector
<Elf_Rela
> ungroupedRelatives
;
1832 std::vector
<std::vector
<Elf_Rela
>> relativeGroups
;
1833 for (auto i
= relatives
.begin(), e
= relatives
.end(); i
!= e
;) {
1834 std::vector
<Elf_Rela
> group
;
1836 group
.push_back(*i
++);
1837 } while (i
!= e
&& (i
- 1)->r_offset
+ config
->wordsize
== i
->r_offset
);
1839 if (group
.size() < 8)
1840 ungroupedRelatives
.insert(ungroupedRelatives
.end(), group
.begin(),
1843 relativeGroups
.emplace_back(std::move(group
));
1846 // For non-relative relocations, we would like to:
1847 // 1. Have relocations with the same symbol offset to be consecutive, so
1848 // that the runtime linker can speed-up symbol lookup by implementing an
1850 // 2. Group relocations by r_info to reduce the size of the relocation
1852 // Since the symbol offset is the high bits in r_info, sorting by r_info
1853 // allows us to do both.
1855 // For Rela, we also want to sort by r_addend when r_info is the same. This
1856 // enables us to group by r_addend as well.
1857 llvm::sort(nonRelatives
, [](const Elf_Rela
&a
, const Elf_Rela
&b
) {
1858 if (a
.r_info
!= b
.r_info
)
1859 return a
.r_info
< b
.r_info
;
1860 if (a
.r_addend
!= b
.r_addend
)
1861 return a
.r_addend
< b
.r_addend
;
1862 return a
.r_offset
< b
.r_offset
;
1865 // Group relocations with the same r_info. Note that each group emits a group
1866 // header and that may make the relocation section larger. It is hard to
1867 // estimate the size of a group header as the encoded size of that varies
1868 // based on r_info. However, we can approximate this trade-off by the number
1869 // of values encoded. Each group header contains 3 values, and each relocation
1870 // in a group encodes one less value, as compared to when it is not grouped.
1871 // Therefore, we only group relocations if there are 3 or more of them with
1874 // For Rela, the addend for most non-relative relocations is zero, and thus we
1875 // can usually get a smaller relocation section if we group relocations with 0
1877 std::vector
<Elf_Rela
> ungroupedNonRelatives
;
1878 std::vector
<std::vector
<Elf_Rela
>> nonRelativeGroups
;
1879 for (auto i
= nonRelatives
.begin(), e
= nonRelatives
.end(); i
!= e
;) {
1881 while (j
!= e
&& i
->r_info
== j
->r_info
&&
1882 (!config
->isRela
|| i
->r_addend
== j
->r_addend
))
1884 if (j
- i
< 3 || (config
->isRela
&& i
->r_addend
!= 0))
1885 ungroupedNonRelatives
.insert(ungroupedNonRelatives
.end(), i
, j
);
1887 nonRelativeGroups
.emplace_back(i
, j
);
1891 // Sort ungrouped relocations by offset to minimize the encoded length.
1892 llvm::sort(ungroupedNonRelatives
, [](const Elf_Rela
&a
, const Elf_Rela
&b
) {
1893 return a
.r_offset
< b
.r_offset
;
1896 unsigned hasAddendIfRela
=
1897 config
->isRela
? RELOCATION_GROUP_HAS_ADDEND_FLAG
: 0;
1899 uint64_t offset
= 0;
1900 uint64_t addend
= 0;
1902 // Emit the run-length encoding for the groups of adjacent relative
1903 // relocations. Each group is represented using two groups in the packed
1904 // format. The first is used to set the current offset to the start of the
1905 // group (and also encodes the first relocation), and the second encodes the
1906 // remaining relocations.
1907 for (std::vector
<Elf_Rela
> &g
: relativeGroups
) {
1908 // The first relocation in the group.
1910 add(RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG
|
1911 RELOCATION_GROUPED_BY_INFO_FLAG
| hasAddendIfRela
);
1912 add(g
[0].r_offset
- offset
);
1913 add(target
->relativeRel
);
1914 if (config
->isRela
) {
1915 add(g
[0].r_addend
- addend
);
1916 addend
= g
[0].r_addend
;
1919 // The remaining relocations.
1921 add(RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG
|
1922 RELOCATION_GROUPED_BY_INFO_FLAG
| hasAddendIfRela
);
1923 add(config
->wordsize
);
1924 add(target
->relativeRel
);
1925 if (config
->isRela
) {
1926 for (const auto &i
: llvm::drop_begin(g
)) {
1927 add(i
.r_addend
- addend
);
1928 addend
= i
.r_addend
;
1932 offset
= g
.back().r_offset
;
1935 // Now the ungrouped relatives.
1936 if (!ungroupedRelatives
.empty()) {
1937 add(ungroupedRelatives
.size());
1938 add(RELOCATION_GROUPED_BY_INFO_FLAG
| hasAddendIfRela
);
1939 add(target
->relativeRel
);
1940 for (Elf_Rela
&r
: ungroupedRelatives
) {
1941 add(r
.r_offset
- offset
);
1942 offset
= r
.r_offset
;
1943 if (config
->isRela
) {
1944 add(r
.r_addend
- addend
);
1945 addend
= r
.r_addend
;
1950 // Grouped non-relatives.
1951 for (ArrayRef
<Elf_Rela
> g
: nonRelativeGroups
) {
1953 add(RELOCATION_GROUPED_BY_INFO_FLAG
);
1955 for (const Elf_Rela
&r
: g
) {
1956 add(r
.r_offset
- offset
);
1957 offset
= r
.r_offset
;
1962 // Finally the ungrouped non-relative relocations.
1963 if (!ungroupedNonRelatives
.empty()) {
1964 add(ungroupedNonRelatives
.size());
1965 add(hasAddendIfRela
);
1966 for (Elf_Rela
&r
: ungroupedNonRelatives
) {
1967 add(r
.r_offset
- offset
);
1968 offset
= r
.r_offset
;
1970 if (config
->isRela
) {
1971 add(r
.r_addend
- addend
);
1972 addend
= r
.r_addend
;
1977 // Don't allow the section to shrink; otherwise the size of the section can
1978 // oscillate infinitely.
1979 if (relocData
.size() < oldSize
)
1980 relocData
.append(oldSize
- relocData
.size(), 0);
1982 // Returns whether the section size changed. We need to keep recomputing both
1983 // section layout and the contents of this section until the size converges
1984 // because changing this section's size can affect section layout, which in
1985 // turn can affect the sizes of the LEB-encoded integers stored in this
1987 return relocData
.size() != oldSize
;
1990 template <class ELFT
>
1991 RelrSection
<ELFT
>::RelrSection(unsigned concurrency
)
1992 : RelrBaseSection(concurrency
) {
1993 this->entsize
= config
->wordsize
;
1996 template <class ELFT
> bool RelrSection
<ELFT
>::updateAllocSize() {
1997 // This function computes the contents of an SHT_RELR packed relocation
2000 // Proposal for adding SHT_RELR sections to generic-abi is here:
2001 // https://groups.google.com/forum/#!topic/generic-abi/bX460iggiKg
2003 // The encoded sequence of Elf64_Relr entries in a SHT_RELR section looks
2004 // like [ AAAAAAAA BBBBBBB1 BBBBBBB1 ... AAAAAAAA BBBBBB1 ... ]
2006 // i.e. start with an address, followed by any number of bitmaps. The address
2007 // entry encodes 1 relocation. The subsequent bitmap entries encode up to 63
2008 // relocations each, at subsequent offsets following the last address entry.
2010 // The bitmap entries must have 1 in the least significant bit. The assumption
2011 // here is that an address cannot have 1 in lsb. Odd addresses are not
2014 // Excluding the least significant bit in the bitmap, each non-zero bit in
2015 // the bitmap represents a relocation to be applied to a corresponding machine
2016 // word that follows the base address word. The second least significant bit
2017 // represents the machine word immediately following the initial address, and
2018 // each bit that follows represents the next word, in linear order. As such,
2019 // a single bitmap can encode up to 31 relocations in a 32-bit object, and
2020 // 63 relocations in a 64-bit object.
2022 // This encoding has a couple of interesting properties:
2023 // 1. Looking at any entry, it is clear whether it's an address or a bitmap:
2024 // even means address, odd means bitmap.
2025 // 2. Just a simple list of addresses is a valid encoding.
2027 size_t oldSize
= relrRelocs
.size();
2030 // Same as Config->Wordsize but faster because this is a compile-time
2032 const size_t wordsize
= sizeof(typename
ELFT::uint
);
2034 // Number of bits to use for the relocation offsets bitmap.
2035 // Must be either 63 or 31.
2036 const size_t nBits
= wordsize
* 8 - 1;
2038 // Get offsets for all relative relocations and sort them.
2039 std::unique_ptr
<uint64_t[]> offsets(new uint64_t[relocs
.size()]);
2040 for (auto [i
, r
] : llvm::enumerate(relocs
))
2041 offsets
[i
] = r
.getOffset();
2042 llvm::sort(offsets
.get(), offsets
.get() + relocs
.size());
2044 // For each leading relocation, find following ones that can be folded
2045 // as a bitmap and fold them.
2046 for (size_t i
= 0, e
= relocs
.size(); i
!= e
;) {
2047 // Add a leading relocation.
2048 relrRelocs
.push_back(Elf_Relr(offsets
[i
]));
2049 uint64_t base
= offsets
[i
] + wordsize
;
2052 // Find foldable relocations to construct bitmaps.
2054 uint64_t bitmap
= 0;
2055 for (; i
!= e
; ++i
) {
2056 uint64_t d
= offsets
[i
] - base
;
2057 if (d
>= nBits
* wordsize
|| d
% wordsize
)
2059 bitmap
|= uint64_t(1) << (d
/ wordsize
);
2063 relrRelocs
.push_back(Elf_Relr((bitmap
<< 1) | 1));
2064 base
+= nBits
* wordsize
;
2068 // Don't allow the section to shrink; otherwise the size of the section can
2069 // oscillate infinitely. Trailing 1s do not decode to more relocations.
2070 if (relrRelocs
.size() < oldSize
) {
2071 log(".relr.dyn needs " + Twine(oldSize
- relrRelocs
.size()) +
2072 " padding word(s)");
2073 relrRelocs
.resize(oldSize
, Elf_Relr(1));
2076 return relrRelocs
.size() != oldSize
;
2079 SymbolTableBaseSection::SymbolTableBaseSection(StringTableSection
&strTabSec
)
2080 : SyntheticSection(strTabSec
.isDynamic() ? (uint64_t)SHF_ALLOC
: 0,
2081 strTabSec
.isDynamic() ? SHT_DYNSYM
: SHT_SYMTAB
,
2083 strTabSec
.isDynamic() ? ".dynsym" : ".symtab"),
2084 strTabSec(strTabSec
) {}
2086 // Orders symbols according to their positions in the GOT,
2087 // in compliance with MIPS ABI rules.
2088 // See "Global Offset Table" in Chapter 5 in the following document
2089 // for detailed description:
2090 // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
2091 static bool sortMipsSymbols(const SymbolTableEntry
&l
,
2092 const SymbolTableEntry
&r
) {
2093 // Sort entries related to non-local preemptible symbols by GOT indexes.
2094 // All other entries go to the beginning of a dynsym in arbitrary order.
2095 if (l
.sym
->isInGot() && r
.sym
->isInGot())
2096 return l
.sym
->getGotIdx() < r
.sym
->getGotIdx();
2097 if (!l
.sym
->isInGot() && !r
.sym
->isInGot())
2099 return !l
.sym
->isInGot();
2102 void SymbolTableBaseSection::finalizeContents() {
2103 if (OutputSection
*sec
= strTabSec
.getParent())
2104 getParent()->link
= sec
->sectionIndex
;
2106 if (this->type
!= SHT_DYNSYM
) {
2107 sortSymTabSymbols();
2111 // If it is a .dynsym, there should be no local symbols, but we need
2112 // to do a few things for the dynamic linker.
2114 // Section's Info field has the index of the first non-local symbol.
2115 // Because the first symbol entry is a null entry, 1 is the first.
2116 getParent()->info
= 1;
2118 if (getPartition().gnuHashTab
) {
2119 // NB: It also sorts Symbols to meet the GNU hash table requirements.
2120 getPartition().gnuHashTab
->addSymbols(symbols
);
2121 } else if (config
->emachine
== EM_MIPS
) {
2122 llvm::stable_sort(symbols
, sortMipsSymbols
);
2125 // Only the main partition's dynsym indexes are stored in the symbols
2126 // themselves. All other partitions use a lookup table.
2127 if (this == mainPart
->dynSymTab
.get()) {
2129 for (const SymbolTableEntry
&s
: symbols
)
2130 s
.sym
->dynsymIndex
= ++i
;
2134 // The ELF spec requires that all local symbols precede global symbols, so we
2135 // sort symbol entries in this function. (For .dynsym, we don't do that because
2136 // symbols for dynamic linking are inherently all globals.)
2138 // Aside from above, we put local symbols in groups starting with the STT_FILE
2139 // symbol. That is convenient for purpose of identifying where are local symbols
2141 void SymbolTableBaseSection::sortSymTabSymbols() {
2142 // Move all local symbols before global symbols.
2143 auto e
= std::stable_partition(
2144 symbols
.begin(), symbols
.end(),
2145 [](const SymbolTableEntry
&s
) { return s
.sym
->isLocal(); });
2146 size_t numLocals
= e
- symbols
.begin();
2147 getParent()->info
= numLocals
+ 1;
2149 // We want to group the local symbols by file. For that we rebuild the local
2150 // part of the symbols vector. We do not need to care about the STT_FILE
2151 // symbols, they are already naturally placed first in each group. That
2152 // happens because STT_FILE is always the first symbol in the object and hence
2153 // precede all other local symbols we add for a file.
2154 MapVector
<InputFile
*, SmallVector
<SymbolTableEntry
, 0>> arr
;
2155 for (const SymbolTableEntry
&s
: llvm::make_range(symbols
.begin(), e
))
2156 arr
[s
.sym
->file
].push_back(s
);
2158 auto i
= symbols
.begin();
2160 for (SymbolTableEntry
&entry
: p
.second
)
2164 void SymbolTableBaseSection::addSymbol(Symbol
*b
) {
2165 // Adding a local symbol to a .dynsym is a bug.
2166 assert(this->type
!= SHT_DYNSYM
|| !b
->isLocal());
2167 symbols
.push_back({b
, strTabSec
.addString(b
->getName(), false)});
2170 size_t SymbolTableBaseSection::getSymbolIndex(Symbol
*sym
) {
2171 if (this == mainPart
->dynSymTab
.get())
2172 return sym
->dynsymIndex
;
2174 // Initializes symbol lookup tables lazily. This is used only for -r,
2175 // --emit-relocs and dynsyms in partitions other than the main one.
2176 llvm::call_once(onceFlag
, [&] {
2177 symbolIndexMap
.reserve(symbols
.size());
2179 for (const SymbolTableEntry
&e
: symbols
) {
2180 if (e
.sym
->type
== STT_SECTION
)
2181 sectionIndexMap
[e
.sym
->getOutputSection()] = ++i
;
2183 symbolIndexMap
[e
.sym
] = ++i
;
2187 // Section symbols are mapped based on their output sections
2188 // to maintain their semantics.
2189 if (sym
->type
== STT_SECTION
)
2190 return sectionIndexMap
.lookup(sym
->getOutputSection());
2191 return symbolIndexMap
.lookup(sym
);
2194 template <class ELFT
>
2195 SymbolTableSection
<ELFT
>::SymbolTableSection(StringTableSection
&strTabSec
)
2196 : SymbolTableBaseSection(strTabSec
) {
2197 this->entsize
= sizeof(Elf_Sym
);
2200 static BssSection
*getCommonSec(Symbol
*sym
) {
2201 if (config
->relocatable
)
2202 if (auto *d
= dyn_cast
<Defined
>(sym
))
2203 return dyn_cast_or_null
<BssSection
>(d
->section
);
2207 static uint32_t getSymSectionIndex(Symbol
*sym
) {
2208 assert(!(sym
->hasFlag(NEEDS_COPY
) && sym
->isObject()));
2209 if (!isa
<Defined
>(sym
) || sym
->hasFlag(NEEDS_COPY
))
2211 if (const OutputSection
*os
= sym
->getOutputSection())
2212 return os
->sectionIndex
>= SHN_LORESERVE
? (uint32_t)SHN_XINDEX
2217 // Write the internal symbol table contents to the output symbol table.
2218 template <class ELFT
> void SymbolTableSection
<ELFT
>::writeTo(uint8_t *buf
) {
2219 // The first entry is a null entry as per the ELF spec.
2220 buf
+= sizeof(Elf_Sym
);
2222 auto *eSym
= reinterpret_cast<Elf_Sym
*>(buf
);
2224 for (SymbolTableEntry
&ent
: symbols
) {
2225 Symbol
*sym
= ent
.sym
;
2226 bool isDefinedHere
= type
== SHT_SYMTAB
|| sym
->partition
== partition
;
2228 // Set st_name, st_info and st_other.
2229 eSym
->st_name
= ent
.strTabOffset
;
2230 eSym
->setBindingAndType(sym
->binding
, sym
->type
);
2231 eSym
->st_other
= sym
->stOther
;
2233 if (BssSection
*commonSec
= getCommonSec(sym
)) {
2234 // When -r is specified, a COMMON symbol is not allocated. Its st_shndx
2235 // holds SHN_COMMON and st_value holds the alignment.
2236 eSym
->st_shndx
= SHN_COMMON
;
2237 eSym
->st_value
= commonSec
->addralign
;
2238 eSym
->st_size
= cast
<Defined
>(sym
)->size
;
2240 const uint32_t shndx
= getSymSectionIndex(sym
);
2241 if (isDefinedHere
) {
2242 eSym
->st_shndx
= shndx
;
2243 eSym
->st_value
= sym
->getVA();
2244 // Copy symbol size if it is a defined symbol. st_size is not
2245 // significant for undefined symbols, so whether copying it or not is up
2246 // to us if that's the case. We'll leave it as zero because by not
2247 // setting a value, we can get the exact same outputs for two sets of
2248 // input files that differ only in undefined symbol size in DSOs.
2249 eSym
->st_size
= shndx
!= SHN_UNDEF
? cast
<Defined
>(sym
)->size
: 0;
2260 // On MIPS we need to mark symbol which has a PLT entry and requires
2261 // pointer equality by STO_MIPS_PLT flag. That is necessary to help
2262 // dynamic linker distinguish such symbols and MIPS lazy-binding stubs.
2263 // https://sourceware.org/ml/binutils/2008-07/txt00000.txt
2264 if (config
->emachine
== EM_MIPS
) {
2265 auto *eSym
= reinterpret_cast<Elf_Sym
*>(buf
);
2267 for (SymbolTableEntry
&ent
: symbols
) {
2268 Symbol
*sym
= ent
.sym
;
2269 if (sym
->isInPlt() && sym
->hasFlag(NEEDS_COPY
))
2270 eSym
->st_other
|= STO_MIPS_PLT
;
2271 if (isMicroMips()) {
2272 // We already set the less-significant bit for symbols
2273 // marked by the `STO_MIPS_MICROMIPS` flag and for microMIPS PLT
2274 // records. That allows us to distinguish such symbols in
2275 // the `MIPS<ELFT>::relocate()` routine. Now we should
2276 // clear that bit for non-dynamic symbol table, so tools
2277 // like `objdump` will be able to deal with a correct
2279 if (sym
->isDefined() &&
2280 ((sym
->stOther
& STO_MIPS_MICROMIPS
) || sym
->hasFlag(NEEDS_COPY
))) {
2281 if (!strTabSec
.isDynamic())
2282 eSym
->st_value
&= ~1;
2283 eSym
->st_other
|= STO_MIPS_MICROMIPS
;
2286 if (config
->relocatable
)
2287 if (auto *d
= dyn_cast
<Defined
>(sym
))
2288 if (isMipsPIC
<ELFT
>(d
))
2289 eSym
->st_other
|= STO_MIPS_PIC
;
2295 SymtabShndxSection::SymtabShndxSection()
2296 : SyntheticSection(0, SHT_SYMTAB_SHNDX
, 4, ".symtab_shndx") {
2300 void SymtabShndxSection::writeTo(uint8_t *buf
) {
2301 // We write an array of 32 bit values, where each value has 1:1 association
2302 // with an entry in .symtab. If the corresponding entry contains SHN_XINDEX,
2303 // we need to write actual index, otherwise, we must write SHN_UNDEF(0).
2304 buf
+= 4; // Ignore .symtab[0] entry.
2305 for (const SymbolTableEntry
&entry
: in
.symTab
->getSymbols()) {
2306 if (!getCommonSec(entry
.sym
) && getSymSectionIndex(entry
.sym
) == SHN_XINDEX
)
2307 write32(buf
, entry
.sym
->getOutputSection()->sectionIndex
);
2312 bool SymtabShndxSection::isNeeded() const {
2313 // SHT_SYMTAB can hold symbols with section indices values up to
2314 // SHN_LORESERVE. If we need more, we want to use extension SHT_SYMTAB_SHNDX
2315 // section. Problem is that we reveal the final section indices a bit too
2316 // late, and we do not know them here. For simplicity, we just always create
2317 // a .symtab_shndx section when the amount of output sections is huge.
2319 for (SectionCommand
*cmd
: script
->sectionCommands
)
2320 if (isa
<OutputDesc
>(cmd
))
2322 return size
>= SHN_LORESERVE
;
2325 void SymtabShndxSection::finalizeContents() {
2326 getParent()->link
= in
.symTab
->getParent()->sectionIndex
;
2329 size_t SymtabShndxSection::getSize() const {
2330 return in
.symTab
->getNumSymbols() * 4;
2333 // .hash and .gnu.hash sections contain on-disk hash tables that map
2334 // symbol names to their dynamic symbol table indices. Their purpose
2335 // is to help the dynamic linker resolve symbols quickly. If ELF files
2336 // don't have them, the dynamic linker has to do linear search on all
2337 // dynamic symbols, which makes programs slower. Therefore, a .hash
2338 // section is added to a DSO by default.
2340 // The Unix semantics of resolving dynamic symbols is somewhat expensive.
2341 // Each ELF file has a list of DSOs that the ELF file depends on and a
2342 // list of dynamic symbols that need to be resolved from any of the
2343 // DSOs. That means resolving all dynamic symbols takes O(m)*O(n)
2344 // where m is the number of DSOs and n is the number of dynamic
2345 // symbols. For modern large programs, both m and n are large. So
2346 // making each step faster by using hash tables substantially
2347 // improves time to load programs.
2349 // (Note that this is not the only way to design the shared library.
2350 // For instance, the Windows DLL takes a different approach. On
2351 // Windows, each dynamic symbol has a name of DLL from which the symbol
2352 // has to be resolved. That makes the cost of symbol resolution O(n).
2353 // This disables some hacky techniques you can use on Unix such as
2354 // LD_PRELOAD, but this is arguably better semantics than the Unix ones.)
2356 // Due to historical reasons, we have two different hash tables, .hash
2357 // and .gnu.hash. They are for the same purpose, and .gnu.hash is a new
2358 // and better version of .hash. .hash is just an on-disk hash table, but
2359 // .gnu.hash has a bloom filter in addition to a hash table to skip
2360 // DSOs very quickly. If you are sure that your dynamic linker knows
2361 // about .gnu.hash, you want to specify --hash-style=gnu. Otherwise, a
2362 // safe bet is to specify --hash-style=both for backward compatibility.
2363 GnuHashTableSection::GnuHashTableSection()
2364 : SyntheticSection(SHF_ALLOC
, SHT_GNU_HASH
, config
->wordsize
, ".gnu.hash") {
2367 void GnuHashTableSection::finalizeContents() {
2368 if (OutputSection
*sec
= getPartition().dynSymTab
->getParent())
2369 getParent()->link
= sec
->sectionIndex
;
2371 // Computes bloom filter size in word size. We want to allocate 12
2372 // bits for each symbol. It must be a power of two.
2373 if (symbols
.empty()) {
2376 uint64_t numBits
= symbols
.size() * 12;
2377 maskWords
= NextPowerOf2(numBits
/ (config
->wordsize
* 8));
2380 size
= 16; // Header
2381 size
+= config
->wordsize
* maskWords
; // Bloom filter
2382 size
+= nBuckets
* 4; // Hash buckets
2383 size
+= symbols
.size() * 4; // Hash values
2386 void GnuHashTableSection::writeTo(uint8_t *buf
) {
2388 write32(buf
, nBuckets
);
2389 write32(buf
+ 4, getPartition().dynSymTab
->getNumSymbols() - symbols
.size());
2390 write32(buf
+ 8, maskWords
);
2391 write32(buf
+ 12, Shift2
);
2394 // Write the 2-bit bloom filter.
2395 const unsigned c
= config
->is64
? 64 : 32;
2396 for (const Entry
&sym
: symbols
) {
2397 // When C = 64, we choose a word with bits [6:...] and set 1 to two bits in
2398 // the word using bits [0:5] and [26:31].
2399 size_t i
= (sym
.hash
/ c
) & (maskWords
- 1);
2400 uint64_t val
= readUint(buf
+ i
* config
->wordsize
);
2401 val
|= uint64_t(1) << (sym
.hash
% c
);
2402 val
|= uint64_t(1) << ((sym
.hash
>> Shift2
) % c
);
2403 writeUint(buf
+ i
* config
->wordsize
, val
);
2405 buf
+= config
->wordsize
* maskWords
;
2407 // Write the hash table.
2408 uint32_t *buckets
= reinterpret_cast<uint32_t *>(buf
);
2409 uint32_t oldBucket
= -1;
2410 uint32_t *values
= buckets
+ nBuckets
;
2411 for (auto i
= symbols
.begin(), e
= symbols
.end(); i
!= e
; ++i
) {
2412 // Write a hash value. It represents a sequence of chains that share the
2413 // same hash modulo value. The last element of each chain is terminated by
2415 uint32_t hash
= i
->hash
;
2416 bool isLastInChain
= (i
+ 1) == e
|| i
->bucketIdx
!= (i
+ 1)->bucketIdx
;
2417 hash
= isLastInChain
? hash
| 1 : hash
& ~1;
2418 write32(values
++, hash
);
2420 if (i
->bucketIdx
== oldBucket
)
2422 // Write a hash bucket. Hash buckets contain indices in the following hash
2424 write32(buckets
+ i
->bucketIdx
,
2425 getPartition().dynSymTab
->getSymbolIndex(i
->sym
));
2426 oldBucket
= i
->bucketIdx
;
2430 // Add symbols to this symbol hash table. Note that this function
2431 // destructively sort a given vector -- which is needed because
2432 // GNU-style hash table places some sorting requirements.
2433 void GnuHashTableSection::addSymbols(SmallVectorImpl
<SymbolTableEntry
> &v
) {
2434 // We cannot use 'auto' for Mid because GCC 6.1 cannot deduce
2435 // its type correctly.
2437 std::stable_partition(v
.begin(), v
.end(), [&](const SymbolTableEntry
&s
) {
2438 return !s
.sym
->isDefined() || s
.sym
->partition
!= partition
;
2441 // We chose load factor 4 for the on-disk hash table. For each hash
2442 // collision, the dynamic linker will compare a uint32_t hash value.
2443 // Since the integer comparison is quite fast, we believe we can
2444 // make the load factor even larger. 4 is just a conservative choice.
2446 // Note that we don't want to create a zero-sized hash table because
2447 // Android loader as of 2018 doesn't like a .gnu.hash containing such
2448 // table. If that's the case, we create a hash table with one unused
2450 nBuckets
= std::max
<size_t>((v
.end() - mid
) / 4, 1);
2455 for (SymbolTableEntry
&ent
: llvm::make_range(mid
, v
.end())) {
2456 Symbol
*b
= ent
.sym
;
2457 uint32_t hash
= hashGnu(b
->getName());
2458 uint32_t bucketIdx
= hash
% nBuckets
;
2459 symbols
.push_back({b
, ent
.strTabOffset
, hash
, bucketIdx
});
2462 llvm::sort(symbols
, [](const Entry
&l
, const Entry
&r
) {
2463 return std::tie(l
.bucketIdx
, l
.strTabOffset
) <
2464 std::tie(r
.bucketIdx
, r
.strTabOffset
);
2467 v
.erase(mid
, v
.end());
2468 for (const Entry
&ent
: symbols
)
2469 v
.push_back({ent
.sym
, ent
.strTabOffset
});
2472 HashTableSection::HashTableSection()
2473 : SyntheticSection(SHF_ALLOC
, SHT_HASH
, 4, ".hash") {
2477 void HashTableSection::finalizeContents() {
2478 SymbolTableBaseSection
*symTab
= getPartition().dynSymTab
.get();
2480 if (OutputSection
*sec
= symTab
->getParent())
2481 getParent()->link
= sec
->sectionIndex
;
2483 unsigned numEntries
= 2; // nbucket and nchain.
2484 numEntries
+= symTab
->getNumSymbols(); // The chain entries.
2486 // Create as many buckets as there are symbols.
2487 numEntries
+= symTab
->getNumSymbols();
2488 this->size
= numEntries
* 4;
2491 void HashTableSection::writeTo(uint8_t *buf
) {
2492 SymbolTableBaseSection
*symTab
= getPartition().dynSymTab
.get();
2493 unsigned numSymbols
= symTab
->getNumSymbols();
2495 uint32_t *p
= reinterpret_cast<uint32_t *>(buf
);
2496 write32(p
++, numSymbols
); // nbucket
2497 write32(p
++, numSymbols
); // nchain
2499 uint32_t *buckets
= p
;
2500 uint32_t *chains
= p
+ numSymbols
;
2502 for (const SymbolTableEntry
&s
: symTab
->getSymbols()) {
2503 Symbol
*sym
= s
.sym
;
2504 StringRef name
= sym
->getName();
2505 unsigned i
= sym
->dynsymIndex
;
2506 uint32_t hash
= hashSysV(name
) % numSymbols
;
2507 chains
[i
] = buckets
[hash
];
2508 write32(buckets
+ hash
, i
);
2512 PltSection::PltSection()
2513 : SyntheticSection(SHF_ALLOC
| SHF_EXECINSTR
, SHT_PROGBITS
, 16, ".plt"),
2514 headerSize(target
->pltHeaderSize
) {
2515 // On PowerPC, this section contains lazy symbol resolvers.
2516 if (config
->emachine
== EM_PPC64
) {
2521 // On x86 when IBT is enabled, this section contains the second PLT (lazy
2522 // symbol resolvers).
2523 if ((config
->emachine
== EM_386
|| config
->emachine
== EM_X86_64
) &&
2524 (config
->andFeatures
& GNU_PROPERTY_X86_FEATURE_1_IBT
))
2527 // The PLT needs to be writable on SPARC as the dynamic linker will
2528 // modify the instructions in the PLT entries.
2529 if (config
->emachine
== EM_SPARCV9
)
2530 this->flags
|= SHF_WRITE
;
2533 void PltSection::writeTo(uint8_t *buf
) {
2534 // At beginning of PLT, we have code to call the dynamic
2535 // linker to resolve dynsyms at runtime. Write such code.
2536 target
->writePltHeader(buf
);
2537 size_t off
= headerSize
;
2539 for (const Symbol
*sym
: entries
) {
2540 target
->writePlt(buf
+ off
, *sym
, getVA() + off
);
2541 off
+= target
->pltEntrySize
;
2545 void PltSection::addEntry(Symbol
&sym
) {
2546 assert(sym
.auxIdx
== symAux
.size() - 1);
2547 symAux
.back().pltIdx
= entries
.size();
2548 entries
.push_back(&sym
);
2551 size_t PltSection::getSize() const {
2552 return headerSize
+ entries
.size() * target
->pltEntrySize
;
2555 bool PltSection::isNeeded() const {
2556 // For -z retpolineplt, .iplt needs the .plt header.
2557 return !entries
.empty() || (config
->zRetpolineplt
&& in
.iplt
->isNeeded());
2560 // Used by ARM to add mapping symbols in the PLT section, which aid
2562 void PltSection::addSymbols() {
2563 target
->addPltHeaderSymbols(*this);
2565 size_t off
= headerSize
;
2566 for (size_t i
= 0; i
< entries
.size(); ++i
) {
2567 target
->addPltSymbols(*this, off
);
2568 off
+= target
->pltEntrySize
;
2572 IpltSection::IpltSection()
2573 : SyntheticSection(SHF_ALLOC
| SHF_EXECINSTR
, SHT_PROGBITS
, 16, ".iplt") {
2574 if (config
->emachine
== EM_PPC
|| config
->emachine
== EM_PPC64
) {
2580 void IpltSection::writeTo(uint8_t *buf
) {
2582 for (const Symbol
*sym
: entries
) {
2583 target
->writeIplt(buf
+ off
, *sym
, getVA() + off
);
2584 off
+= target
->ipltEntrySize
;
2588 size_t IpltSection::getSize() const {
2589 return entries
.size() * target
->ipltEntrySize
;
2592 void IpltSection::addEntry(Symbol
&sym
) {
2593 assert(sym
.auxIdx
== symAux
.size() - 1);
2594 symAux
.back().pltIdx
= entries
.size();
2595 entries
.push_back(&sym
);
2598 // ARM uses mapping symbols to aid disassembly.
2599 void IpltSection::addSymbols() {
2601 for (size_t i
= 0, e
= entries
.size(); i
!= e
; ++i
) {
2602 target
->addPltSymbols(*this, off
);
2603 off
+= target
->pltEntrySize
;
2607 PPC32GlinkSection::PPC32GlinkSection() {
2612 void PPC32GlinkSection::writeTo(uint8_t *buf
) {
2613 writePPC32GlinkSection(buf
, entries
.size());
2616 size_t PPC32GlinkSection::getSize() const {
2617 return headerSize
+ entries
.size() * target
->pltEntrySize
+ footerSize
;
2620 // This is an x86-only extra PLT section and used only when a security
2621 // enhancement feature called CET is enabled. In this comment, I'll explain what
2622 // the feature is and why we have two PLT sections if CET is enabled.
2624 // So, what does CET do? CET introduces a new restriction to indirect jump
2625 // instructions. CET works this way. Assume that CET is enabled. Then, if you
2626 // execute an indirect jump instruction, the processor verifies that a special
2627 // "landing pad" instruction (which is actually a repurposed NOP instruction and
2628 // now called "endbr32" or "endbr64") is at the jump target. If the jump target
2629 // does not start with that instruction, the processor raises an exception
2630 // instead of continuing executing code.
2632 // If CET is enabled, the compiler emits endbr to all locations where indirect
2633 // jumps may jump to.
2635 // This mechanism makes it extremely hard to transfer the control to a middle of
2636 // a function that is not supporsed to be a indirect jump target, preventing
2637 // certain types of attacks such as ROP or JOP.
2639 // Note that the processors in the market as of 2019 don't actually support the
2640 // feature. Only the spec is available at the moment.
2642 // Now, I'll explain why we have this extra PLT section for CET.
2644 // Since you can indirectly jump to a PLT entry, we have to make PLT entries
2645 // start with endbr. The problem is there's no extra space for endbr (which is 4
2646 // bytes long), as the PLT entry is only 16 bytes long and all bytes are already
2649 // In order to deal with the issue, we split a PLT entry into two PLT entries.
2650 // Remember that each PLT entry contains code to jump to an address read from
2651 // .got.plt AND code to resolve a dynamic symbol lazily. With the 2-PLT scheme,
2652 // the former code is written to .plt.sec, and the latter code is written to
2655 // Lazy symbol resolution in the 2-PLT scheme works in the usual way, except
2656 // that the regular .plt is now called .plt.sec and .plt is repurposed to
2657 // contain only code for lazy symbol resolution.
2659 // In other words, this is how the 2-PLT scheme works. Application code is
2660 // supposed to jump to .plt.sec to call an external function. Each .plt.sec
2661 // entry contains code to read an address from a corresponding .got.plt entry
2662 // and jump to that address. Addresses in .got.plt initially point to .plt, so
2663 // when an application calls an external function for the first time, the
2664 // control is transferred to a function that resolves a symbol name from
2665 // external shared object files. That function then rewrites a .got.plt entry
2666 // with a resolved address, so that the subsequent function calls directly jump
2667 // to a desired location from .plt.sec.
2669 // There is an open question as to whether the 2-PLT scheme was desirable or
2670 // not. We could have simply extended the PLT entry size to 32-bytes to
2671 // accommodate endbr, and that scheme would have been much simpler than the
2672 // 2-PLT scheme. One reason to split PLT was, by doing that, we could keep hot
2673 // code (.plt.sec) from cold code (.plt). But as far as I know no one proved
2674 // that the optimization actually makes a difference.
2676 // That said, the 2-PLT scheme is a part of the ABI, debuggers and other tools
2677 // depend on it, so we implement the ABI.
2678 IBTPltSection::IBTPltSection()
2679 : SyntheticSection(SHF_ALLOC
| SHF_EXECINSTR
, SHT_PROGBITS
, 16, ".plt") {}
2681 void IBTPltSection::writeTo(uint8_t *buf
) {
2682 target
->writeIBTPlt(buf
, in
.plt
->getNumEntries());
2685 size_t IBTPltSection::getSize() const {
2686 // 16 is the header size of .plt.
2687 return 16 + in
.plt
->getNumEntries() * target
->pltEntrySize
;
2690 bool IBTPltSection::isNeeded() const { return in
.plt
->getNumEntries() > 0; }
2692 RelroPaddingSection::RelroPaddingSection()
2693 : SyntheticSection(SHF_ALLOC
| SHF_WRITE
, SHT_NOBITS
, 1, ".relro_padding") {
2696 // The string hash function for .gdb_index.
2697 static uint32_t computeGdbHash(StringRef s
) {
2700 h
= h
* 67 + toLower(c
) - 113;
2704 GdbIndexSection::GdbIndexSection()
2705 : SyntheticSection(0, SHT_PROGBITS
, 1, ".gdb_index") {}
2707 // Returns the desired size of an on-disk hash table for a .gdb_index section.
2708 // There's a tradeoff between size and collision rate. We aim 75% utilization.
2709 size_t GdbIndexSection::computeSymtabSize() const {
2710 return std::max
<size_t>(NextPowerOf2(symbols
.size() * 4 / 3), 1024);
2713 static SmallVector
<GdbIndexSection::CuEntry
, 0>
2714 readCuList(DWARFContext
&dwarf
) {
2715 SmallVector
<GdbIndexSection::CuEntry
, 0> ret
;
2716 for (std::unique_ptr
<DWARFUnit
> &cu
: dwarf
.compile_units())
2717 ret
.push_back({cu
->getOffset(), cu
->getLength() + 4});
2721 static SmallVector
<GdbIndexSection::AddressEntry
, 0>
2722 readAddressAreas(DWARFContext
&dwarf
, InputSection
*sec
) {
2723 SmallVector
<GdbIndexSection::AddressEntry
, 0> ret
;
2726 for (std::unique_ptr
<DWARFUnit
> &cu
: dwarf
.compile_units()) {
2727 if (Error e
= cu
->tryExtractDIEsIfNeeded(false)) {
2728 warn(toString(sec
) + ": " + toString(std::move(e
)));
2731 Expected
<DWARFAddressRangesVector
> ranges
= cu
->collectAddressRanges();
2733 warn(toString(sec
) + ": " + toString(ranges
.takeError()));
2737 ArrayRef
<InputSectionBase
*> sections
= sec
->file
->getSections();
2738 for (DWARFAddressRange
&r
: *ranges
) {
2739 if (r
.SectionIndex
== -1ULL)
2741 // Range list with zero size has no effect.
2742 InputSectionBase
*s
= sections
[r
.SectionIndex
];
2743 if (s
&& s
!= &InputSection::discarded
&& s
->isLive())
2744 if (r
.LowPC
!= r
.HighPC
)
2745 ret
.push_back({cast
<InputSection
>(s
), r
.LowPC
, r
.HighPC
, cuIdx
});
2753 template <class ELFT
>
2754 static SmallVector
<GdbIndexSection::NameAttrEntry
, 0>
2755 readPubNamesAndTypes(const LLDDwarfObj
<ELFT
> &obj
,
2756 const SmallVectorImpl
<GdbIndexSection::CuEntry
> &cus
) {
2757 const LLDDWARFSection
&pubNames
= obj
.getGnuPubnamesSection();
2758 const LLDDWARFSection
&pubTypes
= obj
.getGnuPubtypesSection();
2760 SmallVector
<GdbIndexSection::NameAttrEntry
, 0> ret
;
2761 for (const LLDDWARFSection
*pub
: {&pubNames
, &pubTypes
}) {
2762 DWARFDataExtractor
data(obj
, *pub
, config
->isLE
, config
->wordsize
);
2763 DWARFDebugPubTable table
;
2764 table
.extract(data
, /*GnuStyle=*/true, [&](Error e
) {
2765 warn(toString(pub
->sec
) + ": " + toString(std::move(e
)));
2767 for (const DWARFDebugPubTable::Set
&set
: table
.getData()) {
2768 // The value written into the constant pool is kind << 24 | cuIndex. As we
2769 // don't know how many compilation units precede this object to compute
2770 // cuIndex, we compute (kind << 24 | cuIndexInThisObject) instead, and add
2771 // the number of preceding compilation units later.
2772 uint32_t i
= llvm::partition_point(cus
,
2773 [&](GdbIndexSection::CuEntry cu
) {
2774 return cu
.cuOffset
< set
.Offset
;
2777 for (const DWARFDebugPubTable::Entry
&ent
: set
.Entries
)
2778 ret
.push_back({{ent
.Name
, computeGdbHash(ent
.Name
)},
2779 (ent
.Descriptor
.toBits() << 24) | i
});
2785 // Create a list of symbols from a given list of symbol names and types
2786 // by uniquifying them by name.
2787 static std::pair
<SmallVector
<GdbIndexSection::GdbSymbol
, 0>, size_t>
2789 ArrayRef
<SmallVector
<GdbIndexSection::NameAttrEntry
, 0>> nameAttrs
,
2790 const SmallVector
<GdbIndexSection::GdbChunk
, 0> &chunks
) {
2791 using GdbSymbol
= GdbIndexSection::GdbSymbol
;
2792 using NameAttrEntry
= GdbIndexSection::NameAttrEntry
;
2794 // For each chunk, compute the number of compilation units preceding it.
2796 std::unique_ptr
<uint32_t[]> cuIdxs(new uint32_t[chunks
.size()]);
2797 for (uint32_t i
= 0, e
= chunks
.size(); i
!= e
; ++i
) {
2799 cuIdx
+= chunks
[i
].compilationUnits
.size();
2802 // The number of symbols we will handle in this function is of the order
2803 // of millions for very large executables, so we use multi-threading to
2805 constexpr size_t numShards
= 32;
2806 const size_t concurrency
=
2807 llvm::bit_floor(std::min
<size_t>(config
->threadCount
, numShards
));
2809 // A sharded map to uniquify symbols by name.
2811 std::make_unique
<DenseMap
<CachedHashStringRef
, size_t>[]>(numShards
);
2812 size_t shift
= 32 - llvm::countr_zero(numShards
);
2814 // Instantiate GdbSymbols while uniqufying them by name.
2815 auto symbols
= std::make_unique
<SmallVector
<GdbSymbol
, 0>[]>(numShards
);
2817 parallelFor(0, concurrency
, [&](size_t threadId
) {
2819 for (ArrayRef
<NameAttrEntry
> entries
: nameAttrs
) {
2820 for (const NameAttrEntry
&ent
: entries
) {
2821 size_t shardId
= ent
.name
.hash() >> shift
;
2822 if ((shardId
& (concurrency
- 1)) != threadId
)
2825 uint32_t v
= ent
.cuIndexAndAttrs
+ cuIdxs
[i
];
2826 size_t &idx
= map
[shardId
][ent
.name
];
2828 symbols
[shardId
][idx
- 1].cuVector
.push_back(v
);
2832 idx
= symbols
[shardId
].size() + 1;
2833 symbols
[shardId
].push_back({ent
.name
, {v
}, 0, 0});
2839 size_t numSymbols
= 0;
2840 for (ArrayRef
<GdbSymbol
> v
: ArrayRef(symbols
.get(), numShards
))
2841 numSymbols
+= v
.size();
2843 // The return type is a flattened vector, so we'll copy each vector
2845 SmallVector
<GdbSymbol
, 0> ret
;
2846 ret
.reserve(numSymbols
);
2847 for (SmallVector
<GdbSymbol
, 0> &vec
:
2848 MutableArrayRef(symbols
.get(), numShards
))
2849 for (GdbSymbol
&sym
: vec
)
2850 ret
.push_back(std::move(sym
));
2852 // CU vectors and symbol names are adjacent in the output file.
2853 // We can compute their offsets in the output file now.
2855 for (GdbSymbol
&sym
: ret
) {
2856 sym
.cuVectorOff
= off
;
2857 off
+= (sym
.cuVector
.size() + 1) * 4;
2859 for (GdbSymbol
&sym
: ret
) {
2861 off
+= sym
.name
.size() + 1;
2863 // If off overflows, the last symbol's nameOff likely overflows.
2864 if (!isUInt
<32>(off
))
2865 errorOrWarn("--gdb-index: constant pool size (" + Twine(off
) +
2866 ") exceeds UINT32_MAX");
2871 // Returns a newly-created .gdb_index section.
2872 template <class ELFT
> GdbIndexSection
*GdbIndexSection::create() {
2873 llvm::TimeTraceScope
timeScope("Create gdb index");
2875 // Collect InputFiles with .debug_info. See the comment in
2876 // LLDDwarfObj<ELFT>::LLDDwarfObj. If we do lightweight parsing in the future,
2877 // note that isec->data() may uncompress the full content, which should be
2879 SetVector
<InputFile
*> files
;
2880 for (InputSectionBase
*s
: ctx
.inputSections
) {
2881 InputSection
*isec
= dyn_cast
<InputSection
>(s
);
2884 // .debug_gnu_pub{names,types} are useless in executables.
2885 // They are present in input object files solely for creating
2886 // a .gdb_index. So we can remove them from the output.
2887 if (s
->name
== ".debug_gnu_pubnames" || s
->name
== ".debug_gnu_pubtypes")
2889 else if (isec
->name
== ".debug_info")
2890 files
.insert(isec
->file
);
2892 // Drop .rel[a].debug_gnu_pub{names,types} for --emit-relocs.
2893 llvm::erase_if(ctx
.inputSections
, [](InputSectionBase
*s
) {
2894 if (auto *isec
= dyn_cast
<InputSection
>(s
))
2895 if (InputSectionBase
*rel
= isec
->getRelocatedSection())
2896 return !rel
->isLive();
2897 return !s
->isLive();
2900 SmallVector
<GdbChunk
, 0> chunks(files
.size());
2901 SmallVector
<SmallVector
<NameAttrEntry
, 0>, 0> nameAttrs(files
.size());
2903 parallelFor(0, files
.size(), [&](size_t i
) {
2904 // To keep memory usage low, we don't want to keep cached DWARFContext, so
2905 // avoid getDwarf() here.
2906 ObjFile
<ELFT
> *file
= cast
<ObjFile
<ELFT
>>(files
[i
]);
2907 DWARFContext
dwarf(std::make_unique
<LLDDwarfObj
<ELFT
>>(file
));
2908 auto &dobj
= static_cast<const LLDDwarfObj
<ELFT
> &>(dwarf
.getDWARFObj());
2910 // If the are multiple compile units .debug_info (very rare ld -r --unique),
2911 // this only picks the last one. Other address ranges are lost.
2912 chunks
[i
].sec
= dobj
.getInfoSection();
2913 chunks
[i
].compilationUnits
= readCuList(dwarf
);
2914 chunks
[i
].addressAreas
= readAddressAreas(dwarf
, chunks
[i
].sec
);
2915 nameAttrs
[i
] = readPubNamesAndTypes
<ELFT
>(dobj
, chunks
[i
].compilationUnits
);
2918 auto *ret
= make
<GdbIndexSection
>();
2919 ret
->chunks
= std::move(chunks
);
2920 std::tie(ret
->symbols
, ret
->size
) = createSymbols(nameAttrs
, ret
->chunks
);
2922 // Count the areas other than the constant pool.
2923 ret
->size
+= sizeof(GdbIndexHeader
) + ret
->computeSymtabSize() * 8;
2924 for (GdbChunk
&chunk
: ret
->chunks
)
2926 chunk
.compilationUnits
.size() * 16 + chunk
.addressAreas
.size() * 20;
2931 void GdbIndexSection::writeTo(uint8_t *buf
) {
2932 // Write the header.
2933 auto *hdr
= reinterpret_cast<GdbIndexHeader
*>(buf
);
2934 uint8_t *start
= buf
;
2936 buf
+= sizeof(*hdr
);
2938 // Write the CU list.
2939 hdr
->cuListOff
= buf
- start
;
2940 for (GdbChunk
&chunk
: chunks
) {
2941 for (CuEntry
&cu
: chunk
.compilationUnits
) {
2942 write64le(buf
, chunk
.sec
->outSecOff
+ cu
.cuOffset
);
2943 write64le(buf
+ 8, cu
.cuLength
);
2948 // Write the address area.
2949 hdr
->cuTypesOff
= buf
- start
;
2950 hdr
->addressAreaOff
= buf
- start
;
2952 for (GdbChunk
&chunk
: chunks
) {
2953 for (AddressEntry
&e
: chunk
.addressAreas
) {
2954 // In the case of ICF there may be duplicate address range entries.
2955 const uint64_t baseAddr
= e
.section
->repl
->getVA(0);
2956 write64le(buf
, baseAddr
+ e
.lowAddress
);
2957 write64le(buf
+ 8, baseAddr
+ e
.highAddress
);
2958 write32le(buf
+ 16, e
.cuIndex
+ cuOff
);
2961 cuOff
+= chunk
.compilationUnits
.size();
2964 // Write the on-disk open-addressing hash table containing symbols.
2965 hdr
->symtabOff
= buf
- start
;
2966 size_t symtabSize
= computeSymtabSize();
2967 uint32_t mask
= symtabSize
- 1;
2969 for (GdbSymbol
&sym
: symbols
) {
2970 uint32_t h
= sym
.name
.hash();
2971 uint32_t i
= h
& mask
;
2972 uint32_t step
= ((h
* 17) & mask
) | 1;
2974 while (read32le(buf
+ i
* 8))
2975 i
= (i
+ step
) & mask
;
2977 write32le(buf
+ i
* 8, sym
.nameOff
);
2978 write32le(buf
+ i
* 8 + 4, sym
.cuVectorOff
);
2981 buf
+= symtabSize
* 8;
2983 // Write the string pool.
2984 hdr
->constantPoolOff
= buf
- start
;
2985 parallelForEach(symbols
, [&](GdbSymbol
&sym
) {
2986 memcpy(buf
+ sym
.nameOff
, sym
.name
.data(), sym
.name
.size());
2989 // Write the CU vectors.
2990 for (GdbSymbol
&sym
: symbols
) {
2991 write32le(buf
, sym
.cuVector
.size());
2993 for (uint32_t val
: sym
.cuVector
) {
2994 write32le(buf
, val
);
3000 bool GdbIndexSection::isNeeded() const { return !chunks
.empty(); }
3002 EhFrameHeader::EhFrameHeader()
3003 : SyntheticSection(SHF_ALLOC
, SHT_PROGBITS
, 4, ".eh_frame_hdr") {}
3005 void EhFrameHeader::writeTo(uint8_t *buf
) {
3006 // Unlike most sections, the EhFrameHeader section is written while writing
3007 // another section, namely EhFrameSection, which calls the write() function
3008 // below from its writeTo() function. This is necessary because the contents
3009 // of EhFrameHeader depend on the relocated contents of EhFrameSection and we
3010 // don't know which order the sections will be written in.
3013 // .eh_frame_hdr contains a binary search table of pointers to FDEs.
3014 // Each entry of the search table consists of two values,
3015 // the starting PC from where FDEs covers, and the FDE's address.
3016 // It is sorted by PC.
3017 void EhFrameHeader::write() {
3018 uint8_t *buf
= Out::bufferStart
+ getParent()->offset
+ outSecOff
;
3019 using FdeData
= EhFrameSection::FdeData
;
3020 SmallVector
<FdeData
, 0> fdes
= getPartition().ehFrame
->getFdeData();
3023 buf
[1] = DW_EH_PE_pcrel
| DW_EH_PE_sdata4
;
3024 buf
[2] = DW_EH_PE_udata4
;
3025 buf
[3] = DW_EH_PE_datarel
| DW_EH_PE_sdata4
;
3027 getPartition().ehFrame
->getParent()->addr
- this->getVA() - 4);
3028 write32(buf
+ 8, fdes
.size());
3031 for (FdeData
&fde
: fdes
) {
3032 write32(buf
, fde
.pcRel
);
3033 write32(buf
+ 4, fde
.fdeVARel
);
3038 size_t EhFrameHeader::getSize() const {
3039 // .eh_frame_hdr has a 12 bytes header followed by an array of FDEs.
3040 return 12 + getPartition().ehFrame
->numFdes
* 8;
3043 bool EhFrameHeader::isNeeded() const {
3044 return isLive() && getPartition().ehFrame
->isNeeded();
3047 VersionDefinitionSection::VersionDefinitionSection()
3048 : SyntheticSection(SHF_ALLOC
, SHT_GNU_verdef
, sizeof(uint32_t),
3049 ".gnu.version_d") {}
3051 StringRef
VersionDefinitionSection::getFileDefName() {
3052 if (!getPartition().name
.empty())
3053 return getPartition().name
;
3054 if (!config
->soName
.empty())
3055 return config
->soName
;
3056 return config
->outputFile
;
3059 void VersionDefinitionSection::finalizeContents() {
3060 fileDefNameOff
= getPartition().dynStrTab
->addString(getFileDefName());
3061 for (const VersionDefinition
&v
: namedVersionDefs())
3062 verDefNameOffs
.push_back(getPartition().dynStrTab
->addString(v
.name
));
3064 if (OutputSection
*sec
= getPartition().dynStrTab
->getParent())
3065 getParent()->link
= sec
->sectionIndex
;
3067 // sh_info should be set to the number of definitions. This fact is missed in
3068 // documentation, but confirmed by binutils community:
3069 // https://sourceware.org/ml/binutils/2014-11/msg00355.html
3070 getParent()->info
= getVerDefNum();
3073 void VersionDefinitionSection::writeOne(uint8_t *buf
, uint32_t index
,
3074 StringRef name
, size_t nameOff
) {
3075 uint16_t flags
= index
== 1 ? VER_FLG_BASE
: 0;
3078 write16(buf
, 1); // vd_version
3079 write16(buf
+ 2, flags
); // vd_flags
3080 write16(buf
+ 4, index
); // vd_ndx
3081 write16(buf
+ 6, 1); // vd_cnt
3082 write32(buf
+ 8, hashSysV(name
)); // vd_hash
3083 write32(buf
+ 12, 20); // vd_aux
3084 write32(buf
+ 16, 28); // vd_next
3087 write32(buf
+ 20, nameOff
); // vda_name
3088 write32(buf
+ 24, 0); // vda_next
3091 void VersionDefinitionSection::writeTo(uint8_t *buf
) {
3092 writeOne(buf
, 1, getFileDefName(), fileDefNameOff
);
3094 auto nameOffIt
= verDefNameOffs
.begin();
3095 for (const VersionDefinition
&v
: namedVersionDefs()) {
3097 writeOne(buf
, v
.id
, v
.name
, *nameOffIt
++);
3100 // Need to terminate the last version definition.
3101 write32(buf
+ 16, 0); // vd_next
3104 size_t VersionDefinitionSection::getSize() const {
3105 return EntrySize
* getVerDefNum();
3108 // .gnu.version is a table where each entry is 2 byte long.
3109 VersionTableSection::VersionTableSection()
3110 : SyntheticSection(SHF_ALLOC
, SHT_GNU_versym
, sizeof(uint16_t),
3115 void VersionTableSection::finalizeContents() {
3116 // At the moment of june 2016 GNU docs does not mention that sh_link field
3117 // should be set, but Sun docs do. Also readelf relies on this field.
3118 getParent()->link
= getPartition().dynSymTab
->getParent()->sectionIndex
;
3121 size_t VersionTableSection::getSize() const {
3122 return (getPartition().dynSymTab
->getSymbols().size() + 1) * 2;
3125 void VersionTableSection::writeTo(uint8_t *buf
) {
3127 for (const SymbolTableEntry
&s
: getPartition().dynSymTab
->getSymbols()) {
3128 // For an unextracted lazy symbol (undefined weak), it must have been
3129 // converted to Undefined and have VER_NDX_GLOBAL version here.
3130 assert(!s
.sym
->isLazy());
3131 write16(buf
, s
.sym
->versionId
);
3136 bool VersionTableSection::isNeeded() const {
3138 (getPartition().verDef
|| getPartition().verNeed
->isNeeded());
3141 void elf::addVerneed(Symbol
*ss
) {
3142 auto &file
= cast
<SharedFile
>(*ss
->file
);
3143 if (ss
->verdefIndex
== VER_NDX_GLOBAL
) {
3144 ss
->versionId
= VER_NDX_GLOBAL
;
3148 if (file
.vernauxs
.empty())
3149 file
.vernauxs
.resize(file
.verdefs
.size());
3151 // Select a version identifier for the vernaux data structure, if we haven't
3152 // already allocated one. The verdef identifiers cover the range
3153 // [1..getVerDefNum()]; this causes the vernaux identifiers to start from
3154 // getVerDefNum()+1.
3155 if (file
.vernauxs
[ss
->verdefIndex
] == 0)
3156 file
.vernauxs
[ss
->verdefIndex
] = ++SharedFile::vernauxNum
+ getVerDefNum();
3158 ss
->versionId
= file
.vernauxs
[ss
->verdefIndex
];
3161 template <class ELFT
>
3162 VersionNeedSection
<ELFT
>::VersionNeedSection()
3163 : SyntheticSection(SHF_ALLOC
, SHT_GNU_verneed
, sizeof(uint32_t),
3164 ".gnu.version_r") {}
3166 template <class ELFT
> void VersionNeedSection
<ELFT
>::finalizeContents() {
3167 for (SharedFile
*f
: ctx
.sharedFiles
) {
3168 if (f
->vernauxs
.empty())
3170 verneeds
.emplace_back();
3171 Verneed
&vn
= verneeds
.back();
3172 vn
.nameStrTab
= getPartition().dynStrTab
->addString(f
->soName
);
3173 bool isLibc
= config
->relrGlibc
&& f
->soName
.starts_with("libc.so.");
3174 bool isGlibc2
= false;
3175 for (unsigned i
= 0; i
!= f
->vernauxs
.size(); ++i
) {
3176 if (f
->vernauxs
[i
] == 0)
3179 reinterpret_cast<const typename
ELFT::Verdef
*>(f
->verdefs
[i
]);
3180 StringRef
ver(f
->getStringTable().data() + verdef
->getAux()->vda_name
);
3181 if (isLibc
&& ver
.starts_with("GLIBC_2."))
3183 vn
.vernauxs
.push_back({verdef
->vd_hash
, f
->vernauxs
[i
],
3184 getPartition().dynStrTab
->addString(ver
)});
3187 const char *ver
= "GLIBC_ABI_DT_RELR";
3188 vn
.vernauxs
.push_back({hashSysV(ver
),
3189 ++SharedFile::vernauxNum
+ getVerDefNum(),
3190 getPartition().dynStrTab
->addString(ver
)});
3194 if (OutputSection
*sec
= getPartition().dynStrTab
->getParent())
3195 getParent()->link
= sec
->sectionIndex
;
3196 getParent()->info
= verneeds
.size();
3199 template <class ELFT
> void VersionNeedSection
<ELFT
>::writeTo(uint8_t *buf
) {
3200 // The Elf_Verneeds need to appear first, followed by the Elf_Vernauxs.
3201 auto *verneed
= reinterpret_cast<Elf_Verneed
*>(buf
);
3202 auto *vernaux
= reinterpret_cast<Elf_Vernaux
*>(verneed
+ verneeds
.size());
3204 for (auto &vn
: verneeds
) {
3205 // Create an Elf_Verneed for this DSO.
3206 verneed
->vn_version
= 1;
3207 verneed
->vn_cnt
= vn
.vernauxs
.size();
3208 verneed
->vn_file
= vn
.nameStrTab
;
3210 reinterpret_cast<char *>(vernaux
) - reinterpret_cast<char *>(verneed
);
3211 verneed
->vn_next
= sizeof(Elf_Verneed
);
3214 // Create the Elf_Vernauxs for this Elf_Verneed.
3215 for (auto &vna
: vn
.vernauxs
) {
3216 vernaux
->vna_hash
= vna
.hash
;
3217 vernaux
->vna_flags
= 0;
3218 vernaux
->vna_other
= vna
.verneedIndex
;
3219 vernaux
->vna_name
= vna
.nameStrTab
;
3220 vernaux
->vna_next
= sizeof(Elf_Vernaux
);
3224 vernaux
[-1].vna_next
= 0;
3226 verneed
[-1].vn_next
= 0;
3229 template <class ELFT
> size_t VersionNeedSection
<ELFT
>::getSize() const {
3230 return verneeds
.size() * sizeof(Elf_Verneed
) +
3231 SharedFile::vernauxNum
* sizeof(Elf_Vernaux
);
3234 template <class ELFT
> bool VersionNeedSection
<ELFT
>::isNeeded() const {
3235 return isLive() && SharedFile::vernauxNum
!= 0;
3238 void MergeSyntheticSection::addSection(MergeInputSection
*ms
) {
3240 sections
.push_back(ms
);
3241 assert(addralign
== ms
->addralign
|| !(ms
->flags
& SHF_STRINGS
));
3242 addralign
= std::max(addralign
, ms
->addralign
);
3245 MergeTailSection::MergeTailSection(StringRef name
, uint32_t type
,
3246 uint64_t flags
, uint32_t alignment
)
3247 : MergeSyntheticSection(name
, type
, flags
, alignment
),
3248 builder(StringTableBuilder::RAW
, llvm::Align(alignment
)) {}
3250 size_t MergeTailSection::getSize() const { return builder
.getSize(); }
3252 void MergeTailSection::writeTo(uint8_t *buf
) { builder
.write(buf
); }
3254 void MergeTailSection::finalizeContents() {
3255 // Add all string pieces to the string table builder to create section
3257 for (MergeInputSection
*sec
: sections
)
3258 for (size_t i
= 0, e
= sec
->pieces
.size(); i
!= e
; ++i
)
3259 if (sec
->pieces
[i
].live
)
3260 builder
.add(sec
->getData(i
));
3262 // Fix the string table content. After this, the contents will never change.
3265 // finalize() fixed tail-optimized strings, so we can now get
3266 // offsets of strings. Get an offset for each string and save it
3267 // to a corresponding SectionPiece for easy access.
3268 for (MergeInputSection
*sec
: sections
)
3269 for (size_t i
= 0, e
= sec
->pieces
.size(); i
!= e
; ++i
)
3270 if (sec
->pieces
[i
].live
)
3271 sec
->pieces
[i
].outputOff
= builder
.getOffset(sec
->getData(i
));
3274 void MergeNoTailSection::writeTo(uint8_t *buf
) {
3275 parallelFor(0, numShards
,
3276 [&](size_t i
) { shards
[i
].write(buf
+ shardOffsets
[i
]); });
3279 // This function is very hot (i.e. it can take several seconds to finish)
3280 // because sometimes the number of inputs is in an order of magnitude of
3281 // millions. So, we use multi-threading.
3283 // For any strings S and T, we know S is not mergeable with T if S's hash
3284 // value is different from T's. If that's the case, we can safely put S and
3285 // T into different string builders without worrying about merge misses.
3286 // We do it in parallel.
3287 void MergeNoTailSection::finalizeContents() {
3288 // Initializes string table builders.
3289 for (size_t i
= 0; i
< numShards
; ++i
)
3290 shards
.emplace_back(StringTableBuilder::RAW
, llvm::Align(addralign
));
3292 // Concurrency level. Must be a power of 2 to avoid expensive modulo
3293 // operations in the following tight loop.
3294 const size_t concurrency
=
3295 llvm::bit_floor(std::min
<size_t>(config
->threadCount
, numShards
));
3297 // Add section pieces to the builders.
3298 parallelFor(0, concurrency
, [&](size_t threadId
) {
3299 for (MergeInputSection
*sec
: sections
) {
3300 for (size_t i
= 0, e
= sec
->pieces
.size(); i
!= e
; ++i
) {
3301 if (!sec
->pieces
[i
].live
)
3303 size_t shardId
= getShardId(sec
->pieces
[i
].hash
);
3304 if ((shardId
& (concurrency
- 1)) == threadId
)
3305 sec
->pieces
[i
].outputOff
= shards
[shardId
].add(sec
->getData(i
));
3310 // Compute an in-section offset for each shard.
3312 for (size_t i
= 0; i
< numShards
; ++i
) {
3313 shards
[i
].finalizeInOrder();
3314 if (shards
[i
].getSize() > 0)
3315 off
= alignToPowerOf2(off
, addralign
);
3316 shardOffsets
[i
] = off
;
3317 off
+= shards
[i
].getSize();
3321 // So far, section pieces have offsets from beginning of shards, but
3322 // we want offsets from beginning of the whole section. Fix them.
3323 parallelForEach(sections
, [&](MergeInputSection
*sec
) {
3324 for (size_t i
= 0, e
= sec
->pieces
.size(); i
!= e
; ++i
)
3325 if (sec
->pieces
[i
].live
)
3326 sec
->pieces
[i
].outputOff
+=
3327 shardOffsets
[getShardId(sec
->pieces
[i
].hash
)];
3331 template <class ELFT
> void elf::splitSections() {
3332 llvm::TimeTraceScope
timeScope("Split sections");
3333 // splitIntoPieces needs to be called on each MergeInputSection
3334 // before calling finalizeContents().
3335 parallelForEach(ctx
.objectFiles
, [](ELFFileBase
*file
) {
3336 for (InputSectionBase
*sec
: file
->getSections()) {
3339 if (auto *s
= dyn_cast
<MergeInputSection
>(sec
))
3340 s
->splitIntoPieces();
3341 else if (auto *eh
= dyn_cast
<EhInputSection
>(sec
))
3347 void elf::combineEhSections() {
3348 llvm::TimeTraceScope
timeScope("Combine EH sections");
3349 for (EhInputSection
*sec
: ctx
.ehInputSections
) {
3350 EhFrameSection
&eh
= *sec
->getPartition().ehFrame
;
3352 eh
.addralign
= std::max(eh
.addralign
, sec
->addralign
);
3353 eh
.sections
.push_back(sec
);
3354 llvm::append_range(eh
.dependentSections
, sec
->dependentSections
);
3357 if (!mainPart
->armExidx
)
3359 llvm::erase_if(ctx
.inputSections
, [](InputSectionBase
*s
) {
3360 // Ignore dead sections and the partition end marker (.part.end),
3361 // whose partition number is out of bounds.
3362 if (!s
->isLive() || s
->partition
== 255)
3364 Partition
&part
= s
->getPartition();
3365 return s
->kind() == SectionBase::Regular
&& part
.armExidx
&&
3366 part
.armExidx
->addSection(cast
<InputSection
>(s
));
3370 MipsRldMapSection::MipsRldMapSection()
3371 : SyntheticSection(SHF_ALLOC
| SHF_WRITE
, SHT_PROGBITS
, config
->wordsize
,
3374 ARMExidxSyntheticSection::ARMExidxSyntheticSection()
3375 : SyntheticSection(SHF_ALLOC
| SHF_LINK_ORDER
, SHT_ARM_EXIDX
,
3376 config
->wordsize
, ".ARM.exidx") {}
3378 static InputSection
*findExidxSection(InputSection
*isec
) {
3379 for (InputSection
*d
: isec
->dependentSections
)
3380 if (d
->type
== SHT_ARM_EXIDX
&& d
->isLive())
3385 static bool isValidExidxSectionDep(InputSection
*isec
) {
3386 return (isec
->flags
& SHF_ALLOC
) && (isec
->flags
& SHF_EXECINSTR
) &&
3387 isec
->getSize() > 0;
3390 bool ARMExidxSyntheticSection::addSection(InputSection
*isec
) {
3391 if (isec
->type
== SHT_ARM_EXIDX
) {
3392 if (InputSection
*dep
= isec
->getLinkOrderDep())
3393 if (isValidExidxSectionDep(dep
)) {
3394 exidxSections
.push_back(isec
);
3395 // Every exidxSection is 8 bytes, we need an estimate of
3396 // size before assignAddresses can be called. Final size
3397 // will only be known after finalize is called.
3403 if (isValidExidxSectionDep(isec
)) {
3404 executableSections
.push_back(isec
);
3408 // FIXME: we do not output a relocation section when --emit-relocs is used
3409 // as we do not have relocation sections for linker generated table entries
3410 // and we would have to erase at a late stage relocations from merged entries.
3411 // Given that exception tables are already position independent and a binary
3412 // analyzer could derive the relocations we choose to erase the relocations.
3413 if (config
->emitRelocs
&& isec
->type
== SHT_REL
)
3414 if (InputSectionBase
*ex
= isec
->getRelocatedSection())
3415 if (isa
<InputSection
>(ex
) && ex
->type
== SHT_ARM_EXIDX
)
3421 // References to .ARM.Extab Sections have bit 31 clear and are not the
3422 // special EXIDX_CANTUNWIND bit-pattern.
3423 static bool isExtabRef(uint32_t unwind
) {
3424 return (unwind
& 0x80000000) == 0 && unwind
!= 0x1;
3427 // Return true if the .ARM.exidx section Cur can be merged into the .ARM.exidx
3428 // section Prev, where Cur follows Prev in the table. This can be done if the
3429 // unwinding instructions in Cur are identical to Prev. Linker generated
3430 // EXIDX_CANTUNWIND entries are represented by nullptr as they do not have an
3432 static bool isDuplicateArmExidxSec(InputSection
*prev
, InputSection
*cur
) {
3433 // Get the last table Entry from the previous .ARM.exidx section. If Prev is
3434 // nullptr then it will be a synthesized EXIDX_CANTUNWIND entry.
3435 uint32_t prevUnwind
= 1;
3437 prevUnwind
= read32(prev
->content().data() + prev
->content().size() - 4);
3438 if (isExtabRef(prevUnwind
))
3441 // We consider the unwind instructions of an .ARM.exidx table entry
3442 // a duplicate if the previous unwind instructions if:
3443 // - Both are the special EXIDX_CANTUNWIND.
3444 // - Both are the same inline unwind instructions.
3445 // We do not attempt to follow and check links into .ARM.extab tables as
3446 // consecutive identical entries are rare and the effort to check that they
3447 // are identical is high.
3449 // If Cur is nullptr then this is synthesized EXIDX_CANTUNWIND entry.
3451 return prevUnwind
== 1;
3453 for (uint32_t offset
= 4; offset
< (uint32_t)cur
->content().size(); offset
+=8) {
3454 uint32_t curUnwind
= read32(cur
->content().data() + offset
);
3455 if (isExtabRef(curUnwind
) || curUnwind
!= prevUnwind
)
3458 // All table entries in this .ARM.exidx Section can be merged into the
3459 // previous Section.
3463 // The .ARM.exidx table must be sorted in ascending order of the address of the
3464 // functions the table describes. std::optionally duplicate adjacent table
3465 // entries can be removed. At the end of the function the executableSections
3466 // must be sorted in ascending order of address, Sentinel is set to the
3467 // InputSection with the highest address and any InputSections that have
3468 // mergeable .ARM.exidx table entries are removed from it.
3469 void ARMExidxSyntheticSection::finalizeContents() {
3470 // The executableSections and exidxSections that we use to derive the final
3471 // contents of this SyntheticSection are populated before
3472 // processSectionCommands() and ICF. A /DISCARD/ entry in SECTIONS command or
3473 // ICF may remove executable InputSections and their dependent .ARM.exidx
3474 // section that we recorded earlier.
3475 auto isDiscarded
= [](const InputSection
*isec
) { return !isec
->isLive(); };
3476 llvm::erase_if(exidxSections
, isDiscarded
);
3477 // We need to remove discarded InputSections and InputSections without
3478 // .ARM.exidx sections that if we generated the .ARM.exidx it would be out
3480 auto isDiscardedOrOutOfRange
= [this](InputSection
*isec
) {
3481 if (!isec
->isLive())
3483 if (findExidxSection(isec
))
3485 int64_t off
= static_cast<int64_t>(isec
->getVA() - getVA());
3486 return off
!= llvm::SignExtend64(off
, 31);
3488 llvm::erase_if(executableSections
, isDiscardedOrOutOfRange
);
3490 // Sort the executable sections that may or may not have associated
3491 // .ARM.exidx sections by order of ascending address. This requires the
3492 // relative positions of InputSections and OutputSections to be known.
3493 auto compareByFilePosition
= [](const InputSection
*a
,
3494 const InputSection
*b
) {
3495 OutputSection
*aOut
= a
->getParent();
3496 OutputSection
*bOut
= b
->getParent();
3499 return aOut
->addr
< bOut
->addr
;
3500 return a
->outSecOff
< b
->outSecOff
;
3502 llvm::stable_sort(executableSections
, compareByFilePosition
);
3503 sentinel
= executableSections
.back();
3504 // std::optionally merge adjacent duplicate entries.
3505 if (config
->mergeArmExidx
) {
3506 SmallVector
<InputSection
*, 0> selectedSections
;
3507 selectedSections
.reserve(executableSections
.size());
3508 selectedSections
.push_back(executableSections
[0]);
3510 for (size_t i
= 1; i
< executableSections
.size(); ++i
) {
3511 InputSection
*ex1
= findExidxSection(executableSections
[prev
]);
3512 InputSection
*ex2
= findExidxSection(executableSections
[i
]);
3513 if (!isDuplicateArmExidxSec(ex1
, ex2
)) {
3514 selectedSections
.push_back(executableSections
[i
]);
3518 executableSections
= std::move(selectedSections
);
3520 // offset is within the SyntheticSection.
3523 for (InputSection
*isec
: executableSections
) {
3524 if (InputSection
*d
= findExidxSection(isec
)) {
3525 d
->outSecOff
= offset
;
3526 d
->parent
= getParent();
3527 offset
+= d
->getSize();
3532 // Size includes Sentinel.
3536 InputSection
*ARMExidxSyntheticSection::getLinkOrderDep() const {
3537 return executableSections
.front();
3540 // To write the .ARM.exidx table from the ExecutableSections we have three cases
3541 // 1.) The InputSection has a .ARM.exidx InputSection in its dependent sections.
3542 // We write the .ARM.exidx section contents and apply its relocations.
3543 // 2.) The InputSection does not have a dependent .ARM.exidx InputSection. We
3544 // must write the contents of an EXIDX_CANTUNWIND directly. We use the
3545 // start of the InputSection as the purpose of the linker generated
3546 // section is to terminate the address range of the previous entry.
3547 // 3.) A trailing EXIDX_CANTUNWIND sentinel section is required at the end of
3548 // the table to terminate the address range of the final entry.
3549 void ARMExidxSyntheticSection::writeTo(uint8_t *buf
) {
3551 // A linker generated CANTUNWIND entry is made up of two words:
3552 // 0x0 with R_ARM_PREL31 relocation to target.
3553 // 0x1 with EXIDX_CANTUNWIND.
3554 uint64_t offset
= 0;
3555 for (InputSection
*isec
: executableSections
) {
3556 assert(isec
->getParent() != nullptr);
3557 if (InputSection
*d
= findExidxSection(isec
)) {
3558 for (int dataOffset
= 0; dataOffset
!= (int)d
->content().size();
3560 write32(buf
+ offset
+ dataOffset
,
3561 read32(d
->content().data() + dataOffset
));
3562 // Recalculate outSecOff as finalizeAddressDependentContent()
3563 // may have altered syntheticSection outSecOff.
3564 d
->outSecOff
= offset
+ outSecOff
;
3565 target
->relocateAlloc(*d
, buf
+ offset
);
3566 offset
+= d
->getSize();
3568 // A Linker generated CANTUNWIND section.
3569 write32(buf
+ offset
+ 0, 0x0);
3570 write32(buf
+ offset
+ 4, 0x1);
3571 uint64_t s
= isec
->getVA();
3572 uint64_t p
= getVA() + offset
;
3573 target
->relocateNoSym(buf
+ offset
, R_ARM_PREL31
, s
- p
);
3577 // Write Sentinel CANTUNWIND entry.
3578 write32(buf
+ offset
+ 0, 0x0);
3579 write32(buf
+ offset
+ 4, 0x1);
3580 uint64_t s
= sentinel
->getVA(sentinel
->getSize());
3581 uint64_t p
= getVA() + offset
;
3582 target
->relocateNoSym(buf
+ offset
, R_ARM_PREL31
, s
- p
);
3583 assert(size
== offset
+ 8);
3586 bool ARMExidxSyntheticSection::isNeeded() const {
3587 return llvm::any_of(exidxSections
,
3588 [](InputSection
*isec
) { return isec
->isLive(); });
3591 ThunkSection::ThunkSection(OutputSection
*os
, uint64_t off
)
3592 : SyntheticSection(SHF_ALLOC
| SHF_EXECINSTR
, SHT_PROGBITS
,
3593 config
->emachine
== EM_PPC64
? 16 : 4, ".text.thunk") {
3595 this->outSecOff
= off
;
3598 size_t ThunkSection::getSize() const {
3599 if (roundUpSizeForErrata
)
3600 return alignTo(size
, 4096);
3604 void ThunkSection::addThunk(Thunk
*t
) {
3605 thunks
.push_back(t
);
3606 t
->addSymbols(*this);
3609 void ThunkSection::writeTo(uint8_t *buf
) {
3610 for (Thunk
*t
: thunks
)
3611 t
->writeTo(buf
+ t
->offset
);
3614 InputSection
*ThunkSection::getTargetInputSection() const {
3617 const Thunk
*t
= thunks
.front();
3618 return t
->getTargetInputSection();
3621 bool ThunkSection::assignOffsets() {
3623 for (Thunk
*t
: thunks
) {
3624 off
= alignToPowerOf2(off
, t
->alignment
);
3626 uint32_t size
= t
->size();
3627 t
->getThunkTargetSym()->size
= size
;
3630 bool changed
= off
!= size
;
3635 PPC32Got2Section::PPC32Got2Section()
3636 : SyntheticSection(SHF_ALLOC
| SHF_WRITE
, SHT_PROGBITS
, 4, ".got2") {}
3638 bool PPC32Got2Section::isNeeded() const {
3639 // See the comment below. This is not needed if there is no other
3641 for (SectionCommand
*cmd
: getParent()->commands
)
3642 if (auto *isd
= dyn_cast
<InputSectionDescription
>(cmd
))
3643 for (InputSection
*isec
: isd
->sections
)
3649 void PPC32Got2Section::finalizeContents() {
3650 // PPC32 may create multiple GOT sections for -fPIC/-fPIE, one per file in
3651 // .got2 . This function computes outSecOff of each .got2 to be used in
3652 // PPC32PltCallStub::writeTo(). The purpose of this empty synthetic section is
3653 // to collect input sections named ".got2".
3654 for (SectionCommand
*cmd
: getParent()->commands
)
3655 if (auto *isd
= dyn_cast
<InputSectionDescription
>(cmd
)) {
3656 for (InputSection
*isec
: isd
->sections
) {
3657 // isec->file may be nullptr for MergeSyntheticSection.
3658 if (isec
!= this && isec
->file
)
3659 isec
->file
->ppc32Got2
= isec
;
3664 // If linking position-dependent code then the table will store the addresses
3665 // directly in the binary so the section has type SHT_PROGBITS. If linking
3666 // position-independent code the section has type SHT_NOBITS since it will be
3667 // allocated and filled in by the dynamic linker.
3668 PPC64LongBranchTargetSection::PPC64LongBranchTargetSection()
3669 : SyntheticSection(SHF_ALLOC
| SHF_WRITE
,
3670 config
->isPic
? SHT_NOBITS
: SHT_PROGBITS
, 8,
3673 uint64_t PPC64LongBranchTargetSection::getEntryVA(const Symbol
*sym
,
3675 return getVA() + entry_index
.find({sym
, addend
})->second
* 8;
3678 std::optional
<uint32_t>
3679 PPC64LongBranchTargetSection::addEntry(const Symbol
*sym
, int64_t addend
) {
3681 entry_index
.try_emplace(std::make_pair(sym
, addend
), entries
.size());
3683 return std::nullopt
;
3684 entries
.emplace_back(sym
, addend
);
3685 return res
.first
->second
;
3688 size_t PPC64LongBranchTargetSection::getSize() const {
3689 return entries
.size() * 8;
3692 void PPC64LongBranchTargetSection::writeTo(uint8_t *buf
) {
3693 // If linking non-pic we have the final addresses of the targets and they get
3694 // written to the table directly. For pic the dynamic linker will allocate
3695 // the section and fill it.
3699 for (auto entry
: entries
) {
3700 const Symbol
*sym
= entry
.first
;
3701 int64_t addend
= entry
.second
;
3702 assert(sym
->getVA());
3703 // Need calls to branch to the local entry-point since a long-branch
3704 // must be a local-call.
3705 write64(buf
, sym
->getVA(addend
) +
3706 getPPC64GlobalEntryToLocalEntryOffset(sym
->stOther
));
3711 bool PPC64LongBranchTargetSection::isNeeded() const {
3712 // `removeUnusedSyntheticSections()` is called before thunk allocation which
3713 // is too early to determine if this section will be empty or not. We need
3714 // Finalized to keep the section alive until after thunk creation. Finalized
3715 // only gets set to true once `finalizeSections()` is called after thunk
3716 // creation. Because of this, if we don't create any long-branch thunks we end
3717 // up with an empty .branch_lt section in the binary.
3718 return !finalized
|| !entries
.empty();
3721 static uint8_t getAbiVersion() {
3722 // MIPS non-PIC executable gets ABI version 1.
3723 if (config
->emachine
== EM_MIPS
) {
3724 if (!config
->isPic
&& !config
->relocatable
&&
3725 (config
->eflags
& (EF_MIPS_PIC
| EF_MIPS_CPIC
)) == EF_MIPS_CPIC
)
3730 if (config
->emachine
== EM_AMDGPU
&& !ctx
.objectFiles
.empty()) {
3731 uint8_t ver
= ctx
.objectFiles
[0]->abiVersion
;
3732 for (InputFile
*file
: ArrayRef(ctx
.objectFiles
).slice(1))
3733 if (file
->abiVersion
!= ver
)
3734 error("incompatible ABI version: " + toString(file
));
3741 template <typename ELFT
> void elf::writeEhdr(uint8_t *buf
, Partition
&part
) {
3742 memcpy(buf
, "\177ELF", 4);
3744 auto *eHdr
= reinterpret_cast<typename
ELFT::Ehdr
*>(buf
);
3745 eHdr
->e_ident
[EI_CLASS
] = config
->is64
? ELFCLASS64
: ELFCLASS32
;
3746 eHdr
->e_ident
[EI_DATA
] = config
->isLE
? ELFDATA2LSB
: ELFDATA2MSB
;
3747 eHdr
->e_ident
[EI_VERSION
] = EV_CURRENT
;
3748 eHdr
->e_ident
[EI_OSABI
] = config
->osabi
;
3749 eHdr
->e_ident
[EI_ABIVERSION
] = getAbiVersion();
3750 eHdr
->e_machine
= config
->emachine
;
3751 eHdr
->e_version
= EV_CURRENT
;
3752 eHdr
->e_flags
= config
->eflags
;
3753 eHdr
->e_ehsize
= sizeof(typename
ELFT::Ehdr
);
3754 eHdr
->e_phnum
= part
.phdrs
.size();
3755 eHdr
->e_shentsize
= sizeof(typename
ELFT::Shdr
);
3757 if (!config
->relocatable
) {
3758 eHdr
->e_phoff
= sizeof(typename
ELFT::Ehdr
);
3759 eHdr
->e_phentsize
= sizeof(typename
ELFT::Phdr
);
3763 template <typename ELFT
> void elf::writePhdrs(uint8_t *buf
, Partition
&part
) {
3764 // Write the program header table.
3765 auto *hBuf
= reinterpret_cast<typename
ELFT::Phdr
*>(buf
);
3766 for (PhdrEntry
*p
: part
.phdrs
) {
3767 hBuf
->p_type
= p
->p_type
;
3768 hBuf
->p_flags
= p
->p_flags
;
3769 hBuf
->p_offset
= p
->p_offset
;
3770 hBuf
->p_vaddr
= p
->p_vaddr
;
3771 hBuf
->p_paddr
= p
->p_paddr
;
3772 hBuf
->p_filesz
= p
->p_filesz
;
3773 hBuf
->p_memsz
= p
->p_memsz
;
3774 hBuf
->p_align
= p
->p_align
;
3779 template <typename ELFT
>
3780 PartitionElfHeaderSection
<ELFT
>::PartitionElfHeaderSection()
3781 : SyntheticSection(SHF_ALLOC
, SHT_LLVM_PART_EHDR
, 1, "") {}
3783 template <typename ELFT
>
3784 size_t PartitionElfHeaderSection
<ELFT
>::getSize() const {
3785 return sizeof(typename
ELFT::Ehdr
);
3788 template <typename ELFT
>
3789 void PartitionElfHeaderSection
<ELFT
>::writeTo(uint8_t *buf
) {
3790 writeEhdr
<ELFT
>(buf
, getPartition());
3792 // Loadable partitions are always ET_DYN.
3793 auto *eHdr
= reinterpret_cast<typename
ELFT::Ehdr
*>(buf
);
3794 eHdr
->e_type
= ET_DYN
;
3797 template <typename ELFT
>
3798 PartitionProgramHeadersSection
<ELFT
>::PartitionProgramHeadersSection()
3799 : SyntheticSection(SHF_ALLOC
, SHT_LLVM_PART_PHDR
, 1, ".phdrs") {}
3801 template <typename ELFT
>
3802 size_t PartitionProgramHeadersSection
<ELFT
>::getSize() const {
3803 return sizeof(typename
ELFT::Phdr
) * getPartition().phdrs
.size();
3806 template <typename ELFT
>
3807 void PartitionProgramHeadersSection
<ELFT
>::writeTo(uint8_t *buf
) {
3808 writePhdrs
<ELFT
>(buf
, getPartition());
3811 PartitionIndexSection::PartitionIndexSection()
3812 : SyntheticSection(SHF_ALLOC
, SHT_PROGBITS
, 4, ".rodata") {}
3814 size_t PartitionIndexSection::getSize() const {
3815 return 12 * (partitions
.size() - 1);
3818 void PartitionIndexSection::finalizeContents() {
3819 for (size_t i
= 1; i
!= partitions
.size(); ++i
)
3820 partitions
[i
].nameStrTab
= mainPart
->dynStrTab
->addString(partitions
[i
].name
);
3823 void PartitionIndexSection::writeTo(uint8_t *buf
) {
3824 uint64_t va
= getVA();
3825 for (size_t i
= 1; i
!= partitions
.size(); ++i
) {
3826 write32(buf
, mainPart
->dynStrTab
->getVA() + partitions
[i
].nameStrTab
- va
);
3827 write32(buf
+ 4, partitions
[i
].elfHeader
->getVA() - (va
+ 4));
3829 SyntheticSection
*next
= i
== partitions
.size() - 1
3831 : partitions
[i
+ 1].elfHeader
.get();
3832 write32(buf
+ 8, next
->getVA() - partitions
[i
].elfHeader
->getVA());
3839 void InStruct::reset() {
3841 riscvAttributes
.reset();
3847 relroPadding
.reset();
3848 armCmseSGSection
.reset();
3849 ppc64LongBranchTarget
.reset();
3850 mipsAbiFlags
.reset();
3852 mipsOptions
.reset();
3853 mipsReginfo
.reset();
3866 symTabShndx
.reset();
3869 constexpr char kMemtagAndroidNoteName
[] = "Android";
3870 void MemtagAndroidNote::writeTo(uint8_t *buf
) {
3872 sizeof(kMemtagAndroidNoteName
) == 8,
3873 "Android 11 & 12 have an ABI that the note name is 8 bytes long. Keep it "
3874 "that way for backwards compatibility.");
3876 write32(buf
, sizeof(kMemtagAndroidNoteName
));
3877 write32(buf
+ 4, sizeof(uint32_t));
3878 write32(buf
+ 8, ELF::NT_ANDROID_TYPE_MEMTAG
);
3879 memcpy(buf
+ 12, kMemtagAndroidNoteName
, sizeof(kMemtagAndroidNoteName
));
3880 buf
+= 12 + alignTo(sizeof(kMemtagAndroidNoteName
), 4);
3883 value
|= config
->androidMemtagMode
;
3884 if (config
->androidMemtagHeap
)
3885 value
|= ELF::NT_MEMTAG_HEAP
;
3886 // Note, MTE stack is an ABI break. Attempting to run an MTE stack-enabled
3887 // binary on Android 11 or 12 will result in a checkfail in the loader.
3888 if (config
->androidMemtagStack
)
3889 value
|= ELF::NT_MEMTAG_STACK
;
3890 write32(buf
, value
); // note value
3893 size_t MemtagAndroidNote::getSize() const {
3894 return sizeof(llvm::ELF::Elf64_Nhdr
) +
3895 /*namesz=*/alignTo(sizeof(kMemtagAndroidNoteName
), 4) +
3896 /*descsz=*/sizeof(uint32_t);
3899 void PackageMetadataNote::writeTo(uint8_t *buf
) {
3901 write32(buf
+ 4, config
->packageMetadata
.size() + 1);
3902 write32(buf
+ 8, FDO_PACKAGING_METADATA
);
3903 memcpy(buf
+ 12, "FDO", 4);
3904 memcpy(buf
+ 16, config
->packageMetadata
.data(),
3905 config
->packageMetadata
.size());
3908 size_t PackageMetadataNote::getSize() const {
3909 return sizeof(llvm::ELF::Elf64_Nhdr
) + 4 +
3910 alignTo(config
->packageMetadata
.size() + 1, 4);
3913 // Helper function, return the size of the ULEB128 for 'v', optionally writing
3914 // it to `*(buf + offset)` if `buf` is non-null.
3915 static size_t computeOrWriteULEB128(uint64_t v
, uint8_t *buf
, size_t offset
) {
3917 return encodeULEB128(v
, buf
+ offset
);
3918 return getULEB128Size(v
);
3921 // https://github.com/ARM-software/abi-aa/blob/main/memtagabielf64/memtagabielf64.rst#83encoding-of-sht_aarch64_memtag_globals_dynamic
3922 constexpr uint64_t kMemtagStepSizeBits
= 3;
3923 constexpr uint64_t kMemtagGranuleSize
= 16;
3924 static size_t createMemtagDescriptors(const SmallVector
<const Symbol
*, 0> &symbols
,
3925 uint8_t *buf
= nullptr) {
3926 size_t sectionSize
= 0;
3927 uint64_t lastGlobalEnd
= 0;
3929 for (const Symbol
*sym
: symbols
) {
3930 if (!includeInSymtab(*sym
))
3932 const uint64_t addr
= sym
->getVA();
3933 const uint64_t size
= sym
->getSize();
3935 if (addr
<= kMemtagGranuleSize
&& buf
!= nullptr)
3936 errorOrWarn("address of the tagged symbol \"" + sym
->getName() +
3937 "\" falls in the ELF header. This is indicative of a "
3938 "compiler/linker bug");
3939 if (addr
% kMemtagGranuleSize
!= 0)
3940 errorOrWarn("address of the tagged symbol \"" + sym
->getName() +
3941 "\" at 0x" + Twine::utohexstr(addr
) +
3942 "\" is not granule (16-byte) aligned");
3944 errorOrWarn("size of the tagged symbol \"" + sym
->getName() +
3945 "\" is not allowed to be zero");
3946 if (size
% kMemtagGranuleSize
!= 0)
3947 errorOrWarn("size of the tagged symbol \"" + sym
->getName() +
3948 "\" (size 0x" + Twine::utohexstr(size
) +
3949 ") is not granule (16-byte) aligned");
3951 const uint64_t sizeToEncode
= size
/ kMemtagGranuleSize
;
3952 const uint64_t stepToEncode
= ((addr
- lastGlobalEnd
) / kMemtagGranuleSize
)
3953 << kMemtagStepSizeBits
;
3954 if (sizeToEncode
< (1 << kMemtagStepSizeBits
)) {
3955 sectionSize
+= computeOrWriteULEB128(stepToEncode
| sizeToEncode
, buf
, sectionSize
);
3957 sectionSize
+= computeOrWriteULEB128(stepToEncode
, buf
, sectionSize
);
3958 sectionSize
+= computeOrWriteULEB128(sizeToEncode
- 1, buf
, sectionSize
);
3960 lastGlobalEnd
= addr
+ size
;
3966 bool MemtagDescriptors::updateAllocSize() {
3967 size_t oldSize
= getSize();
3968 std::stable_sort(symbols
.begin(), symbols
.end(),
3969 [](const Symbol
*s1
, const Symbol
*s2
) {
3970 return s1
->getVA() < s2
->getVA();
3972 return oldSize
!= getSize();
3975 void MemtagDescriptors::writeTo(uint8_t *buf
) {
3976 createMemtagDescriptors(symbols
, buf
);
3979 size_t MemtagDescriptors::getSize() const {
3980 return createMemtagDescriptors(symbols
);
3985 std::vector
<Partition
> elf::partitions
;
3986 Partition
*elf::mainPart
;
3988 template GdbIndexSection
*GdbIndexSection::create
<ELF32LE
>();
3989 template GdbIndexSection
*GdbIndexSection::create
<ELF32BE
>();
3990 template GdbIndexSection
*GdbIndexSection::create
<ELF64LE
>();
3991 template GdbIndexSection
*GdbIndexSection::create
<ELF64BE
>();
3993 template void elf::splitSections
<ELF32LE
>();
3994 template void elf::splitSections
<ELF32BE
>();
3995 template void elf::splitSections
<ELF64LE
>();
3996 template void elf::splitSections
<ELF64BE
>();
3998 template class elf::MipsAbiFlagsSection
<ELF32LE
>;
3999 template class elf::MipsAbiFlagsSection
<ELF32BE
>;
4000 template class elf::MipsAbiFlagsSection
<ELF64LE
>;
4001 template class elf::MipsAbiFlagsSection
<ELF64BE
>;
4003 template class elf::MipsOptionsSection
<ELF32LE
>;
4004 template class elf::MipsOptionsSection
<ELF32BE
>;
4005 template class elf::MipsOptionsSection
<ELF64LE
>;
4006 template class elf::MipsOptionsSection
<ELF64BE
>;
4008 template void EhFrameSection::iterateFDEWithLSDA
<ELF32LE
>(
4009 function_ref
<void(InputSection
&)>);
4010 template void EhFrameSection::iterateFDEWithLSDA
<ELF32BE
>(
4011 function_ref
<void(InputSection
&)>);
4012 template void EhFrameSection::iterateFDEWithLSDA
<ELF64LE
>(
4013 function_ref
<void(InputSection
&)>);
4014 template void EhFrameSection::iterateFDEWithLSDA
<ELF64BE
>(
4015 function_ref
<void(InputSection
&)>);
4017 template class elf::MipsReginfoSection
<ELF32LE
>;
4018 template class elf::MipsReginfoSection
<ELF32BE
>;
4019 template class elf::MipsReginfoSection
<ELF64LE
>;
4020 template class elf::MipsReginfoSection
<ELF64BE
>;
4022 template class elf::DynamicSection
<ELF32LE
>;
4023 template class elf::DynamicSection
<ELF32BE
>;
4024 template class elf::DynamicSection
<ELF64LE
>;
4025 template class elf::DynamicSection
<ELF64BE
>;
4027 template class elf::RelocationSection
<ELF32LE
>;
4028 template class elf::RelocationSection
<ELF32BE
>;
4029 template class elf::RelocationSection
<ELF64LE
>;
4030 template class elf::RelocationSection
<ELF64BE
>;
4032 template class elf::AndroidPackedRelocationSection
<ELF32LE
>;
4033 template class elf::AndroidPackedRelocationSection
<ELF32BE
>;
4034 template class elf::AndroidPackedRelocationSection
<ELF64LE
>;
4035 template class elf::AndroidPackedRelocationSection
<ELF64BE
>;
4037 template class elf::RelrSection
<ELF32LE
>;
4038 template class elf::RelrSection
<ELF32BE
>;
4039 template class elf::RelrSection
<ELF64LE
>;
4040 template class elf::RelrSection
<ELF64BE
>;
4042 template class elf::SymbolTableSection
<ELF32LE
>;
4043 template class elf::SymbolTableSection
<ELF32BE
>;
4044 template class elf::SymbolTableSection
<ELF64LE
>;
4045 template class elf::SymbolTableSection
<ELF64BE
>;
4047 template class elf::VersionNeedSection
<ELF32LE
>;
4048 template class elf::VersionNeedSection
<ELF32BE
>;
4049 template class elf::VersionNeedSection
<ELF64LE
>;
4050 template class elf::VersionNeedSection
<ELF64BE
>;
4052 template void elf::writeEhdr
<ELF32LE
>(uint8_t *Buf
, Partition
&Part
);
4053 template void elf::writeEhdr
<ELF32BE
>(uint8_t *Buf
, Partition
&Part
);
4054 template void elf::writeEhdr
<ELF64LE
>(uint8_t *Buf
, Partition
&Part
);
4055 template void elf::writeEhdr
<ELF64BE
>(uint8_t *Buf
, Partition
&Part
);
4057 template void elf::writePhdrs
<ELF32LE
>(uint8_t *Buf
, Partition
&Part
);
4058 template void elf::writePhdrs
<ELF32BE
>(uint8_t *Buf
, Partition
&Part
);
4059 template void elf::writePhdrs
<ELF64LE
>(uint8_t *Buf
, Partition
&Part
);
4060 template void elf::writePhdrs
<ELF64BE
>(uint8_t *Buf
, Partition
&Part
);
4062 template class elf::PartitionElfHeaderSection
<ELF32LE
>;
4063 template class elf::PartitionElfHeaderSection
<ELF32BE
>;
4064 template class elf::PartitionElfHeaderSection
<ELF64LE
>;
4065 template class elf::PartitionElfHeaderSection
<ELF64BE
>;
4067 template class elf::PartitionProgramHeadersSection
<ELF32LE
>;
4068 template class elf::PartitionProgramHeadersSection
<ELF32BE
>;
4069 template class elf::PartitionProgramHeadersSection
<ELF64LE
>;
4070 template class elf::PartitionProgramHeadersSection
<ELF64BE
>;