diff options
Diffstat (limited to 'lld/ELF/SyntheticSections.cpp')
-rw-r--r-- | lld/ELF/SyntheticSections.cpp | 205 |
1 files changed, 89 insertions, 116 deletions
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index a12a50626a5..1f86571c00e 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -154,7 +154,7 @@ template <class ELFT> void MipsOptionsSection<ELFT>::writeTo(uint8_t *Buf) { Options->size = getSize(); if (!Config->Relocatable) - Reginfo.ri_gp_value = InX::MipsGot->getGp(); + Reginfo.ri_gp_value = In.MipsGot->getGp(); memcpy(Buf + sizeof(Elf_Mips_Options), &Reginfo, sizeof(Reginfo)); } @@ -211,7 +211,7 @@ MipsReginfoSection<ELFT>::MipsReginfoSection(Elf_Mips_RegInfo Reginfo) template <class ELFT> void MipsReginfoSection<ELFT>::writeTo(uint8_t *Buf) { if (!Config->Relocatable) - Reginfo.ri_gp_value = InX::MipsGot->getGp(); + Reginfo.ri_gp_value = In.MipsGot->getGp(); memcpy(Buf, &Reginfo, sizeof(Reginfo)); } @@ -261,8 +261,8 @@ Defined *elf::addSyntheticLocal(StringRef Name, uint8_t Type, uint64_t Value, uint64_t Size, InputSectionBase &Section) { auto *S = make<Defined>(Section.File, Name, STB_LOCAL, STV_DEFAULT, Type, Value, Size, &Section); - if (InX::SymTab) - InX::SymTab->addSymbol(S); + if (In.SymTab) + In.SymTab->addSymbol(S); return S; } @@ -503,7 +503,7 @@ std::vector<EhFrameSection::FdeData> EhFrameSection::getFdeData() const { uint8_t *Buf = getParent()->Loc + OutSecOff; std::vector<FdeData> Ret; - uint64_t VA = InX::EhFrameHdr->getVA(); + uint64_t VA = In.EhFrameHdr->getVA(); for (CieRecord *Rec : CieRecords) { uint8_t Enc = getFdeEncoding(Rec->Cie); for (EhSectionPiece *Fde : Rec->Fdes) { @@ -938,7 +938,7 @@ template <class ELFT> void MipsGotSection::build() { Symbol *S = P.first; uint64_t Offset = P.second * Config->Wordsize; if (S->IsPreemptible) - InX::RelaDyn->addReloc(Target->TlsGotRel, this, Offset, S); + In.RelaDyn->addReloc(Target->TlsGotRel, this, Offset, S); } for (std::pair<Symbol *, size_t> &P : Got.DynTlsSymbols) { Symbol *S = P.first; @@ -946,7 +946,7 @@ template <class ELFT> void MipsGotSection::build() { if (S == nullptr) { if (!Config->Pic) continue; - InX::RelaDyn->addReloc(Target->TlsModuleIndexRel, this, Offset, S); + In.RelaDyn->addReloc(Target->TlsModuleIndexRel, this, Offset, S); } else { // When building a shared library we still need a dynamic relocation // for the module index. Therefore only checking for @@ -954,13 +954,13 @@ template <class ELFT> void MipsGotSection::build() { // thread-locals that have been marked as local through a linker script) if (!S->IsPreemptible && !Config->Pic) continue; - InX::RelaDyn->addReloc(Target->TlsModuleIndexRel, this, Offset, S); + In.RelaDyn->addReloc(Target->TlsModuleIndexRel, this, Offset, S); // However, we can skip writing the TLS offset reloc for non-preemptible // symbols since it is known even in shared libraries if (!S->IsPreemptible) continue; Offset += Config->Wordsize; - InX::RelaDyn->addReloc(Target->TlsOffsetRel, this, Offset, S); + In.RelaDyn->addReloc(Target->TlsOffsetRel, this, Offset, S); } } @@ -972,7 +972,7 @@ template <class ELFT> void MipsGotSection::build() { // Dynamic relocations for "global" entries. for (const std::pair<Symbol *, size_t> &P : Got.Global) { uint64_t Offset = P.second * Config->Wordsize; - InX::RelaDyn->addReloc(Target->RelativeRel, this, Offset, P.first); + In.RelaDyn->addReloc(Target->RelativeRel, this, Offset, P.first); } if (!Config->Pic) continue; @@ -982,14 +982,14 @@ template <class ELFT> void MipsGotSection::build() { size_t PageCount = L.second.Count; for (size_t PI = 0; PI < PageCount; ++PI) { uint64_t Offset = (L.second.FirstIndex + PI) * Config->Wordsize; - InX::RelaDyn->addReloc({Target->RelativeRel, this, Offset, L.first, - int64_t(PI * 0x10000)}); + In.RelaDyn->addReloc({Target->RelativeRel, this, Offset, L.first, + int64_t(PI * 0x10000)}); } } for (const std::pair<GotEntry, size_t> &P : Got.Local16) { uint64_t Offset = P.second * Config->Wordsize; - InX::RelaDyn->addReloc({Target->RelativeRel, this, Offset, true, - P.first.first, P.first.second}); + In.RelaDyn->addReloc({Target->RelativeRel, this, Offset, true, + P.first.first, P.first.second}); } } } @@ -1201,21 +1201,21 @@ DynamicSection<ELFT>::DynamicSection() // Add strings to .dynstr early so that .dynstr's size will be // fixed early. for (StringRef S : Config->FilterList) - addInt(DT_FILTER, InX::DynStrTab->addString(S)); + addInt(DT_FILTER, In.DynStrTab->addString(S)); for (StringRef S : Config->AuxiliaryList) - addInt(DT_AUXILIARY, InX::DynStrTab->addString(S)); + addInt(DT_AUXILIARY, In.DynStrTab->addString(S)); if (!Config->Rpath.empty()) addInt(Config->EnableNewDtags ? DT_RUNPATH : DT_RPATH, - InX::DynStrTab->addString(Config->Rpath)); + In.DynStrTab->addString(Config->Rpath)); for (InputFile *File : SharedFiles) { SharedFile<ELFT> *F = cast<SharedFile<ELFT>>(File); if (F->IsNeeded) - addInt(DT_NEEDED, InX::DynStrTab->addString(F->SoName)); + addInt(DT_NEEDED, In.DynStrTab->addString(F->SoName)); } if (!Config->SoName.empty()) - addInt(DT_SONAME, InX::DynStrTab->addString(Config->SoName)); + addInt(DT_SONAME, In.DynStrTab->addString(Config->SoName)); } template <class ELFT> @@ -1302,10 +1302,10 @@ template <class ELFT> void DynamicSection<ELFT>::finalizeContents() { if (!Config->Shared && !Config->Relocatable && !Config->ZRodynamic) addInt(DT_DEBUG, 0); - this->Link = InX::DynStrTab->getParent()->SectionIndex; - if (!InX::RelaDyn->empty()) { - addInSec(InX::RelaDyn->DynamicTag, InX::RelaDyn); - addSize(InX::RelaDyn->SizeDynamicTag, InX::RelaDyn->getParent()); + this->Link = In.DynStrTab->getParent()->SectionIndex; + if (!In.RelaDyn->empty()) { + addInSec(In.RelaDyn->DynamicTag, In.RelaDyn); + addSize(In.RelaDyn->SizeDynamicTag, In.RelaDyn->getParent()); bool IsRela = Config->IsRela; addInt(IsRela ? DT_RELAENT : DT_RELENT, @@ -1315,16 +1315,16 @@ template <class ELFT> void DynamicSection<ELFT>::finalizeContents() { // The problem is in the tight relation between dynamic // relocations and GOT. So do not emit this tag on MIPS. if (Config->EMachine != EM_MIPS) { - size_t NumRelativeRels = InX::RelaDyn->getRelativeRelocCount(); + size_t NumRelativeRels = In.RelaDyn->getRelativeRelocCount(); if (Config->ZCombreloc && NumRelativeRels) addInt(IsRela ? DT_RELACOUNT : DT_RELCOUNT, NumRelativeRels); } } - if (InX::RelrDyn && !InX::RelrDyn->Relocs.empty()) { + if (In.RelrDyn && !In.RelrDyn->Relocs.empty()) { addInSec(Config->UseAndroidRelrTags ? DT_ANDROID_RELR : DT_RELR, - InX::RelrDyn); + In.RelrDyn); addSize(Config->UseAndroidRelrTags ? DT_ANDROID_RELRSZ : DT_RELRSZ, - InX::RelrDyn->getParent()); + In.RelrDyn->getParent()); addInt(Config->UseAndroidRelrTags ? DT_ANDROID_RELRENT : DT_RELRENT, sizeof(Elf_Relr)); } @@ -1334,33 +1334,33 @@ template <class ELFT> void DynamicSection<ELFT>::finalizeContents() { // as RelaIplt have. And we still want to emit proper dynamic tags for that // case, so here we always use RelaPlt as marker for the begining of // .rel[a].plt section. - if (InX::RelaPlt->getParent()->Live) { - addInSec(DT_JMPREL, InX::RelaPlt); - addSize(DT_PLTRELSZ, InX::RelaPlt->getParent()); + if (In.RelaPlt->getParent()->Live) { + addInSec(DT_JMPREL, In.RelaPlt); + addSize(DT_PLTRELSZ, In.RelaPlt->getParent()); switch (Config->EMachine) { case EM_MIPS: - addInSec(DT_MIPS_PLTGOT, InX::GotPlt); + addInSec(DT_MIPS_PLTGOT, In.GotPlt); break; case EM_SPARCV9: - addInSec(DT_PLTGOT, InX::Plt); + addInSec(DT_PLTGOT, In.Plt); break; default: - addInSec(DT_PLTGOT, InX::GotPlt); + addInSec(DT_PLTGOT, In.GotPlt); break; } addInt(DT_PLTREL, Config->IsRela ? DT_RELA : DT_REL); } - addInSec(DT_SYMTAB, InX::DynSymTab); + addInSec(DT_SYMTAB, In.DynSymTab); addInt(DT_SYMENT, sizeof(Elf_Sym)); - addInSec(DT_STRTAB, InX::DynStrTab); - addInt(DT_STRSZ, InX::DynStrTab->getSize()); + addInSec(DT_STRTAB, In.DynStrTab); + addInt(DT_STRSZ, In.DynStrTab->getSize()); if (!Config->ZText) addInt(DT_TEXTREL, 0); - if (InX::GnuHashTab) - addInSec(DT_GNU_HASH, InX::GnuHashTab); - if (InX::HashTab) - addInSec(DT_HASH, InX::HashTab); + if (In.GnuHashTab) + addInSec(DT_GNU_HASH, In.GnuHashTab); + if (In.HashTab) + addInSec(DT_HASH, In.HashTab); if (Out::PreinitArray) { addOutSec(DT_PREINIT_ARRAY, Out::PreinitArray); @@ -1382,47 +1382,47 @@ template <class ELFT> void DynamicSection<ELFT>::finalizeContents() { if (B->isDefined()) addSym(DT_FINI, B); - bool HasVerNeed = In<ELFT>::VerNeed->getNeedNum() != 0; - if (HasVerNeed || In<ELFT>::VerDef) - addInSec(DT_VERSYM, In<ELFT>::VerSym); - if (In<ELFT>::VerDef) { - addInSec(DT_VERDEF, In<ELFT>::VerDef); + bool HasVerNeed = InX<ELFT>::VerNeed->getNeedNum() != 0; + if (HasVerNeed || InX<ELFT>::VerDef) + addInSec(DT_VERSYM, InX<ELFT>::VerSym); + if (InX<ELFT>::VerDef) { + addInSec(DT_VERDEF, InX<ELFT>::VerDef); addInt(DT_VERDEFNUM, getVerDefNum()); } if (HasVerNeed) { - addInSec(DT_VERNEED, In<ELFT>::VerNeed); - addInt(DT_VERNEEDNUM, In<ELFT>::VerNeed->getNeedNum()); + addInSec(DT_VERNEED, InX<ELFT>::VerNeed); + addInt(DT_VERNEEDNUM, InX<ELFT>::VerNeed->getNeedNum()); } if (Config->EMachine == EM_MIPS) { addInt(DT_MIPS_RLD_VERSION, 1); addInt(DT_MIPS_FLAGS, RHF_NOTPOT); addInt(DT_MIPS_BASE_ADDRESS, Target->getImageBase()); - addInt(DT_MIPS_SYMTABNO, InX::DynSymTab->getNumSymbols()); + addInt(DT_MIPS_SYMTABNO, In.DynSymTab->getNumSymbols()); - add(DT_MIPS_LOCAL_GOTNO, [] { return InX::MipsGot->getLocalEntriesNum(); }); + add(DT_MIPS_LOCAL_GOTNO, [] { return In.MipsGot->getLocalEntriesNum(); }); - if (const Symbol *B = InX::MipsGot->getFirstGlobalEntry()) + if (const Symbol *B = In.MipsGot->getFirstGlobalEntry()) addInt(DT_MIPS_GOTSYM, B->DynsymIndex); else - addInt(DT_MIPS_GOTSYM, InX::DynSymTab->getNumSymbols()); - addInSec(DT_PLTGOT, InX::MipsGot); - if (InX::MipsRldMap) { + addInt(DT_MIPS_GOTSYM, In.DynSymTab->getNumSymbols()); + addInSec(DT_PLTGOT, In.MipsGot); + if (In.MipsRldMap) { if (!Config->Pie) - addInSec(DT_MIPS_RLD_MAP, InX::MipsRldMap); + addInSec(DT_MIPS_RLD_MAP, In.MipsRldMap); // Store the offset to the .rld_map section // relative to the address of the tag. - addInSecRelative(DT_MIPS_RLD_MAP_REL, InX::MipsRldMap); + addInSecRelative(DT_MIPS_RLD_MAP_REL, In.MipsRldMap); } } // Glink dynamic tag is required by the V2 abi if the plt section isn't empty. - if (Config->EMachine == EM_PPC64 && !InX::Plt->empty()) { + if (Config->EMachine == EM_PPC64 && !In.Plt->empty()) { // The Glink tag points to 32 bytes before the first lazy symbol resolution // stub, which starts directly after the header. Entries.push_back({DT_PPC64_GLINK, [=] { unsigned Offset = Target->PltHeaderSize - 32; - return InX::Plt->getVA(0) + Offset; + return In.Plt->getVA(0) + Offset; }}); } @@ -1494,7 +1494,7 @@ void RelocationBaseSection::finalizeContents() { // If all relocations are R_*_RELATIVE they don't refer to any // dynamic symbol and we don't need a dynamic symbol table. If that // is the case, just use 0 as the link. - Link = InX::DynSymTab ? InX::DynSymTab->getParent()->SectionIndex : 0; + Link = In.DynSymTab ? In.DynSymTab->getParent()->SectionIndex : 0; // Set required output section properties. getParent()->Link = Link; @@ -1862,9 +1862,9 @@ void SymbolTableBaseSection::finalizeContents() { // Because the first symbol entry is a null entry, 1 is the first. getParent()->Info = 1; - if (InX::GnuHashTab) { + if (In.GnuHashTab) { // NB: It also sorts Symbols to meet the GNU hash table requirements. - InX::GnuHashTab->addSymbols(Symbols); + In.GnuHashTab->addSymbols(Symbols); } else if (Config->EMachine == EM_MIPS) { std::stable_sort(Symbols.begin(), Symbols.end(), sortMipsSymbols); } @@ -2044,7 +2044,7 @@ void SymtabShndxSection::writeTo(uint8_t *Buf) { // with an entry in .symtab. If the corresponding entry contains SHN_XINDEX, // we need to write actual index, otherwise, we must write SHN_UNDEF(0). Buf += 4; // Ignore .symtab[0] entry. - for (const SymbolTableEntry &Entry : InX::SymTab->getSymbols()) { + for (const SymbolTableEntry &Entry : In.SymTab->getSymbols()) { if (getSymSectionIndex(Entry.Sym) == SHN_XINDEX) write32(Buf, Entry.Sym->getOutputSection()->SectionIndex); Buf += 4; @@ -2065,11 +2065,11 @@ bool SymtabShndxSection::empty() const { } void SymtabShndxSection::finalizeContents() { - getParent()->Link = InX::SymTab->getParent()->SectionIndex; + getParent()->Link = In.SymTab->getParent()->SectionIndex; } size_t SymtabShndxSection::getSize() const { - return InX::SymTab->getNumSymbols() * 4; + return In.SymTab->getNumSymbols() * 4; } // .hash and .gnu.hash sections contain on-disk hash tables that map @@ -2108,7 +2108,7 @@ GnuHashTableSection::GnuHashTableSection() } void GnuHashTableSection::finalizeContents() { - getParent()->Link = InX::DynSymTab->getParent()->SectionIndex; + getParent()->Link = In.DynSymTab->getParent()->SectionIndex; // Computes bloom filter size in word size. We want to allocate 12 // bits for each symbol. It must be a power of two. @@ -2133,7 +2133,7 @@ void GnuHashTableSection::writeTo(uint8_t *Buf) { // Write a header. write32(Buf, NBuckets); - write32(Buf + 4, InX::DynSymTab->getNumSymbols() - Symbols.size()); + write32(Buf + 4, In.DynSymTab->getNumSymbols() - Symbols.size()); write32(Buf + 8, MaskWords); write32(Buf + 12, Shift2); Buf += 16; @@ -2238,13 +2238,13 @@ HashTableSection::HashTableSection() } void HashTableSection::finalizeContents() { - getParent()->Link = InX::DynSymTab->getParent()->SectionIndex; + getParent()->Link = In.DynSymTab->getParent()->SectionIndex; unsigned NumEntries = 2; // nbucket and nchain. - NumEntries += InX::DynSymTab->getNumSymbols(); // The chain entries. + NumEntries += In.DynSymTab->getNumSymbols(); // The chain entries. // Create as many buckets as there are symbols. - NumEntries += InX::DynSymTab->getNumSymbols(); + NumEntries += In.DynSymTab->getNumSymbols(); this->Size = NumEntries * 4; } @@ -2252,7 +2252,7 @@ void HashTableSection::writeTo(uint8_t *Buf) { // See comment in GnuHashTableSection::writeTo. memset(Buf, 0, Size); - unsigned NumSymbols = InX::DynSymTab->getNumSymbols(); + unsigned NumSymbols = In.DynSymTab->getNumSymbols(); uint32_t *P = reinterpret_cast<uint32_t *>(Buf); write32(P++, NumSymbols); // nbucket @@ -2261,7 +2261,7 @@ void HashTableSection::writeTo(uint8_t *Buf) { uint32_t *Buckets = P; uint32_t *Chains = P + NumSymbols; - for (const SymbolTableEntry &S : InX::DynSymTab->getSymbols()) { + for (const SymbolTableEntry &S : In.DynSymTab->getSymbols()) { Symbol *Sym = S.Sym; StringRef Name = Sym->getName(); unsigned I = Sym->DynsymIndex; @@ -2304,9 +2304,9 @@ void PltSection::writeTo(uint8_t *Buf) { template <class ELFT> void PltSection::addEntry(Symbol &Sym) { Sym.PltIndex = Entries.size(); - RelocationBaseSection *PltRelocSection = InX::RelaPlt; + RelocationBaseSection *PltRelocSection = In.RelaPlt; if (IsIplt) { - PltRelocSection = InX::RelaIplt; + PltRelocSection = In.RelaIplt; Sym.IsInIplt = true; } unsigned RelOff = @@ -2332,7 +2332,7 @@ void PltSection::addSymbols() { } unsigned PltSection::getPltRelocOff() const { - return IsIplt ? InX::Plt->getSize() : 0; + return IsIplt ? In.Plt->getSize() : 0; } // The string hash function for .gdb_index. @@ -2603,13 +2603,13 @@ EhFrameHeader::EhFrameHeader() void EhFrameHeader::writeTo(uint8_t *Buf) { typedef EhFrameSection::FdeData FdeData; - std::vector<FdeData> Fdes = InX::EhFrame->getFdeData(); + std::vector<FdeData> Fdes = In.EhFrame->getFdeData(); Buf[0] = 1; Buf[1] = DW_EH_PE_pcrel | DW_EH_PE_sdata4; Buf[2] = DW_EH_PE_udata4; Buf[3] = DW_EH_PE_datarel | DW_EH_PE_sdata4; - write32(Buf + 4, InX::EhFrame->getParent()->Addr - this->getVA() - 4); + write32(Buf + 4, In.EhFrame->getParent()->Addr - this->getVA() - 4); write32(Buf + 8, Fdes.size()); Buf += 12; @@ -2622,10 +2622,10 @@ void EhFrameHeader::writeTo(uint8_t *Buf) { size_t EhFrameHeader::getSize() const { // .eh_frame_hdr has a 12 bytes header followed by an array of FDEs. - return 12 + InX::EhFrame->NumFdes * 8; + return 12 + In.EhFrame->NumFdes * 8; } -bool EhFrameHeader::empty() const { return InX::EhFrame->empty(); } +bool EhFrameHeader::empty() const { return In.EhFrame->empty(); } template <class ELFT> VersionDefinitionSection<ELFT>::VersionDefinitionSection() @@ -2639,11 +2639,11 @@ static StringRef getFileDefName() { } template <class ELFT> void VersionDefinitionSection<ELFT>::finalizeContents() { - FileDefNameOff = InX::DynStrTab->addString(getFileDefName()); + FileDefNameOff = In.DynStrTab->addString(getFileDefName()); for (VersionDefinition &V : Config->VersionDefinitions) - V.NameOff = InX::DynStrTab->addString(V.Name); + V.NameOff = In.DynStrTab->addString(V.Name); - getParent()->Link = InX::DynStrTab->getParent()->SectionIndex; + getParent()->Link = In.DynStrTab->getParent()->SectionIndex; // sh_info should be set to the number of definitions. This fact is missed in // documentation, but confirmed by binutils community: @@ -2696,23 +2696,23 @@ VersionTableSection<ELFT>::VersionTableSection() template <class ELFT> void VersionTableSection<ELFT>::finalizeContents() { // At the moment of june 2016 GNU docs does not mention that sh_link field // should be set, but Sun docs do. Also readelf relies on this field. - getParent()->Link = InX::DynSymTab->getParent()->SectionIndex; + getParent()->Link = In.DynSymTab->getParent()->SectionIndex; } template <class ELFT> size_t VersionTableSection<ELFT>::getSize() const { - return sizeof(Elf_Versym) * (InX::DynSymTab->getSymbols().size() + 1); + return sizeof(Elf_Versym) * (In.DynSymTab->getSymbols().size() + 1); } template <class ELFT> void VersionTableSection<ELFT>::writeTo(uint8_t *Buf) { auto *OutVersym = reinterpret_cast<Elf_Versym *>(Buf) + 1; - for (const SymbolTableEntry &S : InX::DynSymTab->getSymbols()) { + for (const SymbolTableEntry &S : In.DynSymTab->getSymbols()) { OutVersym->vs_index = S.Sym->VersionId; ++OutVersym; } } template <class ELFT> bool VersionTableSection<ELFT>::empty() const { - return !In<ELFT>::VerDef && In<ELFT>::VerNeed->empty(); + return !InX<ELFT>::VerDef && InX<ELFT>::VerNeed->empty(); } template <class ELFT> @@ -2736,7 +2736,7 @@ template <class ELFT> void VersionNeedSection<ELFT>::addSymbol(Symbol *SS) { // to create one by adding it to our needed list and creating a dynstr entry // for the soname. if (File.VerdefMap.empty()) - Needed.push_back({&File, InX::DynStrTab->addString(File.SoName)}); + Needed.push_back({&File, In.DynStrTab->addString(File.SoName)}); const typename ELFT::Verdef *Ver = File.Verdefs[SS->VerdefIndex]; typename SharedFile<ELFT>::NeededVer &NV = File.VerdefMap[Ver]; @@ -2744,8 +2744,8 @@ template <class ELFT> void VersionNeedSection<ELFT>::addSymbol(Symbol *SS) { // prepare to create one by allocating a version identifier and creating a // dynstr entry for the version name. if (NV.Index == 0) { - NV.StrTab = InX::DynStrTab->addString(File.getStringTable().data() + - Ver->getAux()->vda_name); + NV.StrTab = In.DynStrTab->addString(File.getStringTable().data() + + Ver->getAux()->vda_name); NV.Index = NextIndex++; } SS->VersionId = NV.Index; @@ -2787,7 +2787,7 @@ template <class ELFT> void VersionNeedSection<ELFT>::writeTo(uint8_t *Buf) { } template <class ELFT> void VersionNeedSection<ELFT>::finalizeContents() { - getParent()->Link = InX::DynStrTab->getParent()->SectionIndex; + getParent()->Link = In.DynStrTab->getParent()->SectionIndex; getParent()->Info = Needed.size(); } @@ -3047,34 +3047,7 @@ bool ThunkSection::assignOffsets() { return Changed; } -InputSection *InX::ARMAttributes; -BssSection *InX::Bss; -BssSection *InX::BssRelRo; -BuildIdSection *InX::BuildId; -EhFrameHeader *InX::EhFrameHdr; -EhFrameSection *InX::EhFrame; -SyntheticSection *InX::Dynamic; -StringTableSection *InX::DynStrTab; -SymbolTableBaseSection *InX::DynSymTab; -InputSection *InX::Interp; -GdbIndexSection *InX::GdbIndex; -GotSection *InX::Got; -GotPltSection *InX::GotPlt; -GnuHashTableSection *InX::GnuHashTab; -HashTableSection *InX::HashTab; -IgotPltSection *InX::IgotPlt; -MipsGotSection *InX::MipsGot; -MipsRldMapSection *InX::MipsRldMap; -PltSection *InX::Plt; -PltSection *InX::Iplt; -RelocationBaseSection *InX::RelaDyn; -RelrBaseSection *InX::RelrDyn; -RelocationBaseSection *InX::RelaPlt; -RelocationBaseSection *InX::RelaIplt; -StringTableSection *InX::ShStrTab; -StringTableSection *InX::StrTab; -SymbolTableBaseSection *InX::SymTab; -SymtabShndxSection *InX::SymTabShndx; +InStruct elf::In; template GdbIndexSection *GdbIndexSection::create<ELF32LE>(); template GdbIndexSection *GdbIndexSection::create<ELF32BE>(); |