xref: /llvm-project-15.0.7/lld/ELF/Writer.cpp (revision 0a2899ca)
1 //===- Writer.cpp ---------------------------------------------------------===//
2 //
3 //                             The LLVM Linker
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "Writer.h"
11 #include "Config.h"
12 #include "OutputSections.h"
13 #include "SymbolTable.h"
14 #include "Target.h"
15 
16 #include "llvm/ADT/StringMap.h"
17 #include "llvm/ADT/StringSwitch.h"
18 #include "llvm/Support/FileOutputBuffer.h"
19 #include "llvm/Support/StringSaver.h"
20 
21 using namespace llvm;
22 using namespace llvm::ELF;
23 using namespace llvm::object;
24 
25 using namespace lld;
26 using namespace lld::elf2;
27 
28 namespace {
29 // The writer writes a SymbolTable result to a file.
30 template <class ELFT> class Writer {
31 public:
32   typedef typename ELFFile<ELFT>::uintX_t uintX_t;
33   typedef typename ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
34   typedef typename ELFFile<ELFT>::Elf_Ehdr Elf_Ehdr;
35   typedef typename ELFFile<ELFT>::Elf_Phdr Elf_Phdr;
36   typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym;
37   typedef typename ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range;
38   typedef typename ELFFile<ELFT>::Elf_Rela Elf_Rela;
39   Writer(SymbolTable<ELFT> &S) : Symtab(S) {}
40   void run();
41 
42 private:
43   void copyLocalSymbols();
44   void createSections();
45   template <bool isRela>
46   void scanRelocs(InputSectionBase<ELFT> &C,
47                   iterator_range<const Elf_Rel_Impl<ELFT, isRela> *> Rels);
48   void scanRelocs(InputSection<ELFT> &C);
49   void scanRelocs(InputSectionBase<ELFT> &S, const Elf_Shdr &RelSec);
50   void updateRelro(Elf_Phdr *Cur, Elf_Phdr *GnuRelroPhdr,
51                    OutputSectionBase<ELFT> *Sec, uintX_t VA);
52   void assignAddresses();
53   void buildSectionMap();
54   void openFile(StringRef OutputPath);
55   void writeHeader();
56   void writeSections();
57   bool isDiscarded(InputSectionBase<ELFT> *IS) const;
58   StringRef getOutputSectionName(StringRef S) const;
59   bool needsInterpSection() const {
60     return !Symtab.getSharedFiles().empty() && !Config->DynamicLinker.empty();
61   }
62   bool isOutputDynamic() const {
63     return !Symtab.getSharedFiles().empty() || Config->Shared;
64   }
65   uintX_t getEntryAddr() const;
66   int getPhdrsNum() const;
67 
68   OutputSection<ELFT> *getBSS();
69   void addCommonSymbols(std::vector<DefinedCommon<ELFT> *> &Syms);
70   void addSharedCopySymbols(std::vector<SharedSymbol<ELFT> *> &Syms);
71 
72   std::unique_ptr<llvm::FileOutputBuffer> Buffer;
73 
74   SpecificBumpPtrAllocator<OutputSection<ELFT>> SecAlloc;
75   SpecificBumpPtrAllocator<MergeOutputSection<ELFT>> MSecAlloc;
76   SpecificBumpPtrAllocator<EHOutputSection<ELFT>> EHSecAlloc;
77   BumpPtrAllocator Alloc;
78   std::vector<OutputSectionBase<ELFT> *> OutputSections;
79   unsigned getNumSections() const { return OutputSections.size() + 1; }
80 
81   void addStartStopSymbols(OutputSectionBase<ELFT> *Sec);
82   void setPhdr(Elf_Phdr *PH, uint32_t Type, uint32_t Flags, uintX_t FileOff,
83                uintX_t VA, uintX_t Size, uintX_t Align);
84   void copyPhdr(Elf_Phdr *PH, OutputSectionBase<ELFT> *From);
85 
86   bool HasRelro = false;
87   SymbolTable<ELFT> &Symtab;
88   std::vector<Elf_Phdr> Phdrs;
89 
90   uintX_t FileSize;
91   uintX_t SectionHeaderOff;
92 
93   llvm::StringMap<llvm::StringRef> InputToOutputSection;
94 };
95 } // anonymous namespace
96 
97 template <class ELFT> void lld::elf2::writeResult(SymbolTable<ELFT> *Symtab) {
98   // Initialize output sections that are handled by Writer specially.
99   // Don't reorder because the order of initialization matters.
100   InterpSection<ELFT> Interp;
101   Out<ELFT>::Interp = &Interp;
102   StringTableSection<ELFT> ShStrTab(".shstrtab", false);
103   Out<ELFT>::ShStrTab = &ShStrTab;
104   StringTableSection<ELFT> StrTab(".strtab", false);
105   if (!Config->StripAll)
106     Out<ELFT>::StrTab = &StrTab;
107   StringTableSection<ELFT> DynStrTab(".dynstr", true);
108   Out<ELFT>::DynStrTab = &DynStrTab;
109   GotSection<ELFT> Got;
110   Out<ELFT>::Got = &Got;
111   GotPltSection<ELFT> GotPlt;
112   if (Target->supportsLazyRelocations())
113     Out<ELFT>::GotPlt = &GotPlt;
114   PltSection<ELFT> Plt;
115   Out<ELFT>::Plt = &Plt;
116   std::unique_ptr<SymbolTableSection<ELFT>> SymTab;
117   if (!Config->StripAll) {
118     SymTab.reset(new SymbolTableSection<ELFT>(*Symtab, *Out<ELFT>::StrTab));
119     Out<ELFT>::SymTab = SymTab.get();
120   }
121   SymbolTableSection<ELFT> DynSymTab(*Symtab, *Out<ELFT>::DynStrTab);
122   Out<ELFT>::DynSymTab = &DynSymTab;
123   HashTableSection<ELFT> HashTab;
124   if (Config->SysvHash)
125     Out<ELFT>::HashTab = &HashTab;
126   GnuHashTableSection<ELFT> GnuHashTab;
127   if (Config->GnuHash)
128     Out<ELFT>::GnuHashTab = &GnuHashTab;
129   bool IsRela = Symtab->shouldUseRela();
130   RelocationSection<ELFT> RelaDyn(IsRela ? ".rela.dyn" : ".rel.dyn", IsRela);
131   Out<ELFT>::RelaDyn = &RelaDyn;
132   RelocationSection<ELFT> RelaPlt(IsRela ? ".rela.plt" : ".rel.plt", IsRela);
133   if (Target->supportsLazyRelocations())
134     Out<ELFT>::RelaPlt = &RelaPlt;
135   DynamicSection<ELFT> Dynamic(*Symtab);
136   Out<ELFT>::Dynamic = &Dynamic;
137 
138   Writer<ELFT>(*Symtab).run();
139 }
140 
141 // The main function of the writer.
142 template <class ELFT> void Writer<ELFT>::run() {
143   buildSectionMap();
144   if (!Config->DiscardAll)
145     copyLocalSymbols();
146   createSections();
147   assignAddresses();
148   openFile(Config->OutputFile);
149   writeHeader();
150   writeSections();
151   error(Buffer->commit());
152 }
153 
154 namespace {
155 template <bool Is64Bits> struct SectionKey {
156   typedef typename std::conditional<Is64Bits, uint64_t, uint32_t>::type uintX_t;
157   StringRef Name;
158   uint32_t Type;
159   uintX_t Flags;
160   uintX_t EntSize;
161 };
162 }
163 namespace llvm {
164 template <bool Is64Bits> struct DenseMapInfo<SectionKey<Is64Bits>> {
165   static SectionKey<Is64Bits> getEmptyKey() {
166     return SectionKey<Is64Bits>{DenseMapInfo<StringRef>::getEmptyKey(), 0, 0,
167                                 0};
168   }
169   static SectionKey<Is64Bits> getTombstoneKey() {
170     return SectionKey<Is64Bits>{DenseMapInfo<StringRef>::getTombstoneKey(), 0,
171                                 0, 0};
172   }
173   static unsigned getHashValue(const SectionKey<Is64Bits> &Val) {
174     return hash_combine(Val.Name, Val.Type, Val.Flags, Val.EntSize);
175   }
176   static bool isEqual(const SectionKey<Is64Bits> &LHS,
177                       const SectionKey<Is64Bits> &RHS) {
178     return DenseMapInfo<StringRef>::isEqual(LHS.Name, RHS.Name) &&
179            LHS.Type == RHS.Type && LHS.Flags == RHS.Flags &&
180            LHS.EntSize == RHS.EntSize;
181   }
182 };
183 }
184 
185 // The reason we have to do this early scan is as follows
186 // * To mmap the output file, we need to know the size
187 // * For that, we need to know how many dynamic relocs we will have.
188 // It might be possible to avoid this by outputting the file with write:
189 // * Write the allocated output sections, computing addresses.
190 // * Apply relocations, recording which ones require a dynamic reloc.
191 // * Write the dynamic relocations.
192 // * Write the rest of the file.
193 template <class ELFT>
194 template <bool isRela>
195 void Writer<ELFT>::scanRelocs(
196     InputSectionBase<ELFT> &C,
197     iterator_range<const Elf_Rel_Impl<ELFT, isRela> *> Rels) {
198   typedef Elf_Rel_Impl<ELFT, isRela> RelType;
199   const ObjectFile<ELFT> &File = *C.getFile();
200   for (const RelType &RI : Rels) {
201     uint32_t SymIndex = RI.getSymbol(Config->Mips64EL);
202     SymbolBody *Body = File.getSymbolBody(SymIndex);
203     uint32_t Type = RI.getType(Config->Mips64EL);
204 
205     if (Target->isTlsLocalDynamicReloc(Type)) {
206       if (Out<ELFT>::LocalModuleTlsIndexOffset == uint32_t(-1)) {
207         Out<ELFT>::LocalModuleTlsIndexOffset =
208             Out<ELFT>::Got->addLocalModuleTlsIndex();
209         Out<ELFT>::RelaDyn->addReloc({&C, &RI});
210       }
211       continue;
212     }
213 
214     // Set "used" bit for --as-needed.
215     if (Body && Body->isUndefined() && !Body->isWeak())
216       if (auto *S = dyn_cast<SharedSymbol<ELFT>>(Body->repl()))
217         S->File->IsUsed = true;
218 
219     if (Body)
220       Body = Body->repl();
221 
222     if (Body && Body->isTLS() && Target->isTlsGlobalDynamicReloc(Type)) {
223       if (Body->isInGot())
224         continue;
225       Out<ELFT>::Got->addDynTlsEntry(Body);
226       Out<ELFT>::RelaDyn->addReloc({&C, &RI});
227       Out<ELFT>::RelaDyn->addReloc({nullptr, nullptr});
228       Body->setUsedInDynamicReloc();
229       continue;
230     }
231 
232     if ((Body && Body->isTLS()) && Type != Target->getTlsPcRelGotReloc())
233       continue;
234 
235     bool NeedsGot = false;
236     bool NeedsPlt = false;
237     if (Body) {
238       if (auto *E = dyn_cast<SharedSymbol<ELFT>>(Body)) {
239         if (E->needsCopy())
240           continue;
241         if (Target->relocNeedsCopy(Type, *Body))
242           E->OffsetInBSS = 0;
243       }
244       NeedsPlt = Target->relocNeedsPlt(Type, *Body);
245       if (NeedsPlt) {
246         if (Body->isInPlt())
247           continue;
248         Out<ELFT>::Plt->addEntry(Body);
249       }
250       NeedsGot = Target->relocNeedsGot(Type, *Body);
251       if (NeedsGot) {
252         if (NeedsPlt && Target->supportsLazyRelocations()) {
253           Out<ELFT>::GotPlt->addEntry(Body);
254         } else {
255           if (Body->isInGot())
256             continue;
257           Out<ELFT>::Got->addEntry(Body);
258         }
259       }
260     }
261 
262     if (Config->EMachine == EM_MIPS && NeedsGot) {
263       // MIPS ABI has special rules to process GOT entries
264       // and doesn't require relocation entries for them.
265       // See "Global Offset Table" in Chapter 5 in the following document
266       // for detailed description:
267       // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
268       Body->setUsedInDynamicReloc();
269       continue;
270     }
271     bool CBP = canBePreempted(Body, NeedsGot);
272     if (!CBP && (!Config->Shared || Target->isRelRelative(Type)))
273       continue;
274     if (CBP)
275       Body->setUsedInDynamicReloc();
276     if (NeedsPlt && Target->supportsLazyRelocations())
277       Out<ELFT>::RelaPlt->addReloc({&C, &RI});
278     else
279       Out<ELFT>::RelaDyn->addReloc({&C, &RI});
280   }
281 }
282 
283 template <class ELFT> void Writer<ELFT>::scanRelocs(InputSection<ELFT> &C) {
284   if (!(C.getSectionHdr()->sh_flags & SHF_ALLOC))
285     return;
286 
287   for (const Elf_Shdr *RelSec : C.RelocSections)
288     scanRelocs(C, *RelSec);
289 }
290 
291 template <class ELFT>
292 void Writer<ELFT>::scanRelocs(InputSectionBase<ELFT> &S,
293                               const Elf_Shdr &RelSec) {
294   ELFFile<ELFT> &EObj = S.getFile()->getObj();
295   if (RelSec.sh_type == SHT_RELA)
296     scanRelocs(S, EObj.relas(&RelSec));
297   else
298     scanRelocs(S, EObj.rels(&RelSec));
299 }
300 
301 template <class ELFT>
302 static void reportUndefined(const SymbolTable<ELFT> &S, const SymbolBody &Sym) {
303   typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym;
304   typedef typename ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range;
305 
306   if (Config->Shared && !Config->NoUndefined)
307     return;
308 
309   const Elf_Sym &SymE = cast<ELFSymbolBody<ELFT>>(Sym).Sym;
310   ELFFileBase<ELFT> *SymFile = nullptr;
311 
312   for (const std::unique_ptr<ObjectFile<ELFT>> &File : S.getObjectFiles()) {
313     Elf_Sym_Range Syms = File->getObj().symbols(File->getSymbolTable());
314     if (&SymE > Syms.begin() && &SymE < Syms.end())
315       SymFile = File.get();
316   }
317 
318   std::string Message = "undefined symbol: " + Sym.getName().str();
319   if (SymFile)
320     Message += " in " + SymFile->getName().str();
321   if (Config->NoInhibitExec)
322     warning(Message);
323   else
324     error(Message);
325 }
326 
327 // Local symbols are not in the linker's symbol table. This function scans
328 // each object file's symbol table to copy local symbols to the output.
329 template <class ELFT> void Writer<ELFT>::copyLocalSymbols() {
330   for (const std::unique_ptr<ObjectFile<ELFT>> &F : Symtab.getObjectFiles()) {
331     for (const Elf_Sym &Sym : F->getLocalSymbols()) {
332       ErrorOr<StringRef> SymNameOrErr = Sym.getName(F->getStringTable());
333       error(SymNameOrErr);
334       StringRef SymName = *SymNameOrErr;
335       if (!shouldKeepInSymtab<ELFT>(*F, SymName, Sym))
336         continue;
337       if (Out<ELFT>::SymTab)
338         Out<ELFT>::SymTab->addLocalSymbol(SymName);
339     }
340   }
341 }
342 
343 // PPC64 has a number of special SHT_PROGBITS+SHF_ALLOC+SHF_WRITE sections that
344 // we would like to make sure appear is a specific order to maximize their
345 // coverage by a single signed 16-bit offset from the TOC base pointer.
346 // Conversely, the special .tocbss section should be first among all SHT_NOBITS
347 // sections. This will put it next to the loaded special PPC64 sections (and,
348 // thus, within reach of the TOC base pointer).
349 static int getPPC64SectionRank(StringRef SectionName) {
350   return StringSwitch<int>(SectionName)
351            .Case(".tocbss", 0)
352            .Case(".branch_lt", 2)
353            .Case(".toc", 3)
354            .Case(".toc1", 4)
355            .Case(".opd", 5)
356            .Default(1);
357 }
358 
359 template <class ELFT> static bool isRelroSection(OutputSectionBase<ELFT> *Sec) {
360   typename OutputSectionBase<ELFT>::uintX_t Flags = Sec->getFlags();
361   if (!(Flags & SHF_ALLOC) || !(Flags & SHF_WRITE))
362     return false;
363   uint32_t Type = Sec->getType();
364   if ((Flags & SHF_TLS) || (Type == SHT_INIT_ARRAY || Type == SHT_FINI_ARRAY ||
365                             Type == SHT_PREINIT_ARRAY))
366     return true;
367   if (Sec == Out<ELFT>::GotPlt)
368     return Config->ZNow;
369   if (Sec == Out<ELFT>::Dynamic || Sec == Out<ELFT>::Got)
370     return true;
371 
372   StringRef Name = Sec->getName();
373   StringRef WhiteList[] = {".data.rel.ro", ".ctors", ".dtors", ".jcr",
374                            ".eh_frame"};
375   return (std::find(std::begin(WhiteList), std::end(WhiteList), Name) !=
376           std::end(WhiteList));
377 }
378 
379 // Output section ordering is determined by this function.
380 template <class ELFT>
381 static bool compareOutputSections(OutputSectionBase<ELFT> *A,
382                                   OutputSectionBase<ELFT> *B) {
383   typedef typename ELFFile<ELFT>::uintX_t uintX_t;
384 
385   uintX_t AFlags = A->getFlags();
386   uintX_t BFlags = B->getFlags();
387 
388   // Allocatable sections go first to reduce the total PT_LOAD size and
389   // so debug info doesn't change addresses in actual code.
390   bool AIsAlloc = AFlags & SHF_ALLOC;
391   bool BIsAlloc = BFlags & SHF_ALLOC;
392   if (AIsAlloc != BIsAlloc)
393     return AIsAlloc;
394 
395   // We don't have any special requirements for the relative order of
396   // two non allocatable sections.
397   if (!AIsAlloc)
398     return false;
399 
400   // We want the read only sections first so that they go in the PT_LOAD
401   // covering the program headers at the start of the file.
402   bool AIsWritable = AFlags & SHF_WRITE;
403   bool BIsWritable = BFlags & SHF_WRITE;
404   if (AIsWritable != BIsWritable)
405     return BIsWritable;
406 
407   // For a corresponding reason, put non exec sections first (the program
408   // header PT_LOAD is not executable).
409   bool AIsExec = AFlags & SHF_EXECINSTR;
410   bool BIsExec = BFlags & SHF_EXECINSTR;
411   if (AIsExec != BIsExec)
412     return BIsExec;
413 
414   // If we got here we know that both A and B are in the same PT_LOAD.
415 
416   // The TLS initialization block needs to be a single contiguous block in a R/W
417   // PT_LOAD, so stick TLS sections directly before R/W sections. The TLS NOBITS
418   // sections are placed here as they don't take up virtual address space in the
419   // PT_LOAD.
420   bool AIsTLS = AFlags & SHF_TLS;
421   bool BIsTLS = BFlags & SHF_TLS;
422   if (AIsTLS != BIsTLS)
423     return AIsTLS;
424 
425   // The next requirement we have is to put nobits sections last. The
426   // reason is that the only thing the dynamic linker will see about
427   // them is a p_memsz that is larger than p_filesz. Seeing that it
428   // zeros the end of the PT_LOAD, so that has to correspond to the
429   // nobits sections.
430   bool AIsNoBits = A->getType() == SHT_NOBITS;
431   bool BIsNoBits = B->getType() == SHT_NOBITS;
432   if (AIsNoBits != BIsNoBits)
433     return BIsNoBits;
434 
435   // We place RelRo section before plain r/w ones.
436   bool AIsRelRo = isRelroSection(A);
437   bool BIsRelRo = isRelroSection(B);
438   if (AIsRelRo != BIsRelRo)
439     return AIsRelRo;
440 
441   // Some architectures have additional ordering restrictions for sections
442   // within the same PT_LOAD.
443   if (Config->EMachine == EM_PPC64)
444     return getPPC64SectionRank(A->getName()) <
445            getPPC64SectionRank(B->getName());
446 
447   return false;
448 }
449 
450 template <class ELFT> OutputSection<ELFT> *Writer<ELFT>::getBSS() {
451   if (!Out<ELFT>::Bss) {
452     Out<ELFT>::Bss = new (SecAlloc.Allocate())
453         OutputSection<ELFT>(".bss", SHT_NOBITS, SHF_ALLOC | SHF_WRITE);
454     OutputSections.push_back(Out<ELFT>::Bss);
455   }
456   return Out<ELFT>::Bss;
457 }
458 
459 // Until this function is called, common symbols do not belong to any section.
460 // This function adds them to end of BSS section.
461 template <class ELFT>
462 void Writer<ELFT>::addCommonSymbols(std::vector<DefinedCommon<ELFT> *> &Syms) {
463   typedef typename ELFFile<ELFT>::uintX_t uintX_t;
464   typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym;
465 
466   if (Syms.empty())
467     return;
468 
469   // Sort the common symbols by alignment as an heuristic to pack them better.
470   std::stable_sort(
471     Syms.begin(), Syms.end(),
472     [](const DefinedCommon<ELFT> *A, const DefinedCommon<ELFT> *B) {
473       return A->MaxAlignment > B->MaxAlignment;
474     });
475 
476   uintX_t Off = getBSS()->getSize();
477   for (DefinedCommon<ELFT> *C : Syms) {
478     const Elf_Sym &Sym = C->Sym;
479     uintX_t Align = C->MaxAlignment;
480     Off = RoundUpToAlignment(Off, Align);
481     C->OffsetInBSS = Off;
482     Off += Sym.st_size;
483   }
484 
485   Out<ELFT>::Bss->setSize(Off);
486 }
487 
488 template <class ELFT>
489 void Writer<ELFT>::addSharedCopySymbols(
490     std::vector<SharedSymbol<ELFT> *> &Syms) {
491   typedef typename ELFFile<ELFT>::uintX_t uintX_t;
492   typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym;
493   typedef typename ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
494 
495   if (Syms.empty())
496     return;
497 
498   uintX_t Off = getBSS()->getSize();
499   for (SharedSymbol<ELFT> *C : Syms) {
500     const Elf_Sym &Sym = C->Sym;
501     const Elf_Shdr *Sec = C->File->getSection(Sym);
502     uintX_t SecAlign = Sec->sh_addralign;
503     uintX_t Align = Sym.st_value % SecAlign;
504     if (Align == 0)
505       Align = SecAlign;
506     Out<ELFT>::Bss->updateAlign(Align);
507     Off = RoundUpToAlignment(Off, Align);
508     C->OffsetInBSS = Off;
509     Off += Sym.st_size;
510   }
511   Out<ELFT>::Bss->setSize(Off);
512 }
513 
514 template <class ELFT>
515 StringRef Writer<ELFT>::getOutputSectionName(StringRef S) const {
516   auto It = InputToOutputSection.find(S);
517   if (It != std::end(InputToOutputSection))
518     return It->second;
519 
520   if (S.startswith(".text."))
521     return ".text";
522   if (S.startswith(".rodata."))
523     return ".rodata";
524   if (S.startswith(".data.rel.ro"))
525     return ".data.rel.ro";
526   if (S.startswith(".data."))
527     return ".data";
528   if (S.startswith(".bss."))
529     return ".bss";
530   return S;
531 }
532 
533 template <class ELFT>
534 bool Writer<ELFT>::isDiscarded(InputSectionBase<ELFT> *IS) const {
535   if (!IS || !IS->isLive() || IS == &InputSection<ELFT>::Discarded)
536     return true;
537   return InputToOutputSection.lookup(IS->getSectionName()) == "/DISCARD/";
538 }
539 
540 template <class ELFT>
541 static bool compareSections(OutputSectionBase<ELFT> *A,
542                             OutputSectionBase<ELFT> *B) {
543   auto ItA = Config->OutputSections.find(A->getName());
544   auto ItEnd = std::end(Config->OutputSections);
545   if (ItA == ItEnd)
546     return compareOutputSections(A, B);
547   auto ItB = Config->OutputSections.find(B->getName());
548   if (ItB == ItEnd)
549     return compareOutputSections(A, B);
550 
551   return std::distance(ItA, ItB) > 0;
552 }
553 
554 // Create output section objects and add them to OutputSections.
555 template <class ELFT> void Writer<ELFT>::createSections() {
556   // .interp needs to be on the first page in the output file.
557   if (needsInterpSection())
558     OutputSections.push_back(Out<ELFT>::Interp);
559 
560   SmallDenseMap<SectionKey<ELFT::Is64Bits>, OutputSectionBase<ELFT> *> Map;
561 
562   std::vector<OutputSectionBase<ELFT> *> RegularSections;
563 
564   for (const std::unique_ptr<ObjectFile<ELFT>> &F : Symtab.getObjectFiles()) {
565     for (InputSectionBase<ELFT> *C : F->getSections()) {
566       if (isDiscarded(C))
567         continue;
568       const Elf_Shdr *H = C->getSectionHdr();
569       uintX_t OutFlags = H->sh_flags & ~SHF_GROUP;
570       // For SHF_MERGE we create different output sections for each sh_entsize.
571       // This makes each output section simple and keeps a single level
572       // mapping from input to output.
573       typename InputSectionBase<ELFT>::Kind K = C->SectionKind;
574       uintX_t EntSize = K != InputSectionBase<ELFT>::Merge ? 0 : H->sh_entsize;
575       uint32_t OutType = H->sh_type;
576       if (OutType == SHT_PROGBITS && C->getSectionName() == ".eh_frame" &&
577           Config->EMachine == EM_X86_64)
578         OutType = SHT_X86_64_UNWIND;
579       SectionKey<ELFT::Is64Bits> Key{getOutputSectionName(C->getSectionName()),
580                                      OutType, OutFlags, EntSize};
581       OutputSectionBase<ELFT> *&Sec = Map[Key];
582       if (!Sec) {
583         switch (K) {
584         case InputSectionBase<ELFT>::Regular:
585           Sec = new (SecAlloc.Allocate())
586               OutputSection<ELFT>(Key.Name, Key.Type, Key.Flags);
587           break;
588         case InputSectionBase<ELFT>::EHFrame:
589           Sec = new (EHSecAlloc.Allocate())
590               EHOutputSection<ELFT>(Key.Name, Key.Type, Key.Flags);
591           break;
592         case InputSectionBase<ELFT>::Merge:
593           Sec = new (MSecAlloc.Allocate())
594               MergeOutputSection<ELFT>(Key.Name, Key.Type, Key.Flags);
595           break;
596         }
597         OutputSections.push_back(Sec);
598         RegularSections.push_back(Sec);
599       }
600       switch (K) {
601       case InputSectionBase<ELFT>::Regular:
602         static_cast<OutputSection<ELFT> *>(Sec)
603             ->addSection(cast<InputSection<ELFT>>(C));
604         break;
605       case InputSectionBase<ELFT>::EHFrame:
606         static_cast<EHOutputSection<ELFT> *>(Sec)
607             ->addSection(cast<EHInputSection<ELFT>>(C));
608         break;
609       case InputSectionBase<ELFT>::Merge:
610         static_cast<MergeOutputSection<ELFT> *>(Sec)
611             ->addSection(cast<MergeInputSection<ELFT>>(C));
612         break;
613       }
614     }
615   }
616 
617   Out<ELFT>::Bss = static_cast<OutputSection<ELFT> *>(
618       Map[{".bss", SHT_NOBITS, SHF_ALLOC | SHF_WRITE, 0}]);
619 
620   Out<ELFT>::Dynamic->PreInitArraySec = Map.lookup(
621       {".preinit_array", SHT_PREINIT_ARRAY, SHF_WRITE | SHF_ALLOC, 0});
622   Out<ELFT>::Dynamic->InitArraySec =
623       Map.lookup({".init_array", SHT_INIT_ARRAY, SHF_WRITE | SHF_ALLOC, 0});
624   Out<ELFT>::Dynamic->FiniArraySec =
625       Map.lookup({".fini_array", SHT_FINI_ARRAY, SHF_WRITE | SHF_ALLOC, 0});
626 
627   auto AddStartEnd = [&](StringRef Start, StringRef End,
628                          OutputSectionBase<ELFT> *OS) {
629     if (OS) {
630       Symtab.addSyntheticSym(Start, *OS, 0);
631       Symtab.addSyntheticSym(End, *OS, OS->getSize());
632     } else {
633       Symtab.addIgnoredSym(Start);
634       Symtab.addIgnoredSym(End);
635     }
636   };
637 
638   AddStartEnd("__preinit_array_start", "__preinit_array_end",
639               Out<ELFT>::Dynamic->PreInitArraySec);
640   AddStartEnd("__init_array_start", "__init_array_end",
641               Out<ELFT>::Dynamic->InitArraySec);
642   AddStartEnd("__fini_array_start", "__fini_array_end",
643               Out<ELFT>::Dynamic->FiniArraySec);
644 
645   for (OutputSectionBase<ELFT> *Sec : RegularSections)
646     addStartStopSymbols(Sec);
647 
648   // __tls_get_addr is defined by the dynamic linker for dynamic ELFs. For
649   // static linking the linker is required to optimize away any references to
650   // __tls_get_addr, so it's not defined anywhere. Create a hidden definition
651   // to avoid the undefined symbol error.
652   if (!isOutputDynamic())
653     Symtab.addIgnoredSym("__tls_get_addr");
654 
655   // If the "_end" symbol is referenced, it is expected to point to the address
656   // right after the data segment. Usually, this symbol points to the end
657   // of .bss section or to the end of .data section if .bss section is absent.
658   // The order of the sections can be affected by linker script,
659   // so it is hard to predict which section will be the last one.
660   // So, if this symbol is referenced, we just add the placeholder here
661   // and update its value later.
662   if (Symtab.find("_end"))
663     Symtab.addAbsoluteSym("_end", DefinedAbsolute<ELFT>::End);
664 
665   // If there is an undefined symbol "end", we should initialize it
666   // with the same value as "_end". In any other case it should stay intact,
667   // because it is an allowable name for a user symbol.
668   if (SymbolBody *B = Symtab.find("end"))
669     if (B->isUndefined())
670       Symtab.addAbsoluteSym("end", DefinedAbsolute<ELFT>::End);
671 
672   // Scan relocations. This must be done after every symbol is declared so that
673   // we can correctly decide if a dynamic relocation is needed.
674   for (const std::unique_ptr<ObjectFile<ELFT>> &F : Symtab.getObjectFiles()) {
675     for (InputSectionBase<ELFT> *C : F->getSections()) {
676       if (isDiscarded(C))
677         continue;
678       if (auto *S = dyn_cast<InputSection<ELFT>>(C))
679         scanRelocs(*S);
680       else if (auto *S = dyn_cast<EHInputSection<ELFT>>(C))
681         if (S->RelocSection)
682           scanRelocs(*S, *S->RelocSection);
683     }
684   }
685 
686   std::vector<DefinedCommon<ELFT> *> CommonSymbols;
687   std::vector<SharedSymbol<ELFT> *> SharedCopySymbols;
688   for (auto &P : Symtab.getSymbols()) {
689     SymbolBody *Body = P.second->Body;
690     if (auto *U = dyn_cast<Undefined<ELFT>>(Body))
691       if (!U->isWeak() && !U->canKeepUndefined())
692         reportUndefined<ELFT>(Symtab, *Body);
693 
694     if (auto *C = dyn_cast<DefinedCommon<ELFT>>(Body))
695       CommonSymbols.push_back(C);
696     if (auto *SC = dyn_cast<SharedSymbol<ELFT>>(Body))
697       if (SC->needsCopy())
698         SharedCopySymbols.push_back(SC);
699 
700     if (!includeInSymtab<ELFT>(*Body))
701       continue;
702     if (Out<ELFT>::SymTab)
703       Out<ELFT>::SymTab->addSymbol(Body);
704 
705     if (isOutputDynamic() && includeInDynamicSymtab(*Body))
706       Out<ELFT>::DynSymTab->addSymbol(Body);
707   }
708   addCommonSymbols(CommonSymbols);
709   addSharedCopySymbols(SharedCopySymbols);
710 
711   // This order is not the same as the final output order
712   // because we sort the sections using their attributes below.
713   if (Out<ELFT>::SymTab)
714     OutputSections.push_back(Out<ELFT>::SymTab);
715   OutputSections.push_back(Out<ELFT>::ShStrTab);
716   if (Out<ELFT>::StrTab)
717     OutputSections.push_back(Out<ELFT>::StrTab);
718   if (isOutputDynamic()) {
719     OutputSections.push_back(Out<ELFT>::DynSymTab);
720     if (Out<ELFT>::GnuHashTab)
721       OutputSections.push_back(Out<ELFT>::GnuHashTab);
722     if (Out<ELFT>::HashTab)
723       OutputSections.push_back(Out<ELFT>::HashTab);
724     OutputSections.push_back(Out<ELFT>::Dynamic);
725     OutputSections.push_back(Out<ELFT>::DynStrTab);
726     if (Out<ELFT>::RelaDyn->hasRelocs())
727       OutputSections.push_back(Out<ELFT>::RelaDyn);
728     if (Out<ELFT>::RelaPlt && Out<ELFT>::RelaPlt->hasRelocs())
729       OutputSections.push_back(Out<ELFT>::RelaPlt);
730     // This is a MIPS specific section to hold a space within the data segment
731     // of executable file which is pointed to by the DT_MIPS_RLD_MAP entry.
732     // See "Dynamic section" in Chapter 5 in the following document:
733     // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
734     if (Config->EMachine == EM_MIPS && !Config->Shared) {
735       Out<ELFT>::MipsRldMap = new (SecAlloc.Allocate())
736           OutputSection<ELFT>(".rld_map", SHT_PROGBITS, SHF_ALLOC | SHF_WRITE);
737       Out<ELFT>::MipsRldMap->setSize(ELFT::Is64Bits ? 8 : 4);
738       Out<ELFT>::MipsRldMap->updateAlign(ELFT::Is64Bits ? 8 : 4);
739       OutputSections.push_back(Out<ELFT>::MipsRldMap);
740     }
741   }
742 
743   // We add the .got section to the result for dynamic MIPS target because
744   // its address and properties are mentioned in the .dynamic section.
745   if (!Out<ELFT>::Got->empty() ||
746       (isOutputDynamic() && Config->EMachine == EM_MIPS))
747     OutputSections.push_back(Out<ELFT>::Got);
748   if (Out<ELFT>::GotPlt && !Out<ELFT>::GotPlt->empty())
749     OutputSections.push_back(Out<ELFT>::GotPlt);
750   if (!Out<ELFT>::Plt->empty())
751     OutputSections.push_back(Out<ELFT>::Plt);
752 
753   std::stable_sort(OutputSections.begin(), OutputSections.end(),
754                    compareSections<ELFT>);
755 
756   for (unsigned I = 0, N = OutputSections.size(); I < N; ++I) {
757     OutputSections[I]->SectionIndex = I + 1;
758     HasRelro |= (Config->ZRelro && isRelroSection(OutputSections[I]));
759   }
760 
761   for (OutputSectionBase<ELFT> *Sec : OutputSections)
762     Out<ELFT>::ShStrTab->add(Sec->getName());
763 
764   // Finalizers fix each section's size.
765   // .dynamic section's finalizer may add strings to .dynstr,
766   // so finalize that early.
767   // Likewise, .dynsym is finalized early since that may fill up .gnu.hash.
768   Out<ELFT>::Dynamic->finalize();
769   if (isOutputDynamic())
770     Out<ELFT>::DynSymTab->finalize();
771 
772   // Fill other section headers.
773   for (OutputSectionBase<ELFT> *Sec : OutputSections)
774     Sec->finalize();
775 
776   // If we have a .opd section (used under PPC64 for function descriptors),
777   // store a pointer to it here so that we can use it later when processing
778   // relocations.
779   Out<ELFT>::Opd = Map.lookup({".opd", SHT_PROGBITS, SHF_WRITE | SHF_ALLOC, 0});
780 }
781 
782 static bool isAlpha(char C) {
783   return ('a' <= C && C <= 'z') || ('A' <= C && C <= 'Z') || C == '_';
784 }
785 
786 static bool isAlnum(char C) { return isAlpha(C) || ('0' <= C && C <= '9'); }
787 
788 // Returns true if S is valid as a C language identifier.
789 static bool isValidCIdentifier(StringRef S) {
790   if (S.empty() || !isAlpha(S[0]))
791     return false;
792   return std::all_of(S.begin() + 1, S.end(), isAlnum);
793 }
794 
795 // If a section name is valid as a C identifier (which is rare because of
796 // the leading '.'), linkers are expected to define __start_<secname> and
797 // __stop_<secname> symbols. They are at beginning and end of the section,
798 // respectively. This is not requested by the ELF standard, but GNU ld and
799 // gold provide the feature, and used by many programs.
800 template <class ELFT>
801 void Writer<ELFT>::addStartStopSymbols(OutputSectionBase<ELFT> *Sec) {
802   StringRef S = Sec->getName();
803   if (!isValidCIdentifier(S))
804     return;
805   StringSaver Saver(Alloc);
806   StringRef Start = Saver.save("__start_" + S);
807   StringRef Stop = Saver.save("__stop_" + S);
808   if (Symtab.isUndefined(Start))
809     Symtab.addSyntheticSym(Start, *Sec, 0);
810   if (Symtab.isUndefined(Stop))
811     Symtab.addSyntheticSym(Stop, *Sec, Sec->getSize());
812 }
813 
814 template <class ELFT> static bool needsPhdr(OutputSectionBase<ELFT> *Sec) {
815   return Sec->getFlags() & SHF_ALLOC;
816 }
817 
818 static uint32_t toPhdrFlags(uint64_t Flags) {
819   uint32_t Ret = PF_R;
820   if (Flags & SHF_WRITE)
821     Ret |= PF_W;
822   if (Flags & SHF_EXECINSTR)
823     Ret |= PF_X;
824   return Ret;
825 }
826 
827 template <class ELFT>
828 void Writer<ELFT>::updateRelro(Elf_Phdr *Cur, Elf_Phdr *GnuRelroPhdr,
829                                OutputSectionBase<ELFT> *Sec, uintX_t VA) {
830   if (!Config->ZRelro || !(Cur->p_flags & PF_W) || !isRelroSection(Sec))
831     return;
832   if (!GnuRelroPhdr->p_type)
833     setPhdr(GnuRelroPhdr, PT_GNU_RELRO, PF_R, Cur->p_offset, Cur->p_vaddr,
834             VA - Cur->p_vaddr, 1 /*p_align*/);
835   GnuRelroPhdr->p_filesz = VA - Cur->p_vaddr;
836   GnuRelroPhdr->p_memsz = VA - Cur->p_vaddr;
837 }
838 
839 // Visits all sections to create PHDRs and to assign incremental,
840 // non-overlapping addresses to output sections.
841 template <class ELFT> void Writer<ELFT>::assignAddresses() {
842   uintX_t VA = Target->getVAStart() + sizeof(Elf_Ehdr);
843   uintX_t FileOff = sizeof(Elf_Ehdr);
844 
845   // Calculate and reserve the space for the program header first so that
846   // the first section can start right after the program header.
847   Phdrs.resize(getPhdrsNum());
848   size_t PhdrSize = sizeof(Elf_Phdr) * Phdrs.size();
849 
850   // The first phdr entry is PT_PHDR which describes the program header itself.
851   setPhdr(&Phdrs[0], PT_PHDR, PF_R, FileOff, VA, PhdrSize, /*Align=*/8);
852   FileOff += PhdrSize;
853   VA += PhdrSize;
854 
855   // PT_INTERP must be the second entry if exists.
856   int PhdrIdx = 0;
857   Elf_Phdr *Interp = nullptr;
858   if (needsInterpSection())
859     Interp = &Phdrs[++PhdrIdx];
860 
861   // Add the first PT_LOAD segment for regular output sections.
862   setPhdr(&Phdrs[++PhdrIdx], PT_LOAD, PF_R, 0, Target->getVAStart(), FileOff,
863           Target->getPageSize());
864 
865   Elf_Phdr GnuRelroPhdr = {};
866   Elf_Phdr TlsPhdr{};
867   uintX_t ThreadBSSOffset = 0;
868   // Create phdrs as we assign VAs and file offsets to all output sections.
869   for (OutputSectionBase<ELFT> *Sec : OutputSections) {
870     if (needsPhdr<ELFT>(Sec)) {
871       uintX_t Flags = toPhdrFlags(Sec->getFlags());
872       if (Phdrs[PhdrIdx].p_flags != Flags) {
873         // Flags changed. Create a new PT_LOAD.
874         VA = RoundUpToAlignment(VA, Target->getPageSize());
875         FileOff = RoundUpToAlignment(FileOff, Target->getPageSize());
876         Elf_Phdr *PH = &Phdrs[++PhdrIdx];
877         setPhdr(PH, PT_LOAD, Flags, FileOff, VA, 0, Target->getPageSize());
878       }
879 
880       if (Sec->getFlags() & SHF_TLS) {
881         if (!TlsPhdr.p_vaddr)
882           setPhdr(&TlsPhdr, PT_TLS, PF_R, FileOff, VA, 0, Sec->getAlign());
883         if (Sec->getType() != SHT_NOBITS)
884           VA = RoundUpToAlignment(VA, Sec->getAlign());
885         uintX_t TVA = RoundUpToAlignment(VA + ThreadBSSOffset, Sec->getAlign());
886         Sec->setVA(TVA);
887         TlsPhdr.p_memsz += Sec->getSize();
888         if (Sec->getType() == SHT_NOBITS) {
889           ThreadBSSOffset = TVA - VA + Sec->getSize();
890         } else {
891           TlsPhdr.p_filesz += Sec->getSize();
892           VA += Sec->getSize();
893         }
894         TlsPhdr.p_align = std::max<uintX_t>(TlsPhdr.p_align, Sec->getAlign());
895       } else {
896         VA = RoundUpToAlignment(VA, Sec->getAlign());
897         Sec->setVA(VA);
898         VA += Sec->getSize();
899         updateRelro(&Phdrs[PhdrIdx], &GnuRelroPhdr, Sec, VA);
900       }
901     }
902 
903     FileOff = RoundUpToAlignment(FileOff, Sec->getAlign());
904     Sec->setFileOffset(FileOff);
905     if (Sec->getType() != SHT_NOBITS)
906       FileOff += Sec->getSize();
907     if (needsPhdr<ELFT>(Sec)) {
908       Elf_Phdr *Cur = &Phdrs[PhdrIdx];
909       Cur->p_filesz = FileOff - Cur->p_offset;
910       Cur->p_memsz = VA - Cur->p_vaddr;
911     }
912   }
913 
914   if (TlsPhdr.p_vaddr) {
915     // The TLS pointer goes after PT_TLS. At least glibc will align it,
916     // so round up the size to make sure the offsets are correct.
917     TlsPhdr.p_memsz = RoundUpToAlignment(TlsPhdr.p_memsz, TlsPhdr.p_align);
918     Phdrs[++PhdrIdx] = TlsPhdr;
919     Out<ELFT>::TlsPhdr = &Phdrs[PhdrIdx];
920   }
921 
922   // Add an entry for .dynamic.
923   if (isOutputDynamic()) {
924     Elf_Phdr *PH = &Phdrs[++PhdrIdx];
925     PH->p_type = PT_DYNAMIC;
926     copyPhdr(PH, Out<ELFT>::Dynamic);
927   }
928 
929   if (HasRelro) {
930     Elf_Phdr *PH = &Phdrs[++PhdrIdx];
931     *PH = GnuRelroPhdr;
932   }
933 
934   // PT_GNU_STACK is a special section to tell the loader to make the
935   // pages for the stack non-executable.
936   Elf_Phdr *PH = &Phdrs[++PhdrIdx];
937   PH->p_type = PT_GNU_STACK;
938   if (Config->ZExecStack)
939     PH->p_flags = PF_R | PF_W | PF_X;
940   else
941     PH->p_flags = PF_R | PF_W;
942 
943   // Fix up PT_INTERP as we now know the address of .interp section.
944   if (Interp) {
945     Interp->p_type = PT_INTERP;
946     copyPhdr(Interp, Out<ELFT>::Interp);
947   }
948 
949   // Add space for section headers.
950   SectionHeaderOff = RoundUpToAlignment(FileOff, ELFT::Is64Bits ? 8 : 4);
951   FileSize = SectionHeaderOff + getNumSections() * sizeof(Elf_Shdr);
952 
953   // Update "_end" and "end" symbols so that they
954   // point to the end of the data segment.
955   DefinedAbsolute<ELFT>::End.st_value = VA;
956 
957   // Update MIPS _gp absolute symbol so that it points to the static data.
958   if (Config->EMachine == EM_MIPS)
959     DefinedAbsolute<ELFT>::MipsGp.st_value = getMipsGpAddr<ELFT>();
960 }
961 
962 // Returns the number of PHDR entries.
963 template <class ELFT> int Writer<ELFT>::getPhdrsNum() const {
964   bool Tls = false;
965   int I = 3; // 3 for PT_PHDR, first PT_LOAD and PT_GNU_STACK
966   if (needsInterpSection())
967     ++I;
968   if (isOutputDynamic())
969     ++I;
970   uintX_t Last = PF_R;
971   for (OutputSectionBase<ELFT> *Sec : OutputSections) {
972     if (!needsPhdr<ELFT>(Sec))
973       continue;
974     if (Sec->getFlags() & SHF_TLS)
975       Tls = true;
976     uintX_t Flags = toPhdrFlags(Sec->getFlags());
977     if (Last != Flags) {
978       Last = Flags;
979       ++I;
980     }
981   }
982   if (Tls)
983     ++I;
984   if (HasRelro)
985     ++I;
986   return I;
987 }
988 
989 template <class ELFT> void Writer<ELFT>::writeHeader() {
990   uint8_t *Buf = Buffer->getBufferStart();
991   memcpy(Buf, "\177ELF", 4);
992 
993   // Write the ELF header.
994   auto *EHdr = reinterpret_cast<Elf_Ehdr *>(Buf);
995   EHdr->e_ident[EI_CLASS] = ELFT::Is64Bits ? ELFCLASS64 : ELFCLASS32;
996   EHdr->e_ident[EI_DATA] = ELFT::TargetEndianness == llvm::support::little
997                                ? ELFDATA2LSB
998                                : ELFDATA2MSB;
999   EHdr->e_ident[EI_VERSION] = EV_CURRENT;
1000 
1001   auto &FirstObj = cast<ELFFileBase<ELFT>>(*Config->FirstElf);
1002   EHdr->e_ident[EI_OSABI] = FirstObj.getOSABI();
1003 
1004   EHdr->e_type = Config->Shared ? ET_DYN : ET_EXEC;
1005   EHdr->e_machine = FirstObj.getEMachine();
1006   EHdr->e_version = EV_CURRENT;
1007   EHdr->e_entry = getEntryAddr();
1008   EHdr->e_phoff = sizeof(Elf_Ehdr);
1009   EHdr->e_shoff = SectionHeaderOff;
1010   EHdr->e_ehsize = sizeof(Elf_Ehdr);
1011   EHdr->e_phentsize = sizeof(Elf_Phdr);
1012   EHdr->e_phnum = Phdrs.size();
1013   EHdr->e_shentsize = sizeof(Elf_Shdr);
1014   EHdr->e_shnum = getNumSections();
1015   EHdr->e_shstrndx = Out<ELFT>::ShStrTab->SectionIndex;
1016 
1017   // Write the program header table.
1018   memcpy(Buf + EHdr->e_phoff, &Phdrs[0], Phdrs.size() * sizeof(Phdrs[0]));
1019 
1020   // Write the section header table. Note that the first table entry is null.
1021   auto SHdrs = reinterpret_cast<Elf_Shdr *>(Buf + EHdr->e_shoff);
1022   for (OutputSectionBase<ELFT> *Sec : OutputSections)
1023     Sec->writeHeaderTo(++SHdrs);
1024 }
1025 
1026 template <class ELFT> void Writer<ELFT>::openFile(StringRef Path) {
1027   ErrorOr<std::unique_ptr<FileOutputBuffer>> BufferOrErr =
1028       FileOutputBuffer::create(Path, FileSize, FileOutputBuffer::F_executable);
1029   error(BufferOrErr, Twine("failed to open ") + Path);
1030   Buffer = std::move(*BufferOrErr);
1031 }
1032 
1033 // Write section contents to a mmap'ed file.
1034 template <class ELFT> void Writer<ELFT>::writeSections() {
1035   uint8_t *Buf = Buffer->getBufferStart();
1036 
1037   // PPC64 needs to process relocations in the .opd section before processing
1038   // relocations in code-containing sections.
1039   if (OutputSectionBase<ELFT> *Sec = Out<ELFT>::Opd) {
1040     Out<ELFT>::OpdBuf = Buf + Sec->getFileOff();
1041     Sec->writeTo(Buf + Sec->getFileOff());
1042   }
1043 
1044   for (OutputSectionBase<ELFT> *Sec : OutputSections)
1045     if (Sec != Out<ELFT>::Opd)
1046       Sec->writeTo(Buf + Sec->getFileOff());
1047 }
1048 
1049 template <class ELFT>
1050 typename ELFFile<ELFT>::uintX_t Writer<ELFT>::getEntryAddr() const {
1051   if (Config->EntrySym) {
1052     if (auto *E = dyn_cast<ELFSymbolBody<ELFT>>(Config->EntrySym->repl()))
1053       return getSymVA<ELFT>(*E);
1054     return 0;
1055   }
1056   if (Config->EntryAddr != uint64_t(-1))
1057     return Config->EntryAddr;
1058   return 0;
1059 }
1060 
1061 template <class ELFT>
1062 void Writer<ELFT>::setPhdr(Elf_Phdr *PH, uint32_t Type, uint32_t Flags,
1063                            uintX_t FileOff, uintX_t VA, uintX_t Size,
1064                            uintX_t Align) {
1065   PH->p_type = Type;
1066   PH->p_flags = Flags;
1067   PH->p_offset = FileOff;
1068   PH->p_vaddr = VA;
1069   PH->p_paddr = VA;
1070   PH->p_filesz = Size;
1071   PH->p_memsz = Size;
1072   PH->p_align = Align;
1073 }
1074 
1075 template <class ELFT>
1076 void Writer<ELFT>::copyPhdr(Elf_Phdr *PH, OutputSectionBase<ELFT> *From) {
1077   PH->p_flags = toPhdrFlags(From->getFlags());
1078   PH->p_offset = From->getFileOff();
1079   PH->p_vaddr = From->getVA();
1080   PH->p_paddr = From->getVA();
1081   PH->p_filesz = From->getSize();
1082   PH->p_memsz = From->getSize();
1083   PH->p_align = From->getAlign();
1084 }
1085 
1086 template <class ELFT> void Writer<ELFT>::buildSectionMap() {
1087   for (const std::pair<StringRef, std::vector<StringRef>> &OutSec :
1088        Config->OutputSections)
1089     for (StringRef Name : OutSec.second)
1090       InputToOutputSection[Name] = OutSec.first;
1091 }
1092 
1093 template void lld::elf2::writeResult<ELF32LE>(SymbolTable<ELF32LE> *Symtab);
1094 template void lld::elf2::writeResult<ELF32BE>(SymbolTable<ELF32BE> *Symtab);
1095 template void lld::elf2::writeResult<ELF64LE>(SymbolTable<ELF64LE> *Symtab);
1096 template void lld::elf2::writeResult<ELF64BE>(SymbolTable<ELF64BE> *Symtab);
1097