1 //===- OutputSections.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 "OutputSections.h"
11 #include "Config.h"
12 #include "SymbolTable.h"
13 #include "Target.h"
14 #include "llvm/Support/Dwarf.h"
15 #include "llvm/Support/MathExtras.h"
16 #include <map>
17 
18 using namespace llvm;
19 using namespace llvm::object;
20 using namespace llvm::support::endian;
21 using namespace llvm::ELF;
22 
23 using namespace lld;
24 using namespace lld::elf2;
25 
26 template <class ELFT>
27 OutputSectionBase<ELFT>::OutputSectionBase(StringRef Name, uint32_t Type,
28                                            uintX_t Flags)
29     : Name(Name) {
30   memset(&Header, 0, sizeof(Elf_Shdr));
31   Header.sh_type = Type;
32   Header.sh_flags = Flags;
33 }
34 
35 template <class ELFT>
36 GotPltSection<ELFT>::GotPltSection()
37     : OutputSectionBase<ELFT>(".got.plt", SHT_PROGBITS, SHF_ALLOC | SHF_WRITE) {
38   this->Header.sh_addralign = sizeof(uintX_t);
39 }
40 
41 template <class ELFT> void GotPltSection<ELFT>::addEntry(SymbolBody *Sym) {
42   Sym->GotPltIndex = Target->getGotPltHeaderEntriesNum() + Entries.size();
43   Entries.push_back(Sym);
44 }
45 
46 template <class ELFT> bool GotPltSection<ELFT>::empty() const {
47   return Entries.empty();
48 }
49 
50 template <class ELFT>
51 typename GotPltSection<ELFT>::uintX_t
52 GotPltSection<ELFT>::getEntryAddr(const SymbolBody &B) const {
53   return this->getVA() + B.GotPltIndex * sizeof(uintX_t);
54 }
55 
56 template <class ELFT> void GotPltSection<ELFT>::finalize() {
57   this->Header.sh_size =
58       (Target->getGotPltHeaderEntriesNum() + Entries.size()) * sizeof(uintX_t);
59 }
60 
61 template <class ELFT> void GotPltSection<ELFT>::writeTo(uint8_t *Buf) {
62   Target->writeGotPltHeaderEntries(Buf);
63   Buf += Target->getGotPltHeaderEntriesNum() * sizeof(uintX_t);
64   for (const SymbolBody *B : Entries) {
65     Target->writeGotPltEntry(Buf, Out<ELFT>::Plt->getEntryAddr(*B));
66     Buf += sizeof(uintX_t);
67   }
68 }
69 
70 template <class ELFT>
71 GotSection<ELFT>::GotSection()
72     : OutputSectionBase<ELFT>(".got", SHT_PROGBITS, SHF_ALLOC | SHF_WRITE) {
73   if (Config->EMachine == EM_MIPS)
74     this->Header.sh_flags |= SHF_MIPS_GPREL;
75   this->Header.sh_addralign = sizeof(uintX_t);
76 }
77 
78 template <class ELFT> void GotSection<ELFT>::addEntry(SymbolBody *Sym) {
79   Sym->GotIndex = Entries.size();
80   Entries.push_back(Sym);
81 }
82 
83 template <class ELFT> void GotSection<ELFT>::addMipsLocalEntry() {
84   ++MipsLocalEntries;
85 }
86 
87 template <class ELFT> bool GotSection<ELFT>::addDynTlsEntry(SymbolBody *Sym) {
88   if (Sym->hasGlobalDynIndex())
89     return false;
90   Sym->GlobalDynIndex = Target->getGotHeaderEntriesNum() + Entries.size();
91   // Global Dynamic TLS entries take two GOT slots.
92   Entries.push_back(Sym);
93   Entries.push_back(nullptr);
94   return true;
95 }
96 
97 template <class ELFT> bool GotSection<ELFT>::addCurrentModuleTlsIndex() {
98   if (LocalTlsIndexOff != uint32_t(-1))
99     return false;
100   Entries.push_back(nullptr);
101   Entries.push_back(nullptr);
102   LocalTlsIndexOff = (Entries.size() - 2) * sizeof(uintX_t);
103   return true;
104 }
105 
106 template <class ELFT>
107 typename GotSection<ELFT>::uintX_t
108 GotSection<ELFT>::getEntryAddr(const SymbolBody &B) const {
109   return this->getVA() +
110          (Target->getGotHeaderEntriesNum() + MipsLocalEntries + B.GotIndex) *
111              sizeof(uintX_t);
112 }
113 
114 template <class ELFT>
115 typename GotSection<ELFT>::uintX_t
116 GotSection<ELFT>::getMipsLocalFullAddr(const SymbolBody &B) {
117   return getMipsLocalEntryAddr(getSymVA<ELFT>(B));
118 }
119 
120 template <class ELFT>
121 typename GotSection<ELFT>::uintX_t
122 GotSection<ELFT>::getMipsLocalPageAddr(uintX_t EntryValue) {
123   // Initialize the entry by the %hi(EntryValue) expression
124   // but without right-shifting.
125   return getMipsLocalEntryAddr((EntryValue + 0x8000) & ~0xffff);
126 }
127 
128 template <class ELFT>
129 typename GotSection<ELFT>::uintX_t
130 GotSection<ELFT>::getMipsLocalEntryAddr(uintX_t EntryValue) {
131   size_t NewIndex = Target->getGotHeaderEntriesNum() + MipsLocalGotPos.size();
132   auto P = MipsLocalGotPos.insert(std::make_pair(EntryValue, NewIndex));
133   assert(!P.second || MipsLocalGotPos.size() <= MipsLocalEntries);
134   return this->getVA() + P.first->second * sizeof(uintX_t);
135 }
136 
137 template <class ELFT>
138 typename GotSection<ELFT>::uintX_t
139 GotSection<ELFT>::getGlobalDynAddr(const SymbolBody &B) const {
140   return this->getVA() + B.GlobalDynIndex * sizeof(uintX_t);
141 }
142 
143 template <class ELFT>
144 const SymbolBody *GotSection<ELFT>::getMipsFirstGlobalEntry() const {
145   return Entries.empty() ? nullptr : Entries.front();
146 }
147 
148 template <class ELFT>
149 unsigned GotSection<ELFT>::getMipsLocalEntriesNum() const {
150   return Target->getGotHeaderEntriesNum() + MipsLocalEntries;
151 }
152 
153 template <class ELFT> void GotSection<ELFT>::finalize() {
154   this->Header.sh_size =
155       (Target->getGotHeaderEntriesNum() + MipsLocalEntries + Entries.size()) *
156       sizeof(uintX_t);
157 }
158 
159 template <class ELFT> void GotSection<ELFT>::writeTo(uint8_t *Buf) {
160   Target->writeGotHeaderEntries(Buf);
161   for (const auto &L : MipsLocalGotPos) {
162     uint8_t *Entry = Buf + L.second * sizeof(uintX_t);
163     write<uintX_t, ELFT::TargetEndianness, sizeof(uintX_t)>(Entry, L.first);
164   }
165   Buf += Target->getGotHeaderEntriesNum() * sizeof(uintX_t);
166   Buf += MipsLocalEntries * sizeof(uintX_t);
167   for (const SymbolBody *B : Entries) {
168     uint8_t *Entry = Buf;
169     Buf += sizeof(uintX_t);
170     if (!B)
171       continue;
172     // MIPS has special rules to fill up GOT entries.
173     // See "Global Offset Table" in Chapter 5 in the following document
174     // for detailed description:
175     // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
176     // As the first approach, we can just store addresses for all symbols.
177     if (Config->EMachine != EM_MIPS && canBePreempted(B, false))
178       continue; // The dynamic linker will take care of it.
179     uintX_t VA = getSymVA<ELFT>(*B);
180     write<uintX_t, ELFT::TargetEndianness, sizeof(uintX_t)>(Entry, VA);
181   }
182 }
183 
184 template <class ELFT>
185 PltSection<ELFT>::PltSection()
186     : OutputSectionBase<ELFT>(".plt", SHT_PROGBITS, SHF_ALLOC | SHF_EXECINSTR) {
187   this->Header.sh_addralign = 16;
188 }
189 
190 template <class ELFT> void PltSection<ELFT>::writeTo(uint8_t *Buf) {
191   size_t Off = 0;
192   bool LazyReloc = Target->supportsLazyRelocations();
193   if (LazyReloc) {
194     // First write PLT[0] entry which is special.
195     Target->writePltZeroEntry(Buf, Out<ELFT>::GotPlt->getVA(), this->getVA());
196     Off += Target->getPltZeroEntrySize();
197   }
198   for (auto &I : Entries) {
199     const SymbolBody *E = I.first;
200     unsigned RelOff = I.second;
201     uint64_t GotVA =
202         LazyReloc ? Out<ELFT>::GotPlt->getVA() : Out<ELFT>::Got->getVA();
203     uint64_t GotE = LazyReloc ? Out<ELFT>::GotPlt->getEntryAddr(*E)
204                               : Out<ELFT>::Got->getEntryAddr(*E);
205     uint64_t Plt = this->getVA() + Off;
206     Target->writePltEntry(Buf + Off, GotVA, GotE, Plt, E->PltIndex, RelOff);
207     Off += Target->getPltEntrySize();
208   }
209 }
210 
211 template <class ELFT> void PltSection<ELFT>::addEntry(SymbolBody *Sym) {
212   Sym->PltIndex = Entries.size();
213   unsigned RelOff = Target->supportsLazyRelocations()
214                         ? Out<ELFT>::RelaPlt->getRelocOffset()
215                         : Out<ELFT>::RelaDyn->getRelocOffset();
216   Entries.push_back(std::make_pair(Sym, RelOff));
217 }
218 
219 template <class ELFT>
220 typename PltSection<ELFT>::uintX_t
221 PltSection<ELFT>::getEntryAddr(const SymbolBody &B) const {
222   return this->getVA() + Target->getPltZeroEntrySize() +
223          B.PltIndex * Target->getPltEntrySize();
224 }
225 
226 template <class ELFT> void PltSection<ELFT>::finalize() {
227   this->Header.sh_size = Target->getPltZeroEntrySize() +
228                          Entries.size() * Target->getPltEntrySize();
229 }
230 
231 template <class ELFT>
232 RelocationSection<ELFT>::RelocationSection(StringRef Name, bool IsRela)
233     : OutputSectionBase<ELFT>(Name, IsRela ? SHT_RELA : SHT_REL, SHF_ALLOC),
234       IsRela(IsRela) {
235   this->Header.sh_entsize = IsRela ? sizeof(Elf_Rela) : sizeof(Elf_Rel);
236   this->Header.sh_addralign = ELFT::Is64Bits ? 8 : 4;
237 }
238 
239 // Applies corresponding symbol and type for dynamic tls relocation.
240 // Returns true if relocation was handled.
241 template <class ELFT>
242 bool RelocationSection<ELFT>::applyTlsDynamicReloc(SymbolBody *Body,
243                                                    uint32_t Type, Elf_Rel *P,
244                                                    Elf_Rel *N) {
245   if (Target->isTlsLocalDynamicReloc(Type)) {
246     P->setSymbolAndType(0, Target->getTlsModuleIndexReloc(), Config->Mips64EL);
247     P->r_offset = Out<ELFT>::Got->getLocalTlsIndexVA();
248     return true;
249   }
250 
251   if (!Body || !Target->isTlsGlobalDynamicReloc(Type))
252     return false;
253 
254   if (Target->isTlsOptimized(Type, Body)) {
255     P->setSymbolAndType(Body->DynamicSymbolTableIndex,
256                         Target->getTlsGotReloc(), Config->Mips64EL);
257     P->r_offset = Out<ELFT>::Got->getEntryAddr(*Body);
258     return true;
259   }
260 
261   P->setSymbolAndType(Body->DynamicSymbolTableIndex,
262                       Target->getTlsModuleIndexReloc(), Config->Mips64EL);
263   P->r_offset = Out<ELFT>::Got->getGlobalDynAddr(*Body);
264   N->setSymbolAndType(Body->DynamicSymbolTableIndex,
265                       Target->getTlsOffsetReloc(), Config->Mips64EL);
266   N->r_offset = Out<ELFT>::Got->getGlobalDynAddr(*Body) + sizeof(uintX_t);
267   return true;
268 }
269 
270 template <class ELFT> void RelocationSection<ELFT>::writeTo(uint8_t *Buf) {
271   for (const DynamicReloc<ELFT> &Rel : Relocs) {
272     auto *P = reinterpret_cast<Elf_Rel *>(Buf);
273     Buf += IsRela ? sizeof(Elf_Rela) : sizeof(Elf_Rel);
274 
275     // Skip placeholder for global dynamic TLS relocation pair. It was already
276     // handled by the previous relocation.
277     if (!Rel.C)
278       continue;
279 
280     InputSectionBase<ELFT> &C = *Rel.C;
281     const Elf_Rel &RI = *Rel.RI;
282     uint32_t SymIndex = RI.getSymbol(Config->Mips64EL);
283     const ObjectFile<ELFT> &File = *C.getFile();
284     SymbolBody *Body = File.getSymbolBody(SymIndex);
285     if (Body)
286       Body = Body->repl();
287 
288     uint32_t Type = RI.getType(Config->Mips64EL);
289     if (applyTlsDynamicReloc(Body, Type, P, reinterpret_cast<Elf_Rel *>(Buf)))
290       continue;
291 
292     // Writer::scanRelocs creates a RELATIVE reloc for some type of TLS reloc.
293     // We want to write it down as is.
294     if (Type == Target->getRelativeReloc()) {
295       P->setSymbolAndType(0, Type, Config->Mips64EL);
296       P->r_offset = C.getOffset(RI.r_offset) + C.OutSec->getVA();
297       continue;
298     }
299 
300     // Emit a copy relocation.
301     auto *SS = dyn_cast_or_null<SharedSymbol<ELFT>>(Body);
302     if (SS && SS->NeedsCopy) {
303       P->setSymbolAndType(Body->DynamicSymbolTableIndex, Target->getCopyReloc(),
304                           Config->Mips64EL);
305       P->r_offset = Out<ELFT>::Bss->getVA() + SS->OffsetInBss;
306       continue;
307     }
308 
309     bool NeedsGot = Body && Target->relocNeedsGot(Type, *Body);
310     bool CBP = canBePreempted(Body, NeedsGot);
311 
312     // For a symbol with STT_GNU_IFUNC type, we always create a PLT and
313     // a GOT entry for the symbol, and emit an IRELATIVE reloc rather than
314     // the usual JUMP_SLOT reloc for the GOT entry. For the details, you
315     // want to read http://www.airs.com/blog/archives/403
316     if (!CBP && Body && isGnuIFunc<ELFT>(*Body)) {
317       P->setSymbolAndType(0, Target->getIRelativeReloc(), Config->Mips64EL);
318       if (Out<ELFT>::GotPlt)
319         P->r_offset = Out<ELFT>::GotPlt->getEntryAddr(*Body);
320       else
321         P->r_offset = Out<ELFT>::Got->getEntryAddr(*Body);
322       continue;
323     }
324 
325     bool LazyReloc = Body && Target->supportsLazyRelocations() &&
326                      Target->relocNeedsPlt(Type, *Body);
327 
328     unsigned Reloc;
329     if (!CBP)
330       Reloc = Target->getRelativeReloc();
331     else if (LazyReloc)
332       Reloc = Target->getPltReloc();
333     else if (NeedsGot)
334       Reloc = Body->isTls() ? Target->getTlsGotReloc() : Target->getGotReloc();
335     else
336       Reloc = Target->getDynReloc(Type);
337     P->setSymbolAndType(CBP ? Body->DynamicSymbolTableIndex : 0, Reloc,
338                         Config->Mips64EL);
339 
340     if (LazyReloc)
341       P->r_offset = Out<ELFT>::GotPlt->getEntryAddr(*Body);
342     else if (NeedsGot)
343       P->r_offset = Out<ELFT>::Got->getEntryAddr(*Body);
344     else
345       P->r_offset = C.getOffset(RI.r_offset) + C.OutSec->getVA();
346 
347     if (!IsRela)
348       continue;
349 
350     auto R = static_cast<const Elf_Rela &>(RI);
351     auto S = static_cast<Elf_Rela *>(P);
352     uintX_t A = NeedsGot ? 0 : R.r_addend;
353     if (CBP)
354       S->r_addend = A;
355     else if (Body)
356       S->r_addend = getSymVA<ELFT>(*Body) + A;
357     else
358       S->r_addend = getLocalRelTarget(File, R, A);
359   }
360 }
361 
362 template <class ELFT> unsigned RelocationSection<ELFT>::getRelocOffset() {
363   const unsigned EntrySize = IsRela ? sizeof(Elf_Rela) : sizeof(Elf_Rel);
364   return EntrySize * Relocs.size();
365 }
366 
367 template <class ELFT> void RelocationSection<ELFT>::finalize() {
368   this->Header.sh_link = Static ? Out<ELFT>::SymTab->SectionIndex
369                                 : Out<ELFT>::DynSymTab->SectionIndex;
370   this->Header.sh_size = Relocs.size() * this->Header.sh_entsize;
371 }
372 
373 template <class ELFT>
374 InterpSection<ELFT>::InterpSection()
375     : OutputSectionBase<ELFT>(".interp", SHT_PROGBITS, SHF_ALLOC) {
376   this->Header.sh_size = Config->DynamicLinker.size() + 1;
377   this->Header.sh_addralign = 1;
378 }
379 
380 template <class ELFT>
381 void OutputSectionBase<ELFT>::writeHeaderTo(Elf_Shdr *SHdr) {
382   Header.sh_name = Out<ELFT>::ShStrTab->addString(Name);
383   *SHdr = Header;
384 }
385 
386 template <class ELFT> void InterpSection<ELFT>::writeTo(uint8_t *Buf) {
387   memcpy(Buf, Config->DynamicLinker.data(), Config->DynamicLinker.size());
388 }
389 
390 template <class ELFT>
391 HashTableSection<ELFT>::HashTableSection()
392     : OutputSectionBase<ELFT>(".hash", SHT_HASH, SHF_ALLOC) {
393   this->Header.sh_entsize = sizeof(Elf_Word);
394   this->Header.sh_addralign = sizeof(Elf_Word);
395 }
396 
397 static uint32_t hashSysv(StringRef Name) {
398   uint32_t H = 0;
399   for (char C : Name) {
400     H = (H << 4) + C;
401     uint32_t G = H & 0xf0000000;
402     if (G)
403       H ^= G >> 24;
404     H &= ~G;
405   }
406   return H;
407 }
408 
409 template <class ELFT> void HashTableSection<ELFT>::finalize() {
410   this->Header.sh_link = Out<ELFT>::DynSymTab->SectionIndex;
411 
412   unsigned NumEntries = 2;                 // nbucket and nchain.
413   NumEntries += Out<ELFT>::DynSymTab->getNumSymbols(); // The chain entries.
414 
415   // Create as many buckets as there are symbols.
416   // FIXME: This is simplistic. We can try to optimize it, but implementing
417   // support for SHT_GNU_HASH is probably even more profitable.
418   NumEntries += Out<ELFT>::DynSymTab->getNumSymbols();
419   this->Header.sh_size = NumEntries * sizeof(Elf_Word);
420 }
421 
422 template <class ELFT> void HashTableSection<ELFT>::writeTo(uint8_t *Buf) {
423   unsigned NumSymbols = Out<ELFT>::DynSymTab->getNumSymbols();
424   auto *P = reinterpret_cast<Elf_Word *>(Buf);
425   *P++ = NumSymbols; // nbucket
426   *P++ = NumSymbols; // nchain
427 
428   Elf_Word *Buckets = P;
429   Elf_Word *Chains = P + NumSymbols;
430 
431   for (SymbolBody *Body : Out<ELFT>::DynSymTab->getSymbols()) {
432     StringRef Name = Body->getName();
433     unsigned I = Body->DynamicSymbolTableIndex;
434     uint32_t Hash = hashSysv(Name) % NumSymbols;
435     Chains[I] = Buckets[Hash];
436     Buckets[Hash] = I;
437   }
438 }
439 
440 static uint32_t hashGnu(StringRef Name) {
441   uint32_t H = 5381;
442   for (uint8_t C : Name)
443     H = (H << 5) + H + C;
444   return H;
445 }
446 
447 template <class ELFT>
448 GnuHashTableSection<ELFT>::GnuHashTableSection()
449     : OutputSectionBase<ELFT>(".gnu.hash", SHT_GNU_HASH, SHF_ALLOC) {
450   this->Header.sh_entsize = ELFT::Is64Bits ? 0 : 4;
451   this->Header.sh_addralign = ELFT::Is64Bits ? 8 : 4;
452 }
453 
454 template <class ELFT>
455 unsigned GnuHashTableSection<ELFT>::calcNBuckets(unsigned NumHashed) {
456   if (!NumHashed)
457     return 0;
458 
459   // These values are prime numbers which are not greater than 2^(N-1) + 1.
460   // In result, for any particular NumHashed we return a prime number
461   // which is not greater than NumHashed.
462   static const unsigned Primes[] = {
463       1,   1,    3,    3,    7,    13,    31,    61,    127,   251,
464       509, 1021, 2039, 4093, 8191, 16381, 32749, 65521, 131071};
465 
466   return Primes[std::min<unsigned>(Log2_32_Ceil(NumHashed),
467                                    array_lengthof(Primes) - 1)];
468 }
469 
470 // Bloom filter estimation: at least 8 bits for each hashed symbol.
471 // GNU Hash table requirement: it should be a power of 2,
472 //   the minimum value is 1, even for an empty table.
473 // Expected results for a 32-bit target:
474 //   calcMaskWords(0..4)   = 1
475 //   calcMaskWords(5..8)   = 2
476 //   calcMaskWords(9..16)  = 4
477 // For a 64-bit target:
478 //   calcMaskWords(0..8)   = 1
479 //   calcMaskWords(9..16)  = 2
480 //   calcMaskWords(17..32) = 4
481 template <class ELFT>
482 unsigned GnuHashTableSection<ELFT>::calcMaskWords(unsigned NumHashed) {
483   if (!NumHashed)
484     return 1;
485   return NextPowerOf2((NumHashed - 1) / sizeof(Elf_Off));
486 }
487 
488 template <class ELFT> void GnuHashTableSection<ELFT>::finalize() {
489   unsigned NumHashed = HashedSymbols.size();
490   NBuckets = calcNBuckets(NumHashed);
491   MaskWords = calcMaskWords(NumHashed);
492   // Second hash shift estimation: just predefined values.
493   Shift2 = ELFT::Is64Bits ? 6 : 5;
494 
495   this->Header.sh_link = Out<ELFT>::DynSymTab->SectionIndex;
496   this->Header.sh_size = sizeof(Elf_Word) * 4            // Header
497                          + sizeof(Elf_Off) * MaskWords   // Bloom Filter
498                          + sizeof(Elf_Word) * NBuckets   // Hash Buckets
499                          + sizeof(Elf_Word) * NumHashed; // Hash Values
500 }
501 
502 template <class ELFT> void GnuHashTableSection<ELFT>::writeTo(uint8_t *Buf) {
503   writeHeader(Buf);
504   if (HashedSymbols.empty())
505     return;
506   writeBloomFilter(Buf);
507   writeHashTable(Buf);
508 }
509 
510 template <class ELFT>
511 void GnuHashTableSection<ELFT>::writeHeader(uint8_t *&Buf) {
512   auto *P = reinterpret_cast<Elf_Word *>(Buf);
513   *P++ = NBuckets;
514   *P++ = Out<ELFT>::DynSymTab->getNumSymbols() - HashedSymbols.size();
515   *P++ = MaskWords;
516   *P++ = Shift2;
517   Buf = reinterpret_cast<uint8_t *>(P);
518 }
519 
520 template <class ELFT>
521 void GnuHashTableSection<ELFT>::writeBloomFilter(uint8_t *&Buf) {
522   unsigned C = sizeof(Elf_Off) * 8;
523 
524   auto *Masks = reinterpret_cast<Elf_Off *>(Buf);
525   for (const HashedSymbolData &Item : HashedSymbols) {
526     size_t Pos = (Item.Hash / C) & (MaskWords - 1);
527     uintX_t V = (uintX_t(1) << (Item.Hash % C)) |
528                 (uintX_t(1) << ((Item.Hash >> Shift2) % C));
529     Masks[Pos] |= V;
530   }
531   Buf += sizeof(Elf_Off) * MaskWords;
532 }
533 
534 template <class ELFT>
535 void GnuHashTableSection<ELFT>::writeHashTable(uint8_t *Buf) {
536   Elf_Word *Buckets = reinterpret_cast<Elf_Word *>(Buf);
537   Elf_Word *Values = Buckets + NBuckets;
538 
539   int PrevBucket = -1;
540   int I = 0;
541   for (const HashedSymbolData &Item : HashedSymbols) {
542     int Bucket = Item.Hash % NBuckets;
543     assert(PrevBucket <= Bucket);
544     if (Bucket != PrevBucket) {
545       Buckets[Bucket] = Item.Body->DynamicSymbolTableIndex;
546       PrevBucket = Bucket;
547       if (I > 0)
548         Values[I - 1] |= 1;
549     }
550     Values[I] = Item.Hash & ~1;
551     ++I;
552   }
553   if (I > 0)
554     Values[I - 1] |= 1;
555 }
556 
557 static bool includeInGnuHashTable(SymbolBody *B) {
558   // Assume that includeInDynamicSymtab() is already checked.
559   return !B->isUndefined();
560 }
561 
562 template <class ELFT>
563 void GnuHashTableSection<ELFT>::addSymbols(std::vector<SymbolBody *> &Symbols) {
564   std::vector<SymbolBody *> NotHashed;
565   NotHashed.reserve(Symbols.size());
566   HashedSymbols.reserve(Symbols.size());
567   for (SymbolBody *B : Symbols) {
568     if (includeInGnuHashTable(B))
569       HashedSymbols.push_back(HashedSymbolData{B, hashGnu(B->getName())});
570     else
571       NotHashed.push_back(B);
572   }
573   if (HashedSymbols.empty())
574     return;
575 
576   unsigned NBuckets = calcNBuckets(HashedSymbols.size());
577   std::stable_sort(HashedSymbols.begin(), HashedSymbols.end(),
578                    [&](const HashedSymbolData &L, const HashedSymbolData &R) {
579                      return L.Hash % NBuckets < R.Hash % NBuckets;
580                    });
581 
582   Symbols = std::move(NotHashed);
583   for (const HashedSymbolData &Item : HashedSymbols)
584     Symbols.push_back(Item.Body);
585 }
586 
587 template <class ELFT>
588 DynamicSection<ELFT>::DynamicSection(SymbolTable<ELFT> &SymTab)
589     : OutputSectionBase<ELFT>(".dynamic", SHT_DYNAMIC, SHF_ALLOC | SHF_WRITE),
590       SymTab(SymTab) {
591   Elf_Shdr &Header = this->Header;
592   Header.sh_addralign = ELFT::Is64Bits ? 8 : 4;
593   Header.sh_entsize = ELFT::Is64Bits ? 16 : 8;
594 
595   // .dynamic section is not writable on MIPS.
596   // See "Special Section" in Chapter 4 in the following document:
597   // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
598   if (Config->EMachine == EM_MIPS)
599     Header.sh_flags = SHF_ALLOC;
600 }
601 
602 template <class ELFT> void DynamicSection<ELFT>::finalize() {
603   if (this->Header.sh_size)
604     return; // Already finalized.
605 
606   Elf_Shdr &Header = this->Header;
607   Header.sh_link = Out<ELFT>::DynStrTab->SectionIndex;
608 
609   // Reserve strings. We know that these are the last string to be added to
610   // DynStrTab and doing this here allows this function to set DT_STRSZ.
611   if (!Config->RPath.empty())
612     Out<ELFT>::DynStrTab->reserve(Config->RPath);
613   if (!Config->SoName.empty())
614     Out<ELFT>::DynStrTab->reserve(Config->SoName);
615   for (const std::unique_ptr<SharedFile<ELFT>> &F : SymTab.getSharedFiles())
616     if (F->isNeeded())
617       Out<ELFT>::DynStrTab->reserve(F->getSoName());
618   Out<ELFT>::DynStrTab->finalize();
619 
620   auto Add = [=](Entry E) { Entries.push_back(E); };
621 
622   if (Out<ELFT>::RelaDyn->hasRelocs()) {
623     bool IsRela = Out<ELFT>::RelaDyn->isRela();
624     Add({IsRela ? DT_RELA : DT_REL, Out<ELFT>::RelaDyn});
625     Add({IsRela ? DT_RELASZ : DT_RELSZ, Out<ELFT>::RelaDyn->getSize()});
626     Add({IsRela ? DT_RELAENT : DT_RELENT,
627          uintX_t(IsRela ? sizeof(Elf_Rela) : sizeof(Elf_Rel))});
628   }
629   if (Out<ELFT>::RelaPlt && Out<ELFT>::RelaPlt->hasRelocs()) {
630     Add({DT_JMPREL, Out<ELFT>::RelaPlt});
631     Add({DT_PLTRELSZ, Out<ELFT>::RelaPlt->getSize()});
632     Add({Config->EMachine == EM_MIPS ? DT_MIPS_PLTGOT : DT_PLTGOT,
633          Out<ELFT>::GotPlt});
634     Add({DT_PLTREL, uint64_t(Out<ELFT>::RelaPlt->isRela() ? DT_RELA : DT_REL)});
635   }
636 
637   Add({DT_SYMTAB, Out<ELFT>::DynSymTab});
638   Add({DT_SYMENT, sizeof(Elf_Sym)});
639   Add({DT_STRTAB, Out<ELFT>::DynStrTab});
640   Add({DT_STRSZ, Out<ELFT>::DynStrTab->getSize()});
641   if (Out<ELFT>::GnuHashTab)
642     Add({DT_GNU_HASH, Out<ELFT>::GnuHashTab});
643   if (Out<ELFT>::HashTab)
644     Add({DT_HASH, Out<ELFT>::HashTab});
645 
646   if (!Config->RPath.empty())
647     Add({Config->EnableNewDtags ? DT_RUNPATH : DT_RPATH,
648          Out<ELFT>::DynStrTab->addString(Config->RPath)});
649 
650   if (!Config->SoName.empty())
651     Add({DT_SONAME, Out<ELFT>::DynStrTab->addString(Config->SoName)});
652 
653   if (PreInitArraySec) {
654     Add({DT_PREINIT_ARRAY, PreInitArraySec});
655     Add({DT_PREINIT_ARRAYSZ, PreInitArraySec->getSize()});
656   }
657   if (InitArraySec) {
658     Add({DT_INIT_ARRAY, InitArraySec});
659     Add({DT_INIT_ARRAYSZ, (uintX_t)InitArraySec->getSize()});
660   }
661   if (FiniArraySec) {
662     Add({DT_FINI_ARRAY, FiniArraySec});
663     Add({DT_FINI_ARRAYSZ, (uintX_t)FiniArraySec->getSize()});
664   }
665 
666   for (const std::unique_ptr<SharedFile<ELFT>> &F : SymTab.getSharedFiles())
667     if (F->isNeeded())
668       Add({DT_NEEDED, Out<ELFT>::DynStrTab->addString(F->getSoName())});
669 
670   if (SymbolBody *B = SymTab.find(Config->Init))
671     Add({DT_INIT, B});
672   if (SymbolBody *B = SymTab.find(Config->Fini))
673     Add({DT_FINI, B});
674 
675   uint32_t DtFlags = 0;
676   uint32_t DtFlags1 = 0;
677   if (Config->Bsymbolic)
678     DtFlags |= DF_SYMBOLIC;
679   if (Config->ZNodelete)
680     DtFlags1 |= DF_1_NODELETE;
681   if (Config->ZNow) {
682     DtFlags |= DF_BIND_NOW;
683     DtFlags1 |= DF_1_NOW;
684   }
685   if (Config->ZOrigin) {
686     DtFlags |= DF_ORIGIN;
687     DtFlags1 |= DF_1_ORIGIN;
688   }
689 
690   if (DtFlags)
691     Add({DT_FLAGS, DtFlags});
692   if (DtFlags1)
693     Add({DT_FLAGS_1, DtFlags1});
694 
695   if (!Config->Entry.empty())
696     Add({DT_DEBUG, (uint64_t)0});
697 
698   if (Config->EMachine == EM_MIPS) {
699     Add({DT_MIPS_RLD_VERSION, 1});
700     Add({DT_MIPS_FLAGS, RHF_NOTPOT});
701     Add({DT_MIPS_BASE_ADDRESS, (uintX_t)Target->getVAStart()});
702     Add({DT_MIPS_SYMTABNO, Out<ELFT>::DynSymTab->getNumSymbols()});
703     Add({DT_MIPS_LOCAL_GOTNO, Out<ELFT>::Got->getMipsLocalEntriesNum()});
704     if (const SymbolBody *B = Out<ELFT>::Got->getMipsFirstGlobalEntry())
705       Add({DT_MIPS_GOTSYM, B->DynamicSymbolTableIndex});
706     else
707       Add({DT_MIPS_GOTSYM, Out<ELFT>::DynSymTab->getNumSymbols()});
708     Add({DT_PLTGOT, Out<ELFT>::Got});
709     if (Out<ELFT>::MipsRldMap)
710       Add({DT_MIPS_RLD_MAP, Out<ELFT>::MipsRldMap});
711   }
712 
713   // +1 for DT_NULL
714   Header.sh_size = (Entries.size() + 1) * Header.sh_entsize;
715 }
716 
717 template <class ELFT> void DynamicSection<ELFT>::writeTo(uint8_t *Buf) {
718   auto *P = reinterpret_cast<Elf_Dyn *>(Buf);
719 
720   for (const Entry &E : Entries) {
721     P->d_tag = E.Tag;
722     switch (E.Kind) {
723     case Entry::SecAddr:
724       P->d_un.d_ptr = E.OutSec->getVA();
725       break;
726     case Entry::SymAddr:
727       P->d_un.d_ptr = getSymVA<ELFT>(*E.Sym);
728       break;
729     case Entry::PlainInt:
730       P->d_un.d_val = E.Val;
731       break;
732     }
733     ++P;
734   }
735 }
736 
737 template <class ELFT>
738 EhFrameHeader<ELFT>::EhFrameHeader()
739     : OutputSectionBase<ELFT>(".eh_frame_hdr", llvm::ELF::SHT_PROGBITS,
740                               SHF_ALLOC) {
741   // It's a 4 bytes of header + pointer to the contents of the .eh_frame section
742   // + the number of FDE pointers in the table.
743   this->Header.sh_size = 12;
744 }
745 
746 // We have to get PC values of FDEs. They depend on relocations
747 // which are target specific, so we run this code after performing
748 // all relocations. We read the values from ouput buffer according to the
749 // encoding given for FDEs. Return value is an offset to the initial PC value
750 // for the FDE.
751 template <class ELFT>
752 typename EhFrameHeader<ELFT>::uintX_t
753 EhFrameHeader<ELFT>::getFdePc(uintX_t EhVA, const FdeData &F) {
754   const endianness E = ELFT::TargetEndianness;
755   assert((F.Enc & 0xF0) != dwarf::DW_EH_PE_datarel);
756 
757   uintX_t FdeOff = EhVA + F.Off + 8;
758   switch (F.Enc & 0xF) {
759   case dwarf::DW_EH_PE_udata2:
760   case dwarf::DW_EH_PE_sdata2:
761     return FdeOff + read16<E>(F.PCRel);
762   case dwarf::DW_EH_PE_udata4:
763   case dwarf::DW_EH_PE_sdata4:
764     return FdeOff + read32<E>(F.PCRel);
765   case dwarf::DW_EH_PE_udata8:
766   case dwarf::DW_EH_PE_sdata8:
767     return FdeOff + read64<E>(F.PCRel);
768   case dwarf::DW_EH_PE_absptr:
769     if (sizeof(uintX_t) == 8)
770       return FdeOff + read64<E>(F.PCRel);
771     return FdeOff + read32<E>(F.PCRel);
772   }
773   error("unknown FDE size encoding");
774 }
775 
776 template <class ELFT> void EhFrameHeader<ELFT>::writeTo(uint8_t *Buf) {
777   const endianness E = ELFT::TargetEndianness;
778 
779   const uint8_t Header[] = {1, dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4,
780                             dwarf::DW_EH_PE_udata4,
781                             dwarf::DW_EH_PE_datarel | dwarf::DW_EH_PE_sdata4};
782   memcpy(Buf, Header, sizeof(Header));
783 
784   uintX_t EhVA = Sec->getVA();
785   uintX_t VA = this->getVA();
786   uintX_t EhOff = EhVA - VA - 4;
787   write32<E>(Buf + 4, EhOff);
788   write32<E>(Buf + 8, this->FdeList.size());
789   Buf += 12;
790 
791   // InitialPC -> Offset in .eh_frame, sorted by InitialPC.
792   std::map<uintX_t, size_t> PcToOffset;
793   for (const FdeData &F : FdeList)
794     PcToOffset[getFdePc(EhVA, F)] = F.Off;
795 
796   for (auto &I : PcToOffset) {
797     // The first four bytes are an offset to the initial PC value for the FDE.
798     write32<E>(Buf, I.first - VA);
799     // The last four bytes are an offset to the FDE data itself.
800     write32<E>(Buf + 4, EhVA + I.second - VA);
801     Buf += 8;
802   }
803 }
804 
805 template <class ELFT>
806 void EhFrameHeader<ELFT>::assignEhFrame(EHOutputSection<ELFT> *Sec) {
807   assert((!this->Sec || this->Sec == Sec) &&
808          "multiple .eh_frame sections not supported for .eh_frame_hdr");
809   Live = Config->EhFrameHdr;
810   this->Sec = Sec;
811 }
812 
813 template <class ELFT>
814 void EhFrameHeader<ELFT>::addFde(uint8_t Enc, size_t Off, uint8_t *PCRel) {
815   if (Live && (Enc & 0xF0) == dwarf::DW_EH_PE_datarel)
816     error("DW_EH_PE_datarel encoding unsupported for FDEs by .eh_frame_hdr");
817   FdeList.push_back(FdeData{Enc, Off, PCRel});
818 }
819 
820 template <class ELFT> void EhFrameHeader<ELFT>::reserveFde() {
821   // Each FDE entry is 8 bytes long:
822   // The first four bytes are an offset to the initial PC value for the FDE. The
823   // last four byte are an offset to the FDE data itself.
824   this->Header.sh_size += 8;
825 }
826 
827 template <class ELFT>
828 OutputSection<ELFT>::OutputSection(StringRef Name, uint32_t Type,
829                                    uintX_t Flags)
830     : OutputSectionBase<ELFT>(Name, Type, Flags) {}
831 
832 template <class ELFT>
833 void OutputSection<ELFT>::addSection(InputSectionBase<ELFT> *C) {
834   auto *S = cast<InputSection<ELFT>>(C);
835   Sections.push_back(S);
836   S->OutSec = this;
837   uint32_t Align = S->getAlign();
838   if (Align > this->Header.sh_addralign)
839     this->Header.sh_addralign = Align;
840 
841   uintX_t Off = this->Header.sh_size;
842   Off = alignTo(Off, Align);
843   S->OutSecOff = Off;
844   Off += S->getSize();
845   this->Header.sh_size = Off;
846 }
847 
848 template <class ELFT>
849 typename ELFFile<ELFT>::uintX_t elf2::getSymVA(const SymbolBody &S) {
850   switch (S.kind()) {
851   case SymbolBody::DefinedSyntheticKind: {
852     auto &D = cast<DefinedSynthetic<ELFT>>(S);
853     return D.Section.getVA() + D.Value;
854   }
855   case SymbolBody::DefinedRegularKind: {
856     const auto &DR = cast<DefinedRegular<ELFT>>(S);
857     InputSectionBase<ELFT> *SC = DR.Section;
858     if (!SC)
859       return DR.Sym.st_value;
860 
861     // Symbol offsets for AMDGPU need to be the offset in bytes of the symbol
862     // from the beginning of the section.
863     if (Config->EMachine == EM_AMDGPU)
864       return SC->getOffset(DR.Sym);
865     if (DR.Sym.getType() == STT_TLS)
866       return SC->OutSec->getVA() + SC->getOffset(DR.Sym) -
867              Out<ELFT>::TlsPhdr->p_vaddr;
868     return SC->OutSec->getVA() + SC->getOffset(DR.Sym);
869   }
870   case SymbolBody::DefinedCommonKind:
871     return Out<ELFT>::Bss->getVA() + cast<DefinedCommon>(S).OffsetInBss;
872   case SymbolBody::SharedKind: {
873     auto &SS = cast<SharedSymbol<ELFT>>(S);
874     if (SS.NeedsCopy)
875       return Out<ELFT>::Bss->getVA() + SS.OffsetInBss;
876     return 0;
877   }
878   case SymbolBody::UndefinedElfKind:
879   case SymbolBody::UndefinedKind:
880     return 0;
881   case SymbolBody::LazyKind:
882     assert(S.isUsedInRegularObj() && "Lazy symbol reached writer");
883     return 0;
884   }
885   llvm_unreachable("Invalid symbol kind");
886 }
887 
888 // Returns a VA which a relocatin RI refers to. Used only for local symbols.
889 // For non-local symbols, use getSymVA instead.
890 template <class ELFT, bool IsRela>
891 typename ELFFile<ELFT>::uintX_t
892 elf2::getLocalRelTarget(const ObjectFile<ELFT> &File,
893                         const Elf_Rel_Impl<ELFT, IsRela> &RI,
894                         typename ELFFile<ELFT>::uintX_t Addend) {
895   typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym;
896   typedef typename ELFFile<ELFT>::uintX_t uintX_t;
897 
898   // PPC64 has a special relocation representing the TOC base pointer
899   // that does not have a corresponding symbol.
900   if (Config->EMachine == EM_PPC64 && RI.getType(false) == R_PPC64_TOC)
901     return getPPC64TocBase() + Addend;
902 
903   const Elf_Sym *Sym =
904       File.getObj().getRelocationSymbol(&RI, File.getSymbolTable());
905 
906   if (!Sym)
907     error("Unsupported relocation without symbol");
908 
909   InputSectionBase<ELFT> *Section = File.getSection(*Sym);
910 
911   if (Sym->getType() == STT_TLS)
912     return (Section->OutSec->getVA() + Section->getOffset(*Sym) + Addend) -
913            Out<ELFT>::TlsPhdr->p_vaddr;
914 
915   // According to the ELF spec reference to a local symbol from outside
916   // the group are not allowed. Unfortunately .eh_frame breaks that rule
917   // and must be treated specially. For now we just replace the symbol with
918   // 0.
919   if (Section == &InputSection<ELFT>::Discarded || !Section->isLive())
920     return Addend;
921 
922   uintX_t VA = Section->OutSec->getVA();
923   if (isa<InputSection<ELFT>>(Section))
924     return VA + Section->getOffset(*Sym) + Addend;
925 
926   uintX_t Offset = Sym->st_value;
927   if (Sym->getType() == STT_SECTION) {
928     Offset += Addend;
929     Addend = 0;
930   }
931   return VA + Section->getOffset(Offset) + Addend;
932 }
933 
934 // Returns true if a symbol can be replaced at load-time by a symbol
935 // with the same name defined in other ELF executable or DSO.
936 bool elf2::canBePreempted(const SymbolBody *Body, bool NeedsGot) {
937   if (!Body)
938     return false;  // Body is a local symbol.
939   if (Body->isShared())
940     return true;
941 
942   if (Body->isUndefined()) {
943     if (!Body->isWeak())
944       return true;
945 
946     // This is an horrible corner case. Ideally we would like to say that any
947     // undefined symbol can be preempted so that the dynamic linker has a
948     // chance of finding it at runtime.
949     //
950     // The problem is that the code sequence used to test for weak undef
951     // functions looks like
952     // if (func) func()
953     // If the code is -fPIC the first reference is a load from the got and
954     // everything works.
955     // If the code is not -fPIC there is no reasonable way to solve it:
956     // * A relocation writing to the text segment will fail (it is ro).
957     // * A copy relocation doesn't work for functions.
958     // * The trick of using a plt entry as the address would fail here since
959     //   the plt entry would have a non zero address.
960     // Since we cannot do anything better, we just resolve the symbol to 0 and
961     // don't produce a dynamic relocation.
962     //
963     // As an extra hack, assume that if we are producing a shared library the
964     // user knows what he or she is doing and can handle a dynamic relocation.
965     return Config->Shared || NeedsGot;
966   }
967   if (!Config->Shared)
968     return false;
969   return Body->getVisibility() == STV_DEFAULT;
970 }
971 
972 template <class ELFT> void OutputSection<ELFT>::writeTo(uint8_t *Buf) {
973   for (InputSection<ELFT> *C : Sections)
974     C->writeTo(Buf);
975 }
976 
977 template <class ELFT>
978 EHOutputSection<ELFT>::EHOutputSection(StringRef Name, uint32_t Type,
979                                        uintX_t Flags)
980     : OutputSectionBase<ELFT>(Name, Type, Flags) {
981   Out<ELFT>::EhFrameHdr->assignEhFrame(this);
982 }
983 
984 template <class ELFT>
985 EHRegion<ELFT>::EHRegion(EHInputSection<ELFT> *S, unsigned Index)
986     : S(S), Index(Index) {}
987 
988 template <class ELFT> StringRef EHRegion<ELFT>::data() const {
989   ArrayRef<uint8_t> SecData = S->getSectionData();
990   ArrayRef<std::pair<uintX_t, uintX_t>> Offsets = S->Offsets;
991   size_t Start = Offsets[Index].first;
992   size_t End =
993       Index == Offsets.size() - 1 ? SecData.size() : Offsets[Index + 1].first;
994   return StringRef((const char *)SecData.data() + Start, End - Start);
995 }
996 
997 template <class ELFT>
998 Cie<ELFT>::Cie(EHInputSection<ELFT> *S, unsigned Index)
999     : EHRegion<ELFT>(S, Index) {}
1000 
1001 // Read a byte and advance D by one byte.
1002 static uint8_t readByte(ArrayRef<uint8_t> &D) {
1003   if (D.empty())
1004     error("corrupted or unsupported CIE information");
1005   uint8_t B = D.front();
1006   D = D.slice(1);
1007   return B;
1008 }
1009 
1010 static void skipLeb128(ArrayRef<uint8_t> &D) {
1011   while (!D.empty()) {
1012     uint8_t Val = D.front();
1013     D = D.slice(1);
1014     if ((Val & 0x80) == 0)
1015       return;
1016   }
1017   error("corrupted or unsupported CIE information");
1018 }
1019 
1020 template <class ELFT> static unsigned getSizeForEncoding(unsigned Enc) {
1021   typedef typename ELFFile<ELFT>::uintX_t uintX_t;
1022   switch (Enc & 0x0f) {
1023   default:
1024     error("unknown FDE encoding");
1025   case dwarf::DW_EH_PE_absptr:
1026   case dwarf::DW_EH_PE_signed:
1027     return sizeof(uintX_t);
1028   case dwarf::DW_EH_PE_udata2:
1029   case dwarf::DW_EH_PE_sdata2:
1030     return 2;
1031   case dwarf::DW_EH_PE_udata4:
1032   case dwarf::DW_EH_PE_sdata4:
1033     return 4;
1034   case dwarf::DW_EH_PE_udata8:
1035   case dwarf::DW_EH_PE_sdata8:
1036     return 8;
1037   }
1038 }
1039 
1040 template <class ELFT>
1041 uint8_t EHOutputSection<ELFT>::getFdeEncoding(ArrayRef<uint8_t> D) {
1042   auto Check = [](bool C) {
1043     if (!C)
1044       error("corrupted or unsupported CIE information");
1045   };
1046 
1047   Check(D.size() >= 8);
1048   D = D.slice(8);
1049 
1050   uint8_t Version = readByte(D);
1051   if (Version != 1 && Version != 3)
1052     error("FDE version 1 or 3 expected, but got " + Twine((unsigned)Version));
1053 
1054   auto AugEnd = std::find(D.begin() + 1, D.end(), '\0');
1055   Check(AugEnd != D.end());
1056   ArrayRef<uint8_t> AugString(D.begin(), AugEnd - D.begin());
1057   D = D.slice(AugString.size() + 1);
1058 
1059   // Code alignment factor should always be 1 for .eh_frame.
1060   if (readByte(D) != 1)
1061     error("CIE code alignment must be 1");
1062   // Skip data alignment factor
1063   skipLeb128(D);
1064 
1065   // Skip the return address register. In CIE version 1 this is a single
1066   // byte. In CIE version 3 this is an unsigned LEB128.
1067   if (Version == 1)
1068     readByte(D);
1069   else
1070     skipLeb128(D);
1071 
1072   while (!AugString.empty()) {
1073     switch (readByte(AugString)) {
1074     case 'z':
1075       skipLeb128(D);
1076       break;
1077     case 'R':
1078       return readByte(D);
1079     case 'P': {
1080       uint8_t Enc = readByte(D);
1081       if ((Enc & 0xf0) == dwarf::DW_EH_PE_aligned)
1082         error("DW_EH_PE_aligned encoding for address of a personality routine "
1083               "handler not supported");
1084       unsigned EncSize = getSizeForEncoding<ELFT>(Enc);
1085       Check(D.size() >= EncSize);
1086       D = D.slice(EncSize);
1087       break;
1088     }
1089     case 'S':
1090     case 'L':
1091       // L: Language Specific Data Area (LSDA) encoding
1092       // S: This CIE represents a stack frame for the invocation of a signal
1093       //    handler
1094       break;
1095     default:
1096       error("unknown .eh_frame augmentation string value");
1097     }
1098   }
1099   return dwarf::DW_EH_PE_absptr;
1100 }
1101 
1102 template <class ELFT>
1103 template <bool IsRela>
1104 void EHOutputSection<ELFT>::addSectionAux(
1105     EHInputSection<ELFT> *S,
1106     iterator_range<const Elf_Rel_Impl<ELFT, IsRela> *> Rels) {
1107   const endianness E = ELFT::TargetEndianness;
1108 
1109   S->OutSec = this;
1110   uint32_t Align = S->getAlign();
1111   if (Align > this->Header.sh_addralign)
1112     this->Header.sh_addralign = Align;
1113 
1114   Sections.push_back(S);
1115 
1116   ArrayRef<uint8_t> SecData = S->getSectionData();
1117   ArrayRef<uint8_t> D = SecData;
1118   uintX_t Offset = 0;
1119   auto RelI = Rels.begin();
1120   auto RelE = Rels.end();
1121 
1122   DenseMap<unsigned, unsigned> OffsetToIndex;
1123   while (!D.empty()) {
1124     unsigned Index = S->Offsets.size();
1125     S->Offsets.push_back(std::make_pair(Offset, -1));
1126 
1127     uintX_t Length = readEntryLength(D);
1128     // If CIE/FDE data length is zero then Length is 4, this
1129     // shall be considered a terminator and processing shall end.
1130     if (Length == 4)
1131       break;
1132     StringRef Entry((const char *)D.data(), Length);
1133 
1134     while (RelI != RelE && RelI->r_offset < Offset)
1135       ++RelI;
1136     uintX_t NextOffset = Offset + Length;
1137     bool HasReloc = RelI != RelE && RelI->r_offset < NextOffset;
1138 
1139     uint32_t ID = read32<E>(D.data() + 4);
1140     if (ID == 0) {
1141       // CIE
1142       Cie<ELFT> C(S, Index);
1143       if (Config->EhFrameHdr)
1144         C.FdeEncoding = getFdeEncoding(D);
1145 
1146       StringRef Personality;
1147       if (HasReloc) {
1148         uint32_t SymIndex = RelI->getSymbol(Config->Mips64EL);
1149         SymbolBody &Body = *S->getFile()->getSymbolBody(SymIndex)->repl();
1150         Personality = Body.getName();
1151       }
1152 
1153       std::pair<StringRef, StringRef> CieInfo(Entry, Personality);
1154       auto P = CieMap.insert(std::make_pair(CieInfo, Cies.size()));
1155       if (P.second) {
1156         Cies.push_back(C);
1157         this->Header.sh_size += alignTo(Length, sizeof(uintX_t));
1158       }
1159       OffsetToIndex[Offset] = P.first->second;
1160     } else {
1161       if (!HasReloc)
1162         error("FDE doesn't reference another section");
1163       InputSectionBase<ELFT> *Target = S->getRelocTarget(*RelI);
1164       if (Target != &InputSection<ELFT>::Discarded && Target->isLive()) {
1165         uint32_t CieOffset = Offset + 4 - ID;
1166         auto I = OffsetToIndex.find(CieOffset);
1167         if (I == OffsetToIndex.end())
1168           error("Invalid CIE reference");
1169         Cies[I->second].Fdes.push_back(EHRegion<ELFT>(S, Index));
1170         Out<ELFT>::EhFrameHdr->reserveFde();
1171         this->Header.sh_size += alignTo(Length, sizeof(uintX_t));
1172       }
1173     }
1174 
1175     Offset = NextOffset;
1176     D = D.slice(Length);
1177   }
1178 }
1179 
1180 template <class ELFT>
1181 typename EHOutputSection<ELFT>::uintX_t
1182 EHOutputSection<ELFT>::readEntryLength(ArrayRef<uint8_t> D) {
1183   const endianness E = ELFT::TargetEndianness;
1184 
1185   if (D.size() < 4)
1186     error("Truncated CIE/FDE length");
1187   uint64_t Len = read32<E>(D.data());
1188   if (Len < UINT32_MAX) {
1189     if (Len > (UINT32_MAX - 4))
1190       error("CIE/FIE size is too large");
1191     if (Len + 4 > D.size())
1192       error("CIE/FIE ends past the end of the section");
1193     return Len + 4;
1194   }
1195 
1196   if (D.size() < 12)
1197     error("Truncated CIE/FDE length");
1198   Len = read64<E>(D.data() + 4);
1199   if (Len > (UINT64_MAX - 12))
1200     error("CIE/FIE size is too large");
1201   if (Len + 12 > D.size())
1202     error("CIE/FIE ends past the end of the section");
1203   return Len + 12;
1204 }
1205 
1206 template <class ELFT>
1207 void EHOutputSection<ELFT>::addSection(InputSectionBase<ELFT> *C) {
1208   auto *S = cast<EHInputSection<ELFT>>(C);
1209   const Elf_Shdr *RelSec = S->RelocSection;
1210   if (!RelSec) {
1211     addSectionAux(S, make_range<const Elf_Rela *>(nullptr, nullptr));
1212     return;
1213   }
1214   ELFFile<ELFT> &Obj = S->getFile()->getObj();
1215   if (RelSec->sh_type == SHT_RELA)
1216     addSectionAux(S, Obj.relas(RelSec));
1217   else
1218     addSectionAux(S, Obj.rels(RelSec));
1219 }
1220 
1221 template <class ELFT>
1222 static typename ELFFile<ELFT>::uintX_t writeAlignedCieOrFde(StringRef Data,
1223                                                             uint8_t *Buf) {
1224   typedef typename ELFFile<ELFT>::uintX_t uintX_t;
1225   const endianness E = ELFT::TargetEndianness;
1226   uint64_t Len = alignTo(Data.size(), sizeof(uintX_t));
1227   write32<E>(Buf, Len - 4);
1228   memcpy(Buf + 4, Data.data() + 4, Data.size() - 4);
1229   return Len;
1230 }
1231 
1232 template <class ELFT> void EHOutputSection<ELFT>::writeTo(uint8_t *Buf) {
1233   const endianness E = ELFT::TargetEndianness;
1234   size_t Offset = 0;
1235   for (const Cie<ELFT> &C : Cies) {
1236     size_t CieOffset = Offset;
1237 
1238     uintX_t CIELen = writeAlignedCieOrFde<ELFT>(C.data(), Buf + Offset);
1239     C.S->Offsets[C.Index].second = Offset;
1240     Offset += CIELen;
1241 
1242     for (const EHRegion<ELFT> &F : C.Fdes) {
1243       uintX_t Len = writeAlignedCieOrFde<ELFT>(F.data(), Buf + Offset);
1244       write32<E>(Buf + Offset + 4, Offset + 4 - CieOffset); // Pointer
1245       F.S->Offsets[F.Index].second = Offset;
1246       Out<ELFT>::EhFrameHdr->addFde(C.FdeEncoding, Offset, Buf + Offset + 8);
1247       Offset += Len;
1248     }
1249   }
1250 
1251   for (EHInputSection<ELFT> *S : Sections) {
1252     const Elf_Shdr *RelSec = S->RelocSection;
1253     if (!RelSec)
1254       continue;
1255     ELFFile<ELFT> &EObj = S->getFile()->getObj();
1256     if (RelSec->sh_type == SHT_RELA)
1257       S->relocate(Buf, nullptr, EObj.relas(RelSec));
1258     else
1259       S->relocate(Buf, nullptr, EObj.rels(RelSec));
1260   }
1261 }
1262 
1263 template <class ELFT>
1264 MergeOutputSection<ELFT>::MergeOutputSection(StringRef Name, uint32_t Type,
1265                                              uintX_t Flags)
1266     : OutputSectionBase<ELFT>(Name, Type, Flags) {}
1267 
1268 template <class ELFT> void MergeOutputSection<ELFT>::writeTo(uint8_t *Buf) {
1269   if (shouldTailMerge()) {
1270     StringRef Data = Builder.data();
1271     memcpy(Buf, Data.data(), Data.size());
1272     return;
1273   }
1274   for (const std::pair<StringRef, size_t> &P : Builder.getMap()) {
1275     StringRef Data = P.first;
1276     memcpy(Buf + P.second, Data.data(), Data.size());
1277   }
1278 }
1279 
1280 static size_t findNull(StringRef S, size_t EntSize) {
1281   // Optimize the common case.
1282   if (EntSize == 1)
1283     return S.find(0);
1284 
1285   for (unsigned I = 0, N = S.size(); I != N; I += EntSize) {
1286     const char *B = S.begin() + I;
1287     if (std::all_of(B, B + EntSize, [](char C) { return C == 0; }))
1288       return I;
1289   }
1290   return StringRef::npos;
1291 }
1292 
1293 template <class ELFT>
1294 void MergeOutputSection<ELFT>::addSection(InputSectionBase<ELFT> *C) {
1295   auto *S = cast<MergeInputSection<ELFT>>(C);
1296   S->OutSec = this;
1297   uint32_t Align = S->getAlign();
1298   if (Align > this->Header.sh_addralign)
1299     this->Header.sh_addralign = Align;
1300 
1301   ArrayRef<uint8_t> D = S->getSectionData();
1302   StringRef Data((const char *)D.data(), D.size());
1303   uintX_t EntSize = S->getSectionHdr()->sh_entsize;
1304 
1305   if (this->Header.sh_flags & SHF_STRINGS) {
1306     uintX_t Offset = 0;
1307     while (!Data.empty()) {
1308       size_t End = findNull(Data, EntSize);
1309       if (End == StringRef::npos)
1310         error("String is not null terminated");
1311       StringRef Entry = Data.substr(0, End + EntSize);
1312       uintX_t OutputOffset = Builder.add(Entry);
1313       if (shouldTailMerge())
1314         OutputOffset = -1;
1315       S->Offsets.push_back(std::make_pair(Offset, OutputOffset));
1316       uintX_t Size = End + EntSize;
1317       Data = Data.substr(Size);
1318       Offset += Size;
1319     }
1320   } else {
1321     for (unsigned I = 0, N = Data.size(); I != N; I += EntSize) {
1322       StringRef Entry = Data.substr(I, EntSize);
1323       size_t OutputOffset = Builder.add(Entry);
1324       S->Offsets.push_back(std::make_pair(I, OutputOffset));
1325     }
1326   }
1327 }
1328 
1329 template <class ELFT>
1330 unsigned MergeOutputSection<ELFT>::getOffset(StringRef Val) {
1331   return Builder.getOffset(Val);
1332 }
1333 
1334 template <class ELFT> bool MergeOutputSection<ELFT>::shouldTailMerge() const {
1335   return Config->Optimize >= 2 && this->Header.sh_flags & SHF_STRINGS;
1336 }
1337 
1338 template <class ELFT> void MergeOutputSection<ELFT>::finalize() {
1339   if (shouldTailMerge())
1340     Builder.finalize();
1341   this->Header.sh_size = Builder.getSize();
1342 }
1343 
1344 template <class ELFT>
1345 StringTableSection<ELFT>::StringTableSection(StringRef Name, bool Dynamic)
1346     : OutputSectionBase<ELFT>(Name, SHT_STRTAB,
1347                               Dynamic ? (uintX_t)SHF_ALLOC : 0),
1348       Dynamic(Dynamic) {
1349   this->Header.sh_addralign = 1;
1350 }
1351 
1352 // String tables are created in two phases. First you call reserve()
1353 // to reserve room in the string table, and then call addString() to actually
1354 // add that string.
1355 //
1356 // Why two phases? We want to know the size of the string table as early as
1357 // possible to fix file layout. So we have separated finalize(), which
1358 // determines the size of the section, from writeTo(), which writes the section
1359 // contents to the output buffer. If we merge reserve() with addString(),
1360 // we need a plumbing work for finalize() and writeTo() so that offsets
1361 // we obtained in the former function can be written in the latter.
1362 // This design eliminated that need.
1363 template <class ELFT> void StringTableSection<ELFT>::reserve(StringRef S) {
1364   Reserved += S.size() + 1; // +1 for NUL
1365 }
1366 
1367 // Adds a string to the string table. You must call reserve() with the
1368 // same string before calling addString().
1369 template <class ELFT> size_t StringTableSection<ELFT>::addString(StringRef S) {
1370   size_t Pos = Used;
1371   Strings.push_back(S);
1372   Used += S.size() + 1;
1373   Reserved -= S.size() + 1;
1374   assert((int64_t)Reserved >= 0);
1375   return Pos;
1376 }
1377 
1378 template <class ELFT> void StringTableSection<ELFT>::writeTo(uint8_t *Buf) {
1379   // ELF string tables start with NUL byte, so advance the pointer by one.
1380   ++Buf;
1381   for (StringRef S : Strings) {
1382     memcpy(Buf, S.data(), S.size());
1383     Buf += S.size() + 1;
1384   }
1385 }
1386 
1387 template <class ELFT>
1388 SymbolTableSection<ELFT>::SymbolTableSection(
1389     SymbolTable<ELFT> &Table, StringTableSection<ELFT> &StrTabSec)
1390     : OutputSectionBase<ELFT>(StrTabSec.isDynamic() ? ".dynsym" : ".symtab",
1391                               StrTabSec.isDynamic() ? SHT_DYNSYM : SHT_SYMTAB,
1392                               StrTabSec.isDynamic() ? (uintX_t)SHF_ALLOC : 0),
1393       Table(Table), StrTabSec(StrTabSec) {
1394   this->Header.sh_entsize = sizeof(Elf_Sym);
1395   this->Header.sh_addralign = ELFT::Is64Bits ? 8 : 4;
1396 }
1397 
1398 // Orders symbols according to their positions in the GOT,
1399 // in compliance with MIPS ABI rules.
1400 // See "Global Offset Table" in Chapter 5 in the following document
1401 // for detailed description:
1402 // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
1403 static bool sortMipsSymbols(SymbolBody *L, SymbolBody *R) {
1404   if (!L->isInGot() || !R->isInGot())
1405     return R->isInGot();
1406   return L->GotIndex < R->GotIndex;
1407 }
1408 
1409 template <class ELFT> void SymbolTableSection<ELFT>::finalize() {
1410   if (this->Header.sh_size)
1411     return; // Already finalized.
1412 
1413   this->Header.sh_size = getNumSymbols() * sizeof(Elf_Sym);
1414   this->Header.sh_link = StrTabSec.SectionIndex;
1415   this->Header.sh_info = NumLocals + 1;
1416 
1417   if (!StrTabSec.isDynamic()) {
1418     std::stable_sort(Symbols.begin(), Symbols.end(),
1419                      [](SymbolBody *L, SymbolBody *R) {
1420                        return getSymbolBinding(L) == STB_LOCAL &&
1421                               getSymbolBinding(R) != STB_LOCAL;
1422                      });
1423     return;
1424   }
1425   if (Out<ELFT>::GnuHashTab)
1426     // NB: It also sorts Symbols to meet the GNU hash table requirements.
1427     Out<ELFT>::GnuHashTab->addSymbols(Symbols);
1428   else if (Config->EMachine == EM_MIPS)
1429     std::stable_sort(Symbols.begin(), Symbols.end(), sortMipsSymbols);
1430   size_t I = 0;
1431   for (SymbolBody *B : Symbols)
1432     B->DynamicSymbolTableIndex = ++I;
1433 }
1434 
1435 template <class ELFT>
1436 void SymbolTableSection<ELFT>::addLocalSymbol(StringRef Name) {
1437   StrTabSec.reserve(Name);
1438   ++NumLocals;
1439 }
1440 
1441 template <class ELFT>
1442 void SymbolTableSection<ELFT>::addSymbol(SymbolBody *Body) {
1443   StrTabSec.reserve(Body->getName());
1444   Symbols.push_back(Body);
1445 }
1446 
1447 template <class ELFT> void SymbolTableSection<ELFT>::writeTo(uint8_t *Buf) {
1448   Buf += sizeof(Elf_Sym);
1449 
1450   // All symbols with STB_LOCAL binding precede the weak and global symbols.
1451   // .dynsym only contains global symbols.
1452   if (!Config->DiscardAll && !StrTabSec.isDynamic())
1453     writeLocalSymbols(Buf);
1454 
1455   writeGlobalSymbols(Buf);
1456 }
1457 
1458 template <class ELFT>
1459 void SymbolTableSection<ELFT>::writeLocalSymbols(uint8_t *&Buf) {
1460   // Iterate over all input object files to copy their local symbols
1461   // to the output symbol table pointed by Buf.
1462   for (const std::unique_ptr<ObjectFile<ELFT>> &File : Table.getObjectFiles()) {
1463     for (const Elf_Sym *Sym : File->KeptLocalSyms) {
1464       ErrorOr<StringRef> SymNameOrErr = Sym->getName(File->getStringTable());
1465       error(SymNameOrErr);
1466       StringRef SymName = *SymNameOrErr;
1467 
1468       auto *ESym = reinterpret_cast<Elf_Sym *>(Buf);
1469       uintX_t VA = 0;
1470       if (Sym->st_shndx == SHN_ABS) {
1471         ESym->st_shndx = SHN_ABS;
1472         VA = Sym->st_value;
1473       } else {
1474         InputSectionBase<ELFT> *Section = File->getSection(*Sym);
1475         const OutputSectionBase<ELFT> *OutSec = Section->OutSec;
1476         ESym->st_shndx = OutSec->SectionIndex;
1477         VA = Section->getOffset(*Sym);
1478         // Symbol offsets for AMDGPU need to be the offset in bytes of the
1479         // symbol from the beginning of the section.
1480         if (Config->EMachine != EM_AMDGPU)
1481           VA += OutSec->getVA();
1482       }
1483       ESym->st_name = StrTabSec.addString(SymName);
1484       ESym->st_size = Sym->st_size;
1485       ESym->setBindingAndType(Sym->getBinding(), Sym->getType());
1486       ESym->st_value = VA;
1487       Buf += sizeof(*ESym);
1488     }
1489   }
1490 }
1491 
1492 template <class ELFT>
1493 static const typename llvm::object::ELFFile<ELFT>::Elf_Sym *
1494 getElfSym(SymbolBody &Body) {
1495   if (auto *EBody = dyn_cast<DefinedElf<ELFT>>(&Body))
1496     return &EBody->Sym;
1497   if (auto *EBody = dyn_cast<UndefinedElf<ELFT>>(&Body))
1498     return &EBody->Sym;
1499   return nullptr;
1500 }
1501 
1502 template <class ELFT>
1503 void SymbolTableSection<ELFT>::writeGlobalSymbols(uint8_t *Buf) {
1504   // Write the internal symbol table contents to the output symbol table
1505   // pointed by Buf.
1506   auto *ESym = reinterpret_cast<Elf_Sym *>(Buf);
1507   for (SymbolBody *Body : Symbols) {
1508     const OutputSectionBase<ELFT> *OutSec = nullptr;
1509 
1510     switch (Body->kind()) {
1511     case SymbolBody::DefinedSyntheticKind:
1512       OutSec = &cast<DefinedSynthetic<ELFT>>(Body)->Section;
1513       break;
1514     case SymbolBody::DefinedRegularKind: {
1515       auto *Sym = cast<DefinedRegular<ELFT>>(Body->repl());
1516       if (InputSectionBase<ELFT> *Sec = Sym->Section) {
1517         if (!Sec->isLive())
1518           continue;
1519         OutSec = Sec->OutSec;
1520       }
1521       break;
1522     }
1523     case SymbolBody::DefinedCommonKind:
1524       OutSec = Out<ELFT>::Bss;
1525       break;
1526     case SymbolBody::SharedKind: {
1527       if (cast<SharedSymbol<ELFT>>(Body)->NeedsCopy)
1528         OutSec = Out<ELFT>::Bss;
1529       break;
1530     }
1531     case SymbolBody::UndefinedElfKind:
1532     case SymbolBody::UndefinedKind:
1533     case SymbolBody::LazyKind:
1534       break;
1535     }
1536 
1537     StringRef Name = Body->getName();
1538     ESym->st_name = StrTabSec.addString(Name);
1539 
1540     unsigned char Type = STT_NOTYPE;
1541     uintX_t Size = 0;
1542     if (const Elf_Sym *InputSym = getElfSym<ELFT>(*Body)) {
1543       Type = InputSym->getType();
1544       Size = InputSym->st_size;
1545     } else if (auto *C = dyn_cast<DefinedCommon>(Body)) {
1546       Type = STT_OBJECT;
1547       Size = C->Size;
1548     }
1549 
1550     ESym->setBindingAndType(getSymbolBinding(Body), Type);
1551     ESym->st_size = Size;
1552     ESym->setVisibility(Body->getVisibility());
1553     ESym->st_value = getSymVA<ELFT>(*Body);
1554 
1555     if (OutSec)
1556       ESym->st_shndx = OutSec->SectionIndex;
1557     else if (isa<DefinedRegular<ELFT>>(Body))
1558       ESym->st_shndx = SHN_ABS;
1559 
1560     ++ESym;
1561   }
1562 }
1563 
1564 template <class ELFT>
1565 uint8_t SymbolTableSection<ELFT>::getSymbolBinding(SymbolBody *Body) {
1566   uint8_t Visibility = Body->getVisibility();
1567   if (Visibility != STV_DEFAULT && Visibility != STV_PROTECTED)
1568     return STB_LOCAL;
1569   if (const Elf_Sym *ESym = getElfSym<ELFT>(*Body))
1570     return ESym->getBinding();
1571   if (isa<DefinedSynthetic<ELFT>>(Body))
1572     return STB_LOCAL;
1573   return Body->isWeak() ? STB_WEAK : STB_GLOBAL;
1574 }
1575 
1576 template <class ELFT>
1577 MipsReginfoOutputSection<ELFT>::MipsReginfoOutputSection()
1578     : OutputSectionBase<ELFT>(".reginfo", SHT_MIPS_REGINFO, SHF_ALLOC) {
1579   this->Header.sh_addralign = 4;
1580   this->Header.sh_entsize = sizeof(Elf_Mips_RegInfo);
1581   this->Header.sh_size = sizeof(Elf_Mips_RegInfo);
1582 }
1583 
1584 template <class ELFT>
1585 void MipsReginfoOutputSection<ELFT>::writeTo(uint8_t *Buf) {
1586   auto *R = reinterpret_cast<Elf_Mips_RegInfo *>(Buf);
1587   R->ri_gp_value = getMipsGpAddr<ELFT>();
1588   R->ri_gprmask = GprMask;
1589 }
1590 
1591 template <class ELFT>
1592 void MipsReginfoOutputSection<ELFT>::addSection(InputSectionBase<ELFT> *C) {
1593   // Copy input object file's .reginfo gprmask to output.
1594   auto *S = cast<MipsReginfoInputSection<ELFT>>(C);
1595   GprMask |= S->Reginfo->ri_gprmask;
1596 }
1597 
1598 namespace lld {
1599 namespace elf2 {
1600 template class OutputSectionBase<ELF32LE>;
1601 template class OutputSectionBase<ELF32BE>;
1602 template class OutputSectionBase<ELF64LE>;
1603 template class OutputSectionBase<ELF64BE>;
1604 
1605 template class EhFrameHeader<ELF32LE>;
1606 template class EhFrameHeader<ELF32BE>;
1607 template class EhFrameHeader<ELF64LE>;
1608 template class EhFrameHeader<ELF64BE>;
1609 
1610 template class GotPltSection<ELF32LE>;
1611 template class GotPltSection<ELF32BE>;
1612 template class GotPltSection<ELF64LE>;
1613 template class GotPltSection<ELF64BE>;
1614 
1615 template class GotSection<ELF32LE>;
1616 template class GotSection<ELF32BE>;
1617 template class GotSection<ELF64LE>;
1618 template class GotSection<ELF64BE>;
1619 
1620 template class PltSection<ELF32LE>;
1621 template class PltSection<ELF32BE>;
1622 template class PltSection<ELF64LE>;
1623 template class PltSection<ELF64BE>;
1624 
1625 template class RelocationSection<ELF32LE>;
1626 template class RelocationSection<ELF32BE>;
1627 template class RelocationSection<ELF64LE>;
1628 template class RelocationSection<ELF64BE>;
1629 
1630 template class InterpSection<ELF32LE>;
1631 template class InterpSection<ELF32BE>;
1632 template class InterpSection<ELF64LE>;
1633 template class InterpSection<ELF64BE>;
1634 
1635 template class GnuHashTableSection<ELF32LE>;
1636 template class GnuHashTableSection<ELF32BE>;
1637 template class GnuHashTableSection<ELF64LE>;
1638 template class GnuHashTableSection<ELF64BE>;
1639 
1640 template class HashTableSection<ELF32LE>;
1641 template class HashTableSection<ELF32BE>;
1642 template class HashTableSection<ELF64LE>;
1643 template class HashTableSection<ELF64BE>;
1644 
1645 template class DynamicSection<ELF32LE>;
1646 template class DynamicSection<ELF32BE>;
1647 template class DynamicSection<ELF64LE>;
1648 template class DynamicSection<ELF64BE>;
1649 
1650 template class OutputSection<ELF32LE>;
1651 template class OutputSection<ELF32BE>;
1652 template class OutputSection<ELF64LE>;
1653 template class OutputSection<ELF64BE>;
1654 
1655 template class EHOutputSection<ELF32LE>;
1656 template class EHOutputSection<ELF32BE>;
1657 template class EHOutputSection<ELF64LE>;
1658 template class EHOutputSection<ELF64BE>;
1659 
1660 template class MipsReginfoOutputSection<ELF32LE>;
1661 template class MipsReginfoOutputSection<ELF32BE>;
1662 template class MipsReginfoOutputSection<ELF64LE>;
1663 template class MipsReginfoOutputSection<ELF64BE>;
1664 
1665 template class MergeOutputSection<ELF32LE>;
1666 template class MergeOutputSection<ELF32BE>;
1667 template class MergeOutputSection<ELF64LE>;
1668 template class MergeOutputSection<ELF64BE>;
1669 
1670 template class StringTableSection<ELF32LE>;
1671 template class StringTableSection<ELF32BE>;
1672 template class StringTableSection<ELF64LE>;
1673 template class StringTableSection<ELF64BE>;
1674 
1675 template class SymbolTableSection<ELF32LE>;
1676 template class SymbolTableSection<ELF32BE>;
1677 template class SymbolTableSection<ELF64LE>;
1678 template class SymbolTableSection<ELF64BE>;
1679 
1680 template ELFFile<ELF32LE>::uintX_t getSymVA<ELF32LE>(const SymbolBody &);
1681 template ELFFile<ELF32BE>::uintX_t getSymVA<ELF32BE>(const SymbolBody &);
1682 template ELFFile<ELF64LE>::uintX_t getSymVA<ELF64LE>(const SymbolBody &);
1683 template ELFFile<ELF64BE>::uintX_t getSymVA<ELF64BE>(const SymbolBody &);
1684 
1685 template uint32_t getLocalRelTarget(const ObjectFile<ELF32LE> &,
1686                                     const ELFFile<ELF32LE>::Elf_Rel &,
1687                                     uint32_t);
1688 template uint32_t getLocalRelTarget(const ObjectFile<ELF32BE> &,
1689                                     const ELFFile<ELF32BE>::Elf_Rel &,
1690                                     uint32_t);
1691 template uint64_t getLocalRelTarget(const ObjectFile<ELF64LE> &,
1692                                     const ELFFile<ELF64LE>::Elf_Rel &,
1693                                     uint64_t);
1694 template uint64_t getLocalRelTarget(const ObjectFile<ELF64BE> &,
1695                                     const ELFFile<ELF64BE>::Elf_Rel &,
1696                                     uint64_t);
1697 template uint32_t getLocalRelTarget(const ObjectFile<ELF32LE> &,
1698                                     const ELFFile<ELF32LE>::Elf_Rela &,
1699                                     uint32_t);
1700 template uint32_t getLocalRelTarget(const ObjectFile<ELF32BE> &,
1701                                     const ELFFile<ELF32BE>::Elf_Rela &,
1702                                     uint32_t);
1703 template uint64_t getLocalRelTarget(const ObjectFile<ELF64LE> &,
1704                                     const ELFFile<ELF64LE>::Elf_Rela &,
1705                                     uint64_t);
1706 template uint64_t getLocalRelTarget(const ObjectFile<ELF64BE> &,
1707                                     const ELFFile<ELF64BE>::Elf_Rela &,
1708                                     uint64_t);
1709 }
1710 }
1711