forked from OSchip/llvm-project
parent
6827de19b2
commit
9328b2cdde
|
@ -74,9 +74,9 @@ using namespace llvm::object;
|
|||
namespace lld {
|
||||
namespace elf {
|
||||
template <class ELFT> class ICF {
|
||||
typedef typename ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::Shdr Elf_Shdr;
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
typedef Elf_Rel_Impl<ELFT, false> Elf_Rel;
|
||||
|
||||
using Comparator = std::function<bool(const InputSection<ELFT> *,
|
||||
|
|
|
@ -45,8 +45,7 @@ ELFKind ELFFileBase<ELFT>::getELFKind() {
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
typename ELFFileBase<ELFT>::Elf_Sym_Range
|
||||
ELFFileBase<ELFT>::getElfSymbols(bool OnlyGlobals) {
|
||||
typename ELFT::SymRange ELFFileBase<ELFT>::getElfSymbols(bool OnlyGlobals) {
|
||||
if (!Symtab)
|
||||
return Elf_Sym_Range(nullptr, nullptr);
|
||||
Elf_Sym_Range Syms = ELFObj.symbols(Symtab);
|
||||
|
@ -141,9 +140,8 @@ elf::ObjectFile<ELFT>::getShtGroupEntries(const Elf_Shdr &Sec) {
|
|||
return Entries.slice(1);
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
static bool shouldMerge(const typename ELFFile<ELFT>::Elf_Shdr &Sec) {
|
||||
typedef typename ELFFile<ELFT>::uintX_t uintX_t;
|
||||
template <class ELFT> static bool shouldMerge(const typename ELFT::Shdr &Sec) {
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
uintX_t Flags = Sec.sh_flags;
|
||||
if (!(Flags & SHF_MERGE))
|
||||
return false;
|
||||
|
@ -370,7 +368,7 @@ SharedFile<ELFT>::SharedFile(MemoryBufferRef M)
|
|||
: ELFFileBase<ELFT>(Base::SharedKind, M), AsNeeded(Config->AsNeeded) {}
|
||||
|
||||
template <class ELFT>
|
||||
const typename ELFFile<ELFT>::Elf_Shdr *
|
||||
const typename ELFT::Shdr *
|
||||
SharedFile<ELFT>::getSection(const Elf_Sym &Sym) const {
|
||||
uint32_t Index = this->getSectionIndex(Sym);
|
||||
if (Index == 0)
|
||||
|
@ -381,8 +379,8 @@ SharedFile<ELFT>::getSection(const Elf_Sym &Sym) const {
|
|||
// Partially parse the shared object file so that we can call
|
||||
// getSoName on this object.
|
||||
template <class ELFT> void SharedFile<ELFT>::parseSoName() {
|
||||
typedef typename ELFFile<ELFT>::Elf_Dyn Elf_Dyn;
|
||||
typedef typename ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::Dyn Elf_Dyn;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
const Elf_Shdr *DynamicSec = nullptr;
|
||||
|
||||
const ELFFile<ELFT> Obj = this->ELFObj;
|
||||
|
|
|
@ -56,10 +56,10 @@ private:
|
|||
|
||||
template <typename ELFT> class ELFFileBase : public InputFile {
|
||||
public:
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Word Elf_Word;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range;
|
||||
typedef typename ELFT::Shdr Elf_Shdr;
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
typedef typename ELFT::Word Elf_Word;
|
||||
typedef typename ELFT::SymRange Elf_Sym_Range;
|
||||
|
||||
ELFFileBase(Kind K, MemoryBufferRef M);
|
||||
static bool classof(const InputFile *F) {
|
||||
|
@ -92,11 +92,11 @@ protected:
|
|||
// .o file.
|
||||
template <class ELFT> class ObjectFile : public ELFFileBase<ELFT> {
|
||||
typedef ELFFileBase<ELFT> Base;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Word Elf_Word;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
typedef typename ELFT::Shdr Elf_Shdr;
|
||||
typedef typename ELFT::SymRange Elf_Sym_Range;
|
||||
typedef typename ELFT::Word Elf_Word;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
StringRef getShtGroupSignature(const Elf_Shdr &Sec);
|
||||
ArrayRef<Elf_Word> getShtGroupEntries(const Elf_Shdr &Sec);
|
||||
|
@ -193,10 +193,10 @@ private:
|
|||
// .so file.
|
||||
template <class ELFT> class SharedFile : public ELFFileBase<ELFT> {
|
||||
typedef ELFFileBase<ELFT> Base;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Word Elf_Word;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range;
|
||||
typedef typename ELFT::Shdr Elf_Shdr;
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
typedef typename ELFT::Word Elf_Word;
|
||||
typedef typename ELFT::SymRange Elf_Sym_Range;
|
||||
|
||||
std::vector<SharedSymbol<ELFT>> SymbolBodies;
|
||||
std::vector<StringRef> Undefs;
|
||||
|
|
|
@ -48,8 +48,7 @@ ArrayRef<uint8_t> InputSectionBase<ELFT>::getSectionData() const {
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
typename ELFFile<ELFT>::uintX_t
|
||||
InputSectionBase<ELFT>::getOffset(uintX_t Offset) {
|
||||
typename ELFT::uint InputSectionBase<ELFT>::getOffset(uintX_t Offset) {
|
||||
switch (SectionKind) {
|
||||
case Regular:
|
||||
return cast<InputSection<ELFT>>(this)->OutSecOff + Offset;
|
||||
|
@ -66,8 +65,7 @@ InputSectionBase<ELFT>::getOffset(uintX_t Offset) {
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
typename ELFFile<ELFT>::uintX_t
|
||||
InputSectionBase<ELFT>::getOffset(const Elf_Sym &Sym) {
|
||||
typename ELFT::uint InputSectionBase<ELFT>::getOffset(const Elf_Sym &Sym) {
|
||||
return getOffset(Sym.st_value);
|
||||
}
|
||||
|
||||
|
@ -362,8 +360,7 @@ bool EHInputSection<ELFT>::classof(const InputSectionBase<ELFT> *S) {
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
typename EHInputSection<ELFT>::uintX_t
|
||||
EHInputSection<ELFT>::getOffset(uintX_t Offset) {
|
||||
typename ELFT::uint EHInputSection<ELFT>::getOffset(uintX_t Offset) {
|
||||
// The file crtbeginT.o has relocations pointing to the start of an empty
|
||||
// .eh_frame that is known to be the first in the link. It does that to
|
||||
// identify the start of the output .eh_frame. Handle this special case.
|
||||
|
@ -389,9 +386,8 @@ bool MergeInputSection<ELFT>::classof(const InputSectionBase<ELFT> *S) {
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
std::pair<std::pair<typename ELFFile<ELFT>::uintX_t,
|
||||
typename ELFFile<ELFT>::uintX_t> *,
|
||||
typename ELFFile<ELFT>::uintX_t>
|
||||
std::pair<std::pair<typename ELFT::uint, typename ELFT::uint> *,
|
||||
typename ELFT::uint>
|
||||
SplitInputSection<ELFT>::getRangeAndSize(uintX_t Offset) {
|
||||
ArrayRef<uint8_t> D = this->getSectionData();
|
||||
StringRef Data((const char *)D.data(), D.size());
|
||||
|
@ -411,8 +407,7 @@ SplitInputSection<ELFT>::getRangeAndSize(uintX_t Offset) {
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
typename MergeInputSection<ELFT>::uintX_t
|
||||
MergeInputSection<ELFT>::getOffset(uintX_t Offset) {
|
||||
typename ELFT::uint MergeInputSection<ELFT>::getOffset(uintX_t Offset) {
|
||||
std::pair<std::pair<uintX_t, uintX_t> *, uintX_t> T =
|
||||
this->getRangeAndSize(Offset);
|
||||
std::pair<uintX_t, uintX_t> *I = T.first;
|
||||
|
|
|
@ -26,11 +26,11 @@ template <class ELFT> class OutputSectionBase;
|
|||
// This corresponds to a section of an input file.
|
||||
template <class ELFT> class InputSectionBase {
|
||||
protected:
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Rel Elf_Rel;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Rela Elf_Rela;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::Rel Elf_Rel;
|
||||
typedef typename ELFT::Rela Elf_Rela;
|
||||
typedef typename ELFT::Shdr Elf_Shdr;
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
const Elf_Shdr *Header;
|
||||
|
||||
// The file this section is from.
|
||||
|
@ -94,8 +94,8 @@ InputSectionBase<ELFT> *
|
|||
// and each piece is copied to a different place in the output.
|
||||
// This class represents such special sections.
|
||||
template <class ELFT> class SplitInputSection : public InputSectionBase<ELFT> {
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::Shdr Elf_Shdr;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
public:
|
||||
SplitInputSection(ObjectFile<ELFT> *File, const Elf_Shdr *Header,
|
||||
|
@ -111,9 +111,9 @@ public:
|
|||
|
||||
// This corresponds to a SHF_MERGE section of an input file.
|
||||
template <class ELFT> class MergeInputSection : public SplitInputSection<ELFT> {
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
typedef typename ELFT::Shdr Elf_Shdr;
|
||||
|
||||
public:
|
||||
MergeInputSection(ObjectFile<ELFT> *F, const Elf_Shdr *Header);
|
||||
|
@ -126,8 +126,8 @@ public:
|
|||
// This corresponds to a .eh_frame section of an input file.
|
||||
template <class ELFT> class EHInputSection : public SplitInputSection<ELFT> {
|
||||
public:
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::Shdr Elf_Shdr;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
EHInputSection(ObjectFile<ELFT> *F, const Elf_Shdr *Header);
|
||||
static bool classof(const InputSectionBase<ELFT> *S);
|
||||
|
||||
|
@ -143,11 +143,11 @@ public:
|
|||
template <class ELFT> class InputSection : public InputSectionBase<ELFT> {
|
||||
friend ICF<ELFT>;
|
||||
typedef InputSectionBase<ELFT> Base;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Rela Elf_Rela;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Rel Elf_Rel;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::Shdr Elf_Shdr;
|
||||
typedef typename ELFT::Rela Elf_Rela;
|
||||
typedef typename ELFT::Rel Elf_Rel;
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
public:
|
||||
InputSection(ObjectFile<ELFT> *F, const Elf_Shdr *Header);
|
||||
|
@ -186,7 +186,7 @@ private:
|
|||
// ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
|
||||
template <class ELFT>
|
||||
class MipsReginfoInputSection : public InputSectionBase<ELFT> {
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename ELFT::Shdr Elf_Shdr;
|
||||
|
||||
public:
|
||||
MipsReginfoInputSection(ObjectFile<ELFT> *F, const Elf_Shdr *Hdr);
|
||||
|
|
|
@ -42,9 +42,9 @@ using namespace lld::elf;
|
|||
template <class ELFT>
|
||||
static void forEachSuccessor(InputSection<ELFT> *Sec,
|
||||
std::function<void(InputSectionBase<ELFT> *)> Fn) {
|
||||
typedef typename ELFFile<ELFT>::Elf_Rel Elf_Rel;
|
||||
typedef typename ELFFile<ELFT>::Elf_Rela Elf_Rela;
|
||||
typedef typename ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename ELFT::Rel Elf_Rel;
|
||||
typedef typename ELFT::Rela Elf_Rela;
|
||||
typedef typename ELFT::Shdr Elf_Shdr;
|
||||
|
||||
ELFFile<ELFT> &Obj = Sec->getFile()->getObj();
|
||||
for (const Elf_Shdr *RelSec : Sec->RelocSections) {
|
||||
|
|
|
@ -244,7 +244,7 @@ void RelocationSection<ELFT>::addReloc(const DynamicReloc<ELFT> &Reloc) {
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
typename ELFFile<ELFT>::uintX_t DynamicReloc<ELFT>::getOffset() const {
|
||||
typename ELFT::uint DynamicReloc<ELFT>::getOffset() const {
|
||||
switch (OKind) {
|
||||
case Off_GTlsIndex:
|
||||
return Out<ELFT>::Got->getGlobalDynAddr(*Sym);
|
||||
|
@ -1027,7 +1027,7 @@ uint8_t EHOutputSection<ELFT>::getFdeEncoding(ArrayRef<uint8_t> D) {
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
static typename ELFFile<ELFT>::uintX_t readEntryLength(ArrayRef<uint8_t> D) {
|
||||
static typename ELFT::uint readEntryLength(ArrayRef<uint8_t> D) {
|
||||
const endianness E = ELFT::TargetEndianness;
|
||||
if (D.size() < 4)
|
||||
fatal("CIE/FDE too small");
|
||||
|
@ -1140,9 +1140,8 @@ void EHOutputSection<ELFT>::addSection(InputSectionBase<ELFT> *C) {
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
static typename ELFFile<ELFT>::uintX_t writeAlignedCieOrFde(StringRef Data,
|
||||
uint8_t *Buf) {
|
||||
typedef typename ELFFile<ELFT>::uintX_t uintX_t;
|
||||
static typename ELFT::uint writeAlignedCieOrFde(StringRef Data, uint8_t *Buf) {
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
const endianness E = ELFT::TargetEndianness;
|
||||
uint64_t Len = alignTo(Data.size(), sizeof(uintX_t));
|
||||
write32<E>(Buf, Len - 4);
|
||||
|
@ -1401,8 +1400,7 @@ void SymbolTableSection<ELFT>::writeLocalSymbols(uint8_t *&Buf) {
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
static const typename llvm::object::ELFFile<ELFT>::Elf_Sym *
|
||||
getElfSym(SymbolBody &Body) {
|
||||
static const typename ELFT::Sym *getElfSym(SymbolBody &Body) {
|
||||
if (auto *EBody = dyn_cast<DefinedElf<ELFT>>(&Body))
|
||||
return &EBody->Sym;
|
||||
if (auto *EBody = dyn_cast<UndefinedElf<ELFT>>(&Body))
|
||||
|
|
|
@ -33,14 +33,12 @@ template <class ELFT> class ObjectFile;
|
|||
template <class ELFT> class DefinedRegular;
|
||||
|
||||
template <class ELFT>
|
||||
static inline typename llvm::object::ELFFile<ELFT>::uintX_t
|
||||
getAddend(const typename llvm::object::ELFFile<ELFT>::Elf_Rel &Rel) {
|
||||
static inline typename ELFT::uint getAddend(const typename ELFT::Rel &Rel) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
static inline typename llvm::object::ELFFile<ELFT>::uintX_t
|
||||
getAddend(const typename llvm::object::ELFFile<ELFT>::Elf_Rela &Rel) {
|
||||
static inline typename ELFT::uint getAddend(const typename ELFT::Rela &Rel) {
|
||||
return Rel.r_addend;
|
||||
}
|
||||
|
||||
|
@ -53,8 +51,8 @@ bool isValidCIdentifier(StringRef S);
|
|||
// non-overlapping file offsets and VAs.
|
||||
template <class ELFT> class OutputSectionBase {
|
||||
public:
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
typedef typename ELFT::Shdr Elf_Shdr;
|
||||
|
||||
OutputSectionBase(StringRef Name, uint32_t Type, uintX_t Flags);
|
||||
void setVA(uintX_t VA) { Header.sh_addr = VA; }
|
||||
|
@ -95,7 +93,7 @@ protected:
|
|||
|
||||
template <class ELFT> class GotSection final : public OutputSectionBase<ELFT> {
|
||||
typedef OutputSectionBase<ELFT> Base;
|
||||
typedef typename Base::uintX_t uintX_t;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
public:
|
||||
GotSection();
|
||||
|
@ -134,7 +132,7 @@ private:
|
|||
|
||||
template <class ELFT>
|
||||
class GotPltSection final : public OutputSectionBase<ELFT> {
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
public:
|
||||
GotPltSection();
|
||||
|
@ -149,7 +147,7 @@ private:
|
|||
|
||||
template <class ELFT> class PltSection final : public OutputSectionBase<ELFT> {
|
||||
typedef OutputSectionBase<ELFT> Base;
|
||||
typedef typename Base::uintX_t uintX_t;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
public:
|
||||
PltSection();
|
||||
|
@ -163,7 +161,7 @@ private:
|
|||
};
|
||||
|
||||
template <class ELFT> struct DynamicReloc {
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
uint32_t Type;
|
||||
|
||||
// Where the relocation is.
|
||||
|
@ -201,10 +199,10 @@ template <class ELFT> struct DynamicReloc {
|
|||
template <class ELFT>
|
||||
class SymbolTableSection final : public OutputSectionBase<ELFT> {
|
||||
public:
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::Shdr Elf_Shdr;
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
typedef typename ELFT::SymRange Elf_Sym_Range;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
SymbolTableSection(SymbolTable<ELFT> &Table,
|
||||
StringTableSection<ELFT> &StrTabSec);
|
||||
|
||||
|
@ -236,9 +234,9 @@ private:
|
|||
|
||||
template <class ELFT>
|
||||
class RelocationSection final : public OutputSectionBase<ELFT> {
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Rel Elf_Rel;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Rela Elf_Rela;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::Rel Elf_Rel;
|
||||
typedef typename ELFT::Rela Elf_Rela;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
public:
|
||||
RelocationSection(StringRef Name);
|
||||
|
@ -257,11 +255,11 @@ private:
|
|||
template <class ELFT>
|
||||
class OutputSection final : public OutputSectionBase<ELFT> {
|
||||
public:
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Rel Elf_Rel;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Rela Elf_Rela;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::Shdr Elf_Shdr;
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
typedef typename ELFT::Rel Elf_Rel;
|
||||
typedef typename ELFT::Rela Elf_Rela;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
OutputSection(StringRef Name, uint32_t Type, uintX_t Flags);
|
||||
void addSection(InputSectionBase<ELFT> *C) override;
|
||||
void sortInitFini();
|
||||
|
@ -276,7 +274,7 @@ private:
|
|||
|
||||
template <class ELFT>
|
||||
class MergeOutputSection final : public OutputSectionBase<ELFT> {
|
||||
typedef typename OutputSectionBase<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
bool shouldTailMerge() const;
|
||||
|
||||
|
@ -294,7 +292,7 @@ private:
|
|||
|
||||
// FDE or CIE
|
||||
template <class ELFT> struct EHRegion {
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
EHRegion(EHInputSection<ELFT> *S, unsigned Index);
|
||||
StringRef data() const;
|
||||
EHInputSection<ELFT> *S;
|
||||
|
@ -310,10 +308,10 @@ template <class ELFT> struct Cie : public EHRegion<ELFT> {
|
|||
template <class ELFT>
|
||||
class EHOutputSection final : public OutputSectionBase<ELFT> {
|
||||
public:
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Rel Elf_Rel;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Rela Elf_Rela;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
typedef typename ELFT::Shdr Elf_Shdr;
|
||||
typedef typename ELFT::Rel Elf_Rel;
|
||||
typedef typename ELFT::Rela Elf_Rela;
|
||||
EHOutputSection(StringRef Name, uint32_t Type, uintX_t Flags);
|
||||
void writeTo(uint8_t *Buf) override;
|
||||
|
||||
|
@ -343,7 +341,7 @@ public:
|
|||
template <class ELFT>
|
||||
class StringTableSection final : public OutputSectionBase<ELFT> {
|
||||
public:
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
StringTableSection(StringRef Name, bool Dynamic);
|
||||
unsigned addString(StringRef S, bool HashIt = true);
|
||||
void writeTo(uint8_t *Buf) override;
|
||||
|
@ -360,7 +358,7 @@ private:
|
|||
|
||||
template <class ELFT>
|
||||
class HashTableSection final : public OutputSectionBase<ELFT> {
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Word Elf_Word;
|
||||
typedef typename ELFT::Word Elf_Word;
|
||||
|
||||
public:
|
||||
HashTableSection();
|
||||
|
@ -372,9 +370,9 @@ public:
|
|||
// https://blogs.oracle.com/ali/entry/gnu_hash_elf_sections
|
||||
template <class ELFT>
|
||||
class GnuHashTableSection final : public OutputSectionBase<ELFT> {
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Off Elf_Off;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Word Elf_Word;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::Off Elf_Off;
|
||||
typedef typename ELFT::Word Elf_Word;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
public:
|
||||
GnuHashTableSection();
|
||||
|
@ -409,12 +407,12 @@ private:
|
|||
template <class ELFT>
|
||||
class DynamicSection final : public OutputSectionBase<ELFT> {
|
||||
typedef OutputSectionBase<ELFT> Base;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Dyn Elf_Dyn;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Rel Elf_Rel;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Rela Elf_Rela;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::Dyn Elf_Dyn;
|
||||
typedef typename ELFT::Rel Elf_Rel;
|
||||
typedef typename ELFT::Rela Elf_Rela;
|
||||
typedef typename ELFT::Shdr Elf_Shdr;
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
// The .dynamic section contains information for the dynamic linker.
|
||||
// The section consists of fixed size entries, which consist of
|
||||
|
@ -477,7 +475,7 @@ private:
|
|||
// http://www.airs.com/blog/archives/462 (".eh_frame_hdr")
|
||||
template <class ELFT>
|
||||
class EhFrameHeader final : public OutputSectionBase<ELFT> {
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
public:
|
||||
EhFrameHeader();
|
||||
|
@ -519,8 +517,8 @@ private:
|
|||
// globally accessible. Writer initializes them, so don't use them
|
||||
// until Writer is initialized.
|
||||
template <class ELFT> struct Out {
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Phdr Elf_Phdr;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
typedef typename ELFT::Phdr Elf_Phdr;
|
||||
static BuildIdSection<ELFT> *BuildId;
|
||||
static DynamicSection<ELFT> *Dynamic;
|
||||
static EhFrameHeader<ELFT> *EhFrameHdr;
|
||||
|
@ -566,7 +564,7 @@ template <class ELFT> StringTableSection<ELFT> *Out<ELFT>::ShStrTab;
|
|||
template <class ELFT> StringTableSection<ELFT> *Out<ELFT>::StrTab;
|
||||
template <class ELFT> SymbolTableSection<ELFT> *Out<ELFT>::DynSymTab;
|
||||
template <class ELFT> SymbolTableSection<ELFT> *Out<ELFT>::SymTab;
|
||||
template <class ELFT> typename Out<ELFT>::Elf_Phdr *Out<ELFT>::TlsPhdr;
|
||||
template <class ELFT> typename ELFT::Phdr *Out<ELFT>::TlsPhdr;
|
||||
template <class ELFT> OutputSectionBase<ELFT> *Out<ELFT>::ElfHeader;
|
||||
template <class ELFT> OutputSectionBase<ELFT> *Out<ELFT>::ProgramHeaders;
|
||||
|
||||
|
|
|
@ -35,8 +35,8 @@ class Undefined;
|
|||
// undefined, it'll read an archive member to read a real definition
|
||||
// to replace the lazy symbol. The logic is implemented in resolve().
|
||||
template <class ELFT> class SymbolTable {
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
public:
|
||||
void addFile(std::unique_ptr<InputFile> File);
|
||||
|
|
|
@ -29,10 +29,10 @@ using namespace lld;
|
|||
using namespace lld::elf;
|
||||
|
||||
template <class ELFT>
|
||||
static typename ELFFile<ELFT>::uintX_t
|
||||
getSymVA(const SymbolBody &Body, typename ELFFile<ELFT>::uintX_t &Addend) {
|
||||
typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename ELFFile<ELFT>::uintX_t uintX_t;
|
||||
static typename ELFT::uint getSymVA(const SymbolBody &Body,
|
||||
typename ELFT::uint &Addend) {
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
switch (Body.kind()) {
|
||||
case SymbolBody::DefinedSyntheticKind: {
|
||||
|
@ -119,32 +119,26 @@ template <class ELFT> bool SymbolBody::isGnuIfunc() const {
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
typename ELFFile<ELFT>::uintX_t
|
||||
SymbolBody::getVA(typename ELFFile<ELFT>::uintX_t Addend) const {
|
||||
typename ELFT::uint SymbolBody::getVA(typename ELFT::uint Addend) const {
|
||||
return getSymVA<ELFT>(*this, Addend) + Addend;
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
typename ELFFile<ELFT>::uintX_t SymbolBody::getGotVA() const {
|
||||
template <class ELFT> typename ELFT::uint SymbolBody::getGotVA() const {
|
||||
return Out<ELFT>::Got->getVA() +
|
||||
(Out<ELFT>::Got->getMipsLocalEntriesNum() + GotIndex) *
|
||||
sizeof(typename ELFFile<ELFT>::uintX_t);
|
||||
sizeof(typename ELFT::uint);
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
typename ELFFile<ELFT>::uintX_t SymbolBody::getGotPltVA() const {
|
||||
return Out<ELFT>::GotPlt->getVA() +
|
||||
GotPltIndex * sizeof(typename ELFFile<ELFT>::uintX_t);
|
||||
template <class ELFT> typename ELFT::uint SymbolBody::getGotPltVA() const {
|
||||
return Out<ELFT>::GotPlt->getVA() + GotPltIndex * sizeof(typename ELFT::uint);
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
typename ELFFile<ELFT>::uintX_t SymbolBody::getPltVA() const {
|
||||
template <class ELFT> typename ELFT::uint SymbolBody::getPltVA() const {
|
||||
return Out<ELFT>::Plt->getVA() + Target->PltZeroSize +
|
||||
PltIndex * Target->PltEntrySize;
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
typename ELFFile<ELFT>::uintX_t SymbolBody::getSize() const {
|
||||
template <class ELFT> typename ELFT::uint SymbolBody::getSize() const {
|
||||
if (auto *B = dyn_cast<DefinedElf<ELFT>>(this))
|
||||
return B->Sym.st_size;
|
||||
return 0;
|
||||
|
|
|
@ -91,16 +91,12 @@ public:
|
|||
bool isInPlt() const { return PltIndex != -1U; }
|
||||
|
||||
template <class ELFT>
|
||||
typename llvm::object::ELFFile<ELFT>::uintX_t
|
||||
getVA(typename llvm::object::ELFFile<ELFT>::uintX_t Addend = 0) const;
|
||||
template <class ELFT>
|
||||
typename llvm::object::ELFFile<ELFT>::uintX_t getGotVA() const;
|
||||
template <class ELFT>
|
||||
typename llvm::object::ELFFile<ELFT>::uintX_t getGotPltVA() const;
|
||||
template <class ELFT>
|
||||
typename llvm::object::ELFFile<ELFT>::uintX_t getPltVA() const;
|
||||
template <class ELFT>
|
||||
typename llvm::object::ELFFile<ELFT>::uintX_t getSize() const;
|
||||
typename ELFT::uint getVA(typename ELFT::uint Addend = 0) const;
|
||||
|
||||
template <class ELFT> typename ELFT::uint getGotVA() const;
|
||||
template <class ELFT> typename ELFT::uint getGotPltVA() const;
|
||||
template <class ELFT> typename ELFT::uint getPltVA() const;
|
||||
template <class ELFT> typename ELFT::uint getSize() const;
|
||||
|
||||
// A SymbolBody has a backreference to a Symbol. Originally they are
|
||||
// doubly-linked. A backreference will never change. But the pointer
|
||||
|
@ -165,7 +161,7 @@ public:
|
|||
// Any defined symbol from an ELF file.
|
||||
template <class ELFT> class DefinedElf : public Defined {
|
||||
protected:
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
|
||||
public:
|
||||
DefinedElf(Kind K, StringRef N, const Elf_Sym &Sym)
|
||||
|
@ -207,7 +203,7 @@ public:
|
|||
|
||||
// Regular defined symbols read from object file symbol tables.
|
||||
template <class ELFT> class DefinedRegular : public DefinedElf<ELFT> {
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
|
||||
public:
|
||||
DefinedRegular(StringRef N, const Elf_Sym &Sym,
|
||||
|
@ -240,8 +236,8 @@ InputSectionBase<ELFT> *DefinedRegular<ELFT>::NullInputSection;
|
|||
// takes an output section to calculate output VA, etc.
|
||||
template <class ELFT> class DefinedSynthetic : public Defined {
|
||||
public:
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
DefinedSynthetic(StringRef N, uintX_t Value, OutputSectionBase<ELFT> &Section,
|
||||
uint8_t Visibility);
|
||||
|
||||
|
@ -271,7 +267,7 @@ public:
|
|||
};
|
||||
|
||||
template <class ELFT> class UndefinedElf : public Undefined {
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
|
||||
public:
|
||||
UndefinedElf(StringRef N, const Elf_Sym &Sym);
|
||||
|
@ -283,8 +279,8 @@ public:
|
|||
};
|
||||
|
||||
template <class ELFT> class SharedSymbol : public DefinedElf<ELFT> {
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
public:
|
||||
static bool classof(const SymbolBody *S) {
|
||||
|
@ -332,7 +328,7 @@ private:
|
|||
// DefinedRegular symbols, so they need Elf_Sym symbols.
|
||||
// Here we allocate such Elf_Sym symbols statically.
|
||||
template <class ELFT> struct ElfSym {
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
|
||||
// Used to represent an undefined symbol which we don't want to add to the
|
||||
// output file's symbol table. It has weak binding and can be substituted.
|
||||
|
@ -356,14 +352,13 @@ template <class ELFT> struct ElfSym {
|
|||
static Elf_Sym RelaIpltEnd;
|
||||
};
|
||||
|
||||
template <class ELFT> typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::Ignored;
|
||||
template <class ELFT> typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::Etext;
|
||||
template <class ELFT> typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::Edata;
|
||||
template <class ELFT> typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::End;
|
||||
template <class ELFT> typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::MipsGp;
|
||||
template <class ELFT>
|
||||
typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::RelaIpltStart;
|
||||
template <class ELFT> typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::RelaIpltEnd;
|
||||
template <class ELFT> typename ELFT::Sym ElfSym<ELFT>::Ignored;
|
||||
template <class ELFT> typename ELFT::Sym ElfSym<ELFT>::Etext;
|
||||
template <class ELFT> typename ELFT::Sym ElfSym<ELFT>::Edata;
|
||||
template <class ELFT> typename ELFT::Sym ElfSym<ELFT>::End;
|
||||
template <class ELFT> typename ELFT::Sym ElfSym<ELFT>::MipsGp;
|
||||
template <class ELFT> typename ELFT::Sym ElfSym<ELFT>::RelaIpltStart;
|
||||
template <class ELFT> typename ELFT::Sym ElfSym<ELFT>::RelaIpltEnd;
|
||||
|
||||
} // namespace elf
|
||||
} // namespace lld
|
||||
|
|
|
@ -1578,8 +1578,8 @@ uint32_t MipsTargetInfo<ELFT>::getDynRel(uint32_t Type) const {
|
|||
|
||||
template <class ELFT>
|
||||
void MipsTargetInfo<ELFT>::writeGotHeader(uint8_t *Buf) const {
|
||||
typedef typename ELFFile<ELFT>::Elf_Off Elf_Off;
|
||||
typedef typename ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::Off Elf_Off;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
// Set the MSB of the second GOT slot. This is not required by any
|
||||
// MIPS ABI documentation, though.
|
||||
|
@ -1793,7 +1793,7 @@ bool MipsTargetInfo<ELFT>::isRelRelative(uint32_t Type) const {
|
|||
// _gp is a MIPS-specific ABI-defined symbol which points to
|
||||
// a location that is relative to GOT. This function returns
|
||||
// the value for the symbol.
|
||||
template <class ELFT> typename ELFFile<ELFT>::uintX_t getMipsGpAddr() {
|
||||
template <class ELFT> typename ELFT::uint getMipsGpAddr() {
|
||||
unsigned GPOffset = 0x7ff0;
|
||||
if (uint64_t V = Out<ELFT>::Got->getVA())
|
||||
return V + GPOffset;
|
||||
|
|
|
@ -104,8 +104,7 @@ private:
|
|||
|
||||
uint64_t getPPC64TocBase();
|
||||
|
||||
template <class ELFT>
|
||||
typename llvm::object::ELFFile<ELFT>::uintX_t getMipsGpAddr();
|
||||
template <class ELFT> typename ELFT::uint getMipsGpAddr();
|
||||
|
||||
extern TargetInfo *Target;
|
||||
TargetInfo *createTarget();
|
||||
|
|
|
@ -32,13 +32,13 @@ namespace {
|
|||
// The writer writes a SymbolTable result to a file.
|
||||
template <class ELFT> class Writer {
|
||||
public:
|
||||
typedef typename ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename ELFFile<ELFT>::Elf_Ehdr Elf_Ehdr;
|
||||
typedef typename ELFFile<ELFT>::Elf_Phdr Elf_Phdr;
|
||||
typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym;
|
||||
typedef typename ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range;
|
||||
typedef typename ELFFile<ELFT>::Elf_Rela Elf_Rela;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
typedef typename ELFT::Shdr Elf_Shdr;
|
||||
typedef typename ELFT::Ehdr Elf_Ehdr;
|
||||
typedef typename ELFT::Phdr Elf_Phdr;
|
||||
typedef typename ELFT::Sym Elf_Sym;
|
||||
typedef typename ELFT::SymRange Elf_Sym_Range;
|
||||
typedef typename ELFT::Rela Elf_Rela;
|
||||
Writer(SymbolTable<ELFT> &S) : Symtab(S) {}
|
||||
void run();
|
||||
|
||||
|
@ -123,7 +123,7 @@ private:
|
|||
} // anonymous namespace
|
||||
|
||||
template <class ELFT> void elf::writeResult(SymbolTable<ELFT> *Symtab) {
|
||||
typedef typename ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
// Create singleton output sections.
|
||||
DynamicSection<ELFT> Dynamic(*Symtab);
|
||||
|
@ -515,7 +515,7 @@ static void reportUndefined(SymbolTable<ELFT> &Symtab, SymbolBody *Sym) {
|
|||
template <class ELFT>
|
||||
static bool shouldKeepInSymtab(const elf::ObjectFile<ELFT> &File,
|
||||
StringRef SymName,
|
||||
const typename ELFFile<ELFT>::Elf_Sym &Sym) {
|
||||
const typename ELFT::Sym &Sym) {
|
||||
if (Sym.getType() == STT_FILE)
|
||||
return false;
|
||||
|
||||
|
@ -610,7 +610,7 @@ template <class ELFT> static bool isRelroSection(OutputSectionBase<ELFT> *Sec) {
|
|||
template <class ELFT>
|
||||
static bool compareSections(OutputSectionBase<ELFT> *A,
|
||||
OutputSectionBase<ELFT> *B) {
|
||||
typedef typename ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
int Comp = Script->compareSections(A->getName(), B->getName());
|
||||
if (Comp != 0)
|
||||
|
@ -825,8 +825,8 @@ static bool includeInDynsym(const SymbolBody &B) {
|
|||
// linker scripts.
|
||||
namespace {
|
||||
template <class ELFT> class OutputSectionFactory {
|
||||
typedef typename ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename ELFFile<ELFT>::uintX_t uintX_t;
|
||||
typedef typename ELFT::Shdr Elf_Shdr;
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
public:
|
||||
std::pair<OutputSectionBase<ELFT> *, bool> create(InputSectionBase<ELFT> *C,
|
||||
|
@ -1424,8 +1424,7 @@ static uint32_t getMipsEFlags() {
|
|||
return V;
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
static typename ELFFile<ELFT>::uintX_t getEntryAddr() {
|
||||
template <class ELFT> static typename ELFT::uint getEntryAddr() {
|
||||
if (SymbolBody *B = Config->EntrySym)
|
||||
return B->repl().getVA<ELFT>();
|
||||
if (Config->EntryAddr != uint64_t(-1))
|
||||
|
|
Loading…
Reference in New Issue