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