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