109467b48Spatrick //===- ELFObjectFile.h - ELF object file implementation ---------*- C++ -*-===//
209467b48Spatrick //
309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
609467b48Spatrick //
709467b48Spatrick //===----------------------------------------------------------------------===//
809467b48Spatrick //
909467b48Spatrick // This file declares the ELFObjectFile template class.
1009467b48Spatrick //
1109467b48Spatrick //===----------------------------------------------------------------------===//
1209467b48Spatrick 
1309467b48Spatrick #ifndef LLVM_OBJECT_ELFOBJECTFILE_H
1409467b48Spatrick #define LLVM_OBJECT_ELFOBJECTFILE_H
1509467b48Spatrick 
1609467b48Spatrick #include "llvm/ADT/ArrayRef.h"
1709467b48Spatrick #include "llvm/ADT/STLExtras.h"
1809467b48Spatrick #include "llvm/ADT/StringRef.h"
1909467b48Spatrick #include "llvm/ADT/Triple.h"
2009467b48Spatrick #include "llvm/ADT/iterator_range.h"
2109467b48Spatrick #include "llvm/BinaryFormat/ELF.h"
2209467b48Spatrick #include "llvm/MC/SubtargetFeature.h"
2309467b48Spatrick #include "llvm/Object/Binary.h"
2409467b48Spatrick #include "llvm/Object/ELF.h"
2509467b48Spatrick #include "llvm/Object/ELFTypes.h"
2609467b48Spatrick #include "llvm/Object/Error.h"
2709467b48Spatrick #include "llvm/Object/ObjectFile.h"
2809467b48Spatrick #include "llvm/Object/SymbolicFile.h"
2909467b48Spatrick #include "llvm/Support/Casting.h"
30*d415bd75Srobert #include "llvm/Support/ELFAttributeParser.h"
31097a140dSpatrick #include "llvm/Support/ELFAttributes.h"
3209467b48Spatrick #include "llvm/Support/Endian.h"
3309467b48Spatrick #include "llvm/Support/Error.h"
3409467b48Spatrick #include "llvm/Support/ErrorHandling.h"
35*d415bd75Srobert #include "llvm/Support/MemoryBufferRef.h"
36*d415bd75Srobert #include "llvm/Support/ScopedPrinter.h"
3709467b48Spatrick #include <cassert>
3809467b48Spatrick #include <cstdint>
3909467b48Spatrick 
4009467b48Spatrick namespace llvm {
41*d415bd75Srobert 
42*d415bd75Srobert template <typename T> class SmallVectorImpl;
43*d415bd75Srobert 
4409467b48Spatrick namespace object {
4509467b48Spatrick 
4609467b48Spatrick constexpr int NumElfSymbolTypes = 16;
4709467b48Spatrick extern const llvm::EnumEntry<unsigned> ElfSymbolTypes[NumElfSymbolTypes];
4809467b48Spatrick 
4909467b48Spatrick class elf_symbol_iterator;
5009467b48Spatrick 
5109467b48Spatrick class ELFObjectFileBase : public ObjectFile {
5209467b48Spatrick   friend class ELFRelocationRef;
5309467b48Spatrick   friend class ELFSectionRef;
5409467b48Spatrick   friend class ELFSymbolRef;
5509467b48Spatrick 
5673471bf0Spatrick   SubtargetFeatures getMIPSFeatures() const;
5773471bf0Spatrick   SubtargetFeatures getARMFeatures() const;
58*d415bd75Srobert   Expected<SubtargetFeatures> getRISCVFeatures() const;
59*d415bd75Srobert   SubtargetFeatures getLoongArchFeatures() const;
6073471bf0Spatrick 
6173471bf0Spatrick   StringRef getAMDGPUCPUName() const;
6273471bf0Spatrick 
6309467b48Spatrick protected:
6409467b48Spatrick   ELFObjectFileBase(unsigned int Type, MemoryBufferRef Source);
6509467b48Spatrick 
6609467b48Spatrick   virtual uint64_t getSymbolSize(DataRefImpl Symb) const = 0;
6709467b48Spatrick   virtual uint8_t getSymbolBinding(DataRefImpl Symb) const = 0;
6809467b48Spatrick   virtual uint8_t getSymbolOther(DataRefImpl Symb) const = 0;
6909467b48Spatrick   virtual uint8_t getSymbolELFType(DataRefImpl Symb) const = 0;
7009467b48Spatrick 
7109467b48Spatrick   virtual uint32_t getSectionType(DataRefImpl Sec) const = 0;
7209467b48Spatrick   virtual uint64_t getSectionFlags(DataRefImpl Sec) const = 0;
7309467b48Spatrick   virtual uint64_t getSectionOffset(DataRefImpl Sec) const = 0;
7409467b48Spatrick 
7509467b48Spatrick   virtual Expected<int64_t> getRelocationAddend(DataRefImpl Rel) const = 0;
76097a140dSpatrick   virtual Error getBuildAttributes(ELFAttributeParser &Attributes) const = 0;
7709467b48Spatrick 
7809467b48Spatrick public:
7909467b48Spatrick   using elf_symbol_iterator_range = iterator_range<elf_symbol_iterator>;
8009467b48Spatrick 
8109467b48Spatrick   virtual elf_symbol_iterator_range getDynamicSymbolIterators() const = 0;
8209467b48Spatrick 
8309467b48Spatrick   /// Returns platform-specific object flags, if any.
8409467b48Spatrick   virtual unsigned getPlatformFlags() const = 0;
8509467b48Spatrick 
8609467b48Spatrick   elf_symbol_iterator_range symbols() const;
8709467b48Spatrick 
classof(const Binary * v)8809467b48Spatrick   static bool classof(const Binary *v) { return v->isELF(); }
8909467b48Spatrick 
90*d415bd75Srobert   Expected<SubtargetFeatures> getFeatures() const override;
9109467b48Spatrick 
92*d415bd75Srobert   std::optional<StringRef> tryGetCPUName() const override;
9309467b48Spatrick 
9409467b48Spatrick   void setARMSubArch(Triple &TheTriple) const override;
9509467b48Spatrick 
9609467b48Spatrick   virtual uint16_t getEType() const = 0;
9709467b48Spatrick 
9809467b48Spatrick   virtual uint16_t getEMachine() const = 0;
9909467b48Spatrick 
100*d415bd75Srobert   std::vector<std::pair<std::optional<DataRefImpl>, uint64_t>>
10173471bf0Spatrick   getPltAddresses() const;
102*d415bd75Srobert 
103*d415bd75Srobert   /// Returns a vector containing a symbol version for each dynamic symbol.
104*d415bd75Srobert   /// Returns an empty vector if version sections do not exist.
105*d415bd75Srobert   Expected<std::vector<VersionEntry>> readDynsymVersions() const;
106*d415bd75Srobert 
107*d415bd75Srobert   /// Returns a vector of all BB address maps in the object file. When
108*d415bd75Srobert   // `TextSectionIndex` is specified, only returns the BB address maps
109*d415bd75Srobert   // corresponding to the section with that index.
110*d415bd75Srobert   Expected<std::vector<BBAddrMap>>
111*d415bd75Srobert   readBBAddrMap(std::optional<unsigned> TextSectionIndex = std::nullopt) const;
11209467b48Spatrick };
11309467b48Spatrick 
11409467b48Spatrick class ELFSectionRef : public SectionRef {
11509467b48Spatrick public:
ELFSectionRef(const SectionRef & B)11609467b48Spatrick   ELFSectionRef(const SectionRef &B) : SectionRef(B) {
11709467b48Spatrick     assert(isa<ELFObjectFileBase>(SectionRef::getObject()));
11809467b48Spatrick   }
11909467b48Spatrick 
getObject()12009467b48Spatrick   const ELFObjectFileBase *getObject() const {
12109467b48Spatrick     return cast<ELFObjectFileBase>(SectionRef::getObject());
12209467b48Spatrick   }
12309467b48Spatrick 
getType()12409467b48Spatrick   uint32_t getType() const {
12509467b48Spatrick     return getObject()->getSectionType(getRawDataRefImpl());
12609467b48Spatrick   }
12709467b48Spatrick 
getFlags()12809467b48Spatrick   uint64_t getFlags() const {
12909467b48Spatrick     return getObject()->getSectionFlags(getRawDataRefImpl());
13009467b48Spatrick   }
13109467b48Spatrick 
getOffset()13209467b48Spatrick   uint64_t getOffset() const {
13309467b48Spatrick     return getObject()->getSectionOffset(getRawDataRefImpl());
13409467b48Spatrick   }
13509467b48Spatrick };
13609467b48Spatrick 
13709467b48Spatrick class elf_section_iterator : public section_iterator {
13809467b48Spatrick public:
elf_section_iterator(const section_iterator & B)13909467b48Spatrick   elf_section_iterator(const section_iterator &B) : section_iterator(B) {
14009467b48Spatrick     assert(isa<ELFObjectFileBase>(B->getObject()));
14109467b48Spatrick   }
14209467b48Spatrick 
14309467b48Spatrick   const ELFSectionRef *operator->() const {
14409467b48Spatrick     return static_cast<const ELFSectionRef *>(section_iterator::operator->());
14509467b48Spatrick   }
14609467b48Spatrick 
14709467b48Spatrick   const ELFSectionRef &operator*() const {
14809467b48Spatrick     return static_cast<const ELFSectionRef &>(section_iterator::operator*());
14909467b48Spatrick   }
15009467b48Spatrick };
15109467b48Spatrick 
15209467b48Spatrick class ELFSymbolRef : public SymbolRef {
15309467b48Spatrick public:
ELFSymbolRef(const SymbolRef & B)15409467b48Spatrick   ELFSymbolRef(const SymbolRef &B) : SymbolRef(B) {
15509467b48Spatrick     assert(isa<ELFObjectFileBase>(SymbolRef::getObject()));
15609467b48Spatrick   }
15709467b48Spatrick 
getObject()15809467b48Spatrick   const ELFObjectFileBase *getObject() const {
15909467b48Spatrick     return cast<ELFObjectFileBase>(BasicSymbolRef::getObject());
16009467b48Spatrick   }
16109467b48Spatrick 
getSize()16209467b48Spatrick   uint64_t getSize() const {
16309467b48Spatrick     return getObject()->getSymbolSize(getRawDataRefImpl());
16409467b48Spatrick   }
16509467b48Spatrick 
getBinding()16609467b48Spatrick   uint8_t getBinding() const {
16709467b48Spatrick     return getObject()->getSymbolBinding(getRawDataRefImpl());
16809467b48Spatrick   }
16909467b48Spatrick 
getOther()17009467b48Spatrick   uint8_t getOther() const {
17109467b48Spatrick     return getObject()->getSymbolOther(getRawDataRefImpl());
17209467b48Spatrick   }
17309467b48Spatrick 
getELFType()17409467b48Spatrick   uint8_t getELFType() const {
17509467b48Spatrick     return getObject()->getSymbolELFType(getRawDataRefImpl());
17609467b48Spatrick   }
17709467b48Spatrick 
getELFTypeName()17809467b48Spatrick   StringRef getELFTypeName() const {
17909467b48Spatrick     uint8_t Type = getELFType();
180*d415bd75Srobert     for (const auto &EE : ElfSymbolTypes) {
18109467b48Spatrick       if (EE.Value == Type) {
18209467b48Spatrick         return EE.AltName;
18309467b48Spatrick       }
18409467b48Spatrick     }
18509467b48Spatrick     return "";
18609467b48Spatrick   }
18709467b48Spatrick };
18809467b48Spatrick 
18909467b48Spatrick class elf_symbol_iterator : public symbol_iterator {
19009467b48Spatrick public:
elf_symbol_iterator(const basic_symbol_iterator & B)19109467b48Spatrick   elf_symbol_iterator(const basic_symbol_iterator &B)
19209467b48Spatrick       : symbol_iterator(SymbolRef(B->getRawDataRefImpl(),
19309467b48Spatrick                                   cast<ELFObjectFileBase>(B->getObject()))) {}
19409467b48Spatrick 
19509467b48Spatrick   const ELFSymbolRef *operator->() const {
19609467b48Spatrick     return static_cast<const ELFSymbolRef *>(symbol_iterator::operator->());
19709467b48Spatrick   }
19809467b48Spatrick 
19909467b48Spatrick   const ELFSymbolRef &operator*() const {
20009467b48Spatrick     return static_cast<const ELFSymbolRef &>(symbol_iterator::operator*());
20109467b48Spatrick   }
20209467b48Spatrick };
20309467b48Spatrick 
20409467b48Spatrick class ELFRelocationRef : public RelocationRef {
20509467b48Spatrick public:
ELFRelocationRef(const RelocationRef & B)20609467b48Spatrick   ELFRelocationRef(const RelocationRef &B) : RelocationRef(B) {
20709467b48Spatrick     assert(isa<ELFObjectFileBase>(RelocationRef::getObject()));
20809467b48Spatrick   }
20909467b48Spatrick 
getObject()21009467b48Spatrick   const ELFObjectFileBase *getObject() const {
21109467b48Spatrick     return cast<ELFObjectFileBase>(RelocationRef::getObject());
21209467b48Spatrick   }
21309467b48Spatrick 
getAddend()21409467b48Spatrick   Expected<int64_t> getAddend() const {
21509467b48Spatrick     return getObject()->getRelocationAddend(getRawDataRefImpl());
21609467b48Spatrick   }
21709467b48Spatrick };
21809467b48Spatrick 
21909467b48Spatrick class elf_relocation_iterator : public relocation_iterator {
22009467b48Spatrick public:
elf_relocation_iterator(const relocation_iterator & B)22109467b48Spatrick   elf_relocation_iterator(const relocation_iterator &B)
22209467b48Spatrick       : relocation_iterator(RelocationRef(
22309467b48Spatrick             B->getRawDataRefImpl(), cast<ELFObjectFileBase>(B->getObject()))) {}
22409467b48Spatrick 
22509467b48Spatrick   const ELFRelocationRef *operator->() const {
22609467b48Spatrick     return static_cast<const ELFRelocationRef *>(
22709467b48Spatrick         relocation_iterator::operator->());
22809467b48Spatrick   }
22909467b48Spatrick 
23009467b48Spatrick   const ELFRelocationRef &operator*() const {
23109467b48Spatrick     return static_cast<const ELFRelocationRef &>(
23209467b48Spatrick         relocation_iterator::operator*());
23309467b48Spatrick   }
23409467b48Spatrick };
23509467b48Spatrick 
23609467b48Spatrick inline ELFObjectFileBase::elf_symbol_iterator_range
symbols()23709467b48Spatrick ELFObjectFileBase::symbols() const {
23809467b48Spatrick   return elf_symbol_iterator_range(symbol_begin(), symbol_end());
23909467b48Spatrick }
24009467b48Spatrick 
24109467b48Spatrick template <class ELFT> class ELFObjectFile : public ELFObjectFileBase {
24209467b48Spatrick   uint16_t getEMachine() const override;
24309467b48Spatrick   uint16_t getEType() const override;
24409467b48Spatrick   uint64_t getSymbolSize(DataRefImpl Sym) const override;
24509467b48Spatrick 
24609467b48Spatrick public:
LLVM_ELF_IMPORT_TYPES_ELFT(ELFT)24709467b48Spatrick   LLVM_ELF_IMPORT_TYPES_ELFT(ELFT)
24809467b48Spatrick 
24909467b48Spatrick   SectionRef toSectionRef(const Elf_Shdr *Sec) const {
25009467b48Spatrick     return SectionRef(toDRI(Sec), this);
25109467b48Spatrick   }
25209467b48Spatrick 
toSymbolRef(const Elf_Shdr * SymTable,unsigned SymbolNum)25373471bf0Spatrick   ELFSymbolRef toSymbolRef(const Elf_Shdr *SymTable, unsigned SymbolNum) const {
25473471bf0Spatrick     return ELFSymbolRef({toDRI(SymTable, SymbolNum), this});
25573471bf0Spatrick   }
25673471bf0Spatrick 
IsContentValid()25773471bf0Spatrick   bool IsContentValid() const { return ContentValid; }
25873471bf0Spatrick 
25909467b48Spatrick private:
26009467b48Spatrick   ELFObjectFile(MemoryBufferRef Object, ELFFile<ELFT> EF,
26109467b48Spatrick                 const Elf_Shdr *DotDynSymSec, const Elf_Shdr *DotSymtabSec,
26273471bf0Spatrick                 const Elf_Shdr *DotSymtabShndxSec);
26373471bf0Spatrick 
26473471bf0Spatrick   bool ContentValid = false;
26509467b48Spatrick 
26609467b48Spatrick protected:
26709467b48Spatrick   ELFFile<ELFT> EF;
26809467b48Spatrick 
26909467b48Spatrick   const Elf_Shdr *DotDynSymSec = nullptr; // Dynamic symbol table section.
27009467b48Spatrick   const Elf_Shdr *DotSymtabSec = nullptr; // Symbol table section.
27173471bf0Spatrick   const Elf_Shdr *DotSymtabShndxSec = nullptr; // SHT_SYMTAB_SHNDX section.
27273471bf0Spatrick 
27373471bf0Spatrick   Error initContent() override;
27409467b48Spatrick 
27509467b48Spatrick   void moveSymbolNext(DataRefImpl &Symb) const override;
27609467b48Spatrick   Expected<StringRef> getSymbolName(DataRefImpl Symb) const override;
27709467b48Spatrick   Expected<uint64_t> getSymbolAddress(DataRefImpl Symb) const override;
27809467b48Spatrick   uint64_t getSymbolValueImpl(DataRefImpl Symb) const override;
27909467b48Spatrick   uint32_t getSymbolAlignment(DataRefImpl Symb) const override;
28009467b48Spatrick   uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override;
281097a140dSpatrick   Expected<uint32_t> getSymbolFlags(DataRefImpl Symb) const override;
28209467b48Spatrick   uint8_t getSymbolBinding(DataRefImpl Symb) const override;
28309467b48Spatrick   uint8_t getSymbolOther(DataRefImpl Symb) const override;
28409467b48Spatrick   uint8_t getSymbolELFType(DataRefImpl Symb) const override;
28509467b48Spatrick   Expected<SymbolRef::Type> getSymbolType(DataRefImpl Symb) const override;
28609467b48Spatrick   Expected<section_iterator> getSymbolSection(const Elf_Sym *Symb,
28709467b48Spatrick                                               const Elf_Shdr *SymTab) const;
28809467b48Spatrick   Expected<section_iterator> getSymbolSection(DataRefImpl Symb) const override;
28909467b48Spatrick 
29009467b48Spatrick   void moveSectionNext(DataRefImpl &Sec) const override;
29109467b48Spatrick   Expected<StringRef> getSectionName(DataRefImpl Sec) const override;
29209467b48Spatrick   uint64_t getSectionAddress(DataRefImpl Sec) const override;
29309467b48Spatrick   uint64_t getSectionIndex(DataRefImpl Sec) const override;
29409467b48Spatrick   uint64_t getSectionSize(DataRefImpl Sec) const override;
29509467b48Spatrick   Expected<ArrayRef<uint8_t>>
29609467b48Spatrick   getSectionContents(DataRefImpl Sec) const override;
29709467b48Spatrick   uint64_t getSectionAlignment(DataRefImpl Sec) const override;
29809467b48Spatrick   bool isSectionCompressed(DataRefImpl Sec) const override;
29909467b48Spatrick   bool isSectionText(DataRefImpl Sec) const override;
30009467b48Spatrick   bool isSectionData(DataRefImpl Sec) const override;
30109467b48Spatrick   bool isSectionBSS(DataRefImpl Sec) const override;
30209467b48Spatrick   bool isSectionVirtual(DataRefImpl Sec) const override;
30309467b48Spatrick   bool isBerkeleyText(DataRefImpl Sec) const override;
30409467b48Spatrick   bool isBerkeleyData(DataRefImpl Sec) const override;
30573471bf0Spatrick   bool isDebugSection(DataRefImpl Sec) const override;
30609467b48Spatrick   relocation_iterator section_rel_begin(DataRefImpl Sec) const override;
30709467b48Spatrick   relocation_iterator section_rel_end(DataRefImpl Sec) const override;
30809467b48Spatrick   std::vector<SectionRef> dynamic_relocation_sections() const override;
30909467b48Spatrick   Expected<section_iterator>
31009467b48Spatrick   getRelocatedSection(DataRefImpl Sec) const override;
31109467b48Spatrick 
31209467b48Spatrick   void moveRelocationNext(DataRefImpl &Rel) const override;
31309467b48Spatrick   uint64_t getRelocationOffset(DataRefImpl Rel) const override;
31409467b48Spatrick   symbol_iterator getRelocationSymbol(DataRefImpl Rel) const override;
31509467b48Spatrick   uint64_t getRelocationType(DataRefImpl Rel) const override;
31609467b48Spatrick   void getRelocationTypeName(DataRefImpl Rel,
31709467b48Spatrick                              SmallVectorImpl<char> &Result) const override;
31809467b48Spatrick 
31909467b48Spatrick   uint32_t getSectionType(DataRefImpl Sec) const override;
32009467b48Spatrick   uint64_t getSectionFlags(DataRefImpl Sec) const override;
32109467b48Spatrick   uint64_t getSectionOffset(DataRefImpl Sec) const override;
32209467b48Spatrick   StringRef getRelocationTypeName(uint32_t Type) const;
32309467b48Spatrick 
toDRI(const Elf_Shdr * SymTable,unsigned SymbolNum)32409467b48Spatrick   DataRefImpl toDRI(const Elf_Shdr *SymTable, unsigned SymbolNum) const {
32509467b48Spatrick     DataRefImpl DRI;
32609467b48Spatrick     if (!SymTable) {
32709467b48Spatrick       DRI.d.a = 0;
32809467b48Spatrick       DRI.d.b = 0;
32909467b48Spatrick       return DRI;
33009467b48Spatrick     }
33109467b48Spatrick     assert(SymTable->sh_type == ELF::SHT_SYMTAB ||
33209467b48Spatrick            SymTable->sh_type == ELF::SHT_DYNSYM);
33309467b48Spatrick 
33409467b48Spatrick     auto SectionsOrErr = EF.sections();
33509467b48Spatrick     if (!SectionsOrErr) {
33609467b48Spatrick       DRI.d.a = 0;
33709467b48Spatrick       DRI.d.b = 0;
33809467b48Spatrick       return DRI;
33909467b48Spatrick     }
34009467b48Spatrick     uintptr_t SHT = reinterpret_cast<uintptr_t>((*SectionsOrErr).begin());
34109467b48Spatrick     unsigned SymTableIndex =
34209467b48Spatrick         (reinterpret_cast<uintptr_t>(SymTable) - SHT) / sizeof(Elf_Shdr);
34309467b48Spatrick 
34409467b48Spatrick     DRI.d.a = SymTableIndex;
34509467b48Spatrick     DRI.d.b = SymbolNum;
34609467b48Spatrick     return DRI;
34709467b48Spatrick   }
34809467b48Spatrick 
toELFShdrIter(DataRefImpl Sec)34909467b48Spatrick   const Elf_Shdr *toELFShdrIter(DataRefImpl Sec) const {
35009467b48Spatrick     return reinterpret_cast<const Elf_Shdr *>(Sec.p);
35109467b48Spatrick   }
35209467b48Spatrick 
toDRI(const Elf_Shdr * Sec)35309467b48Spatrick   DataRefImpl toDRI(const Elf_Shdr *Sec) const {
35409467b48Spatrick     DataRefImpl DRI;
35509467b48Spatrick     DRI.p = reinterpret_cast<uintptr_t>(Sec);
35609467b48Spatrick     return DRI;
35709467b48Spatrick   }
35809467b48Spatrick 
toDRI(const Elf_Dyn * Dyn)35909467b48Spatrick   DataRefImpl toDRI(const Elf_Dyn *Dyn) const {
36009467b48Spatrick     DataRefImpl DRI;
36109467b48Spatrick     DRI.p = reinterpret_cast<uintptr_t>(Dyn);
36209467b48Spatrick     return DRI;
36309467b48Spatrick   }
36409467b48Spatrick 
isExportedToOtherDSO(const Elf_Sym * ESym)36509467b48Spatrick   bool isExportedToOtherDSO(const Elf_Sym *ESym) const {
36609467b48Spatrick     unsigned char Binding = ESym->getBinding();
36709467b48Spatrick     unsigned char Visibility = ESym->getVisibility();
36809467b48Spatrick 
36909467b48Spatrick     // A symbol is exported if its binding is either GLOBAL or WEAK, and its
37009467b48Spatrick     // visibility is either DEFAULT or PROTECTED. All other symbols are not
37109467b48Spatrick     // exported.
37209467b48Spatrick     return (
37309467b48Spatrick         (Binding == ELF::STB_GLOBAL || Binding == ELF::STB_WEAK ||
37409467b48Spatrick          Binding == ELF::STB_GNU_UNIQUE) &&
37509467b48Spatrick         (Visibility == ELF::STV_DEFAULT || Visibility == ELF::STV_PROTECTED));
37609467b48Spatrick   }
37709467b48Spatrick 
getBuildAttributes(ELFAttributeParser & Attributes)378097a140dSpatrick   Error getBuildAttributes(ELFAttributeParser &Attributes) const override {
37909467b48Spatrick     auto SectionsOrErr = EF.sections();
38009467b48Spatrick     if (!SectionsOrErr)
38109467b48Spatrick       return SectionsOrErr.takeError();
38209467b48Spatrick 
38309467b48Spatrick     for (const Elf_Shdr &Sec : *SectionsOrErr) {
384097a140dSpatrick       if (Sec.sh_type == ELF::SHT_ARM_ATTRIBUTES ||
385097a140dSpatrick           Sec.sh_type == ELF::SHT_RISCV_ATTRIBUTES) {
38673471bf0Spatrick         auto ErrorOrContents = EF.getSectionContents(Sec);
38709467b48Spatrick         if (!ErrorOrContents)
38809467b48Spatrick           return ErrorOrContents.takeError();
38909467b48Spatrick 
39009467b48Spatrick         auto Contents = ErrorOrContents.get();
391097a140dSpatrick         if (Contents[0] != ELFAttrs::Format_Version || Contents.size() == 1)
39209467b48Spatrick           return Error::success();
39309467b48Spatrick 
394097a140dSpatrick         if (Error E = Attributes.parse(Contents, ELFT::TargetEndianness))
395097a140dSpatrick           return E;
39609467b48Spatrick         break;
39709467b48Spatrick       }
39809467b48Spatrick     }
39909467b48Spatrick     return Error::success();
40009467b48Spatrick   }
40109467b48Spatrick 
40209467b48Spatrick   // This flag is used for classof, to distinguish ELFObjectFile from
40309467b48Spatrick   // its subclass. If more subclasses will be created, this flag will
40409467b48Spatrick   // have to become an enum.
40509467b48Spatrick   bool isDyldELFObject;
40609467b48Spatrick 
40709467b48Spatrick public:
40809467b48Spatrick   ELFObjectFile(ELFObjectFile<ELFT> &&Other);
40973471bf0Spatrick   static Expected<ELFObjectFile<ELFT>> create(MemoryBufferRef Object,
41073471bf0Spatrick                                               bool InitContent = true);
41109467b48Spatrick 
41209467b48Spatrick   const Elf_Rel *getRel(DataRefImpl Rel) const;
41309467b48Spatrick   const Elf_Rela *getRela(DataRefImpl Rela) const;
41409467b48Spatrick 
getSymbol(DataRefImpl Sym)41573471bf0Spatrick   Expected<const Elf_Sym *> getSymbol(DataRefImpl Sym) const {
41673471bf0Spatrick     return EF.template getEntry<Elf_Sym>(Sym.d.a, Sym.d.b);
41773471bf0Spatrick   }
41873471bf0Spatrick 
41973471bf0Spatrick   /// Get the relocation section that contains \a Rel.
getRelSection(DataRefImpl Rel)42073471bf0Spatrick   const Elf_Shdr *getRelSection(DataRefImpl Rel) const {
42173471bf0Spatrick     auto RelSecOrErr = EF.getSection(Rel.d.a);
42273471bf0Spatrick     if (!RelSecOrErr)
423*d415bd75Srobert       report_fatal_error(
424*d415bd75Srobert           Twine(errorToErrorCode(RelSecOrErr.takeError()).message()));
42573471bf0Spatrick     return *RelSecOrErr;
42609467b48Spatrick   }
42709467b48Spatrick 
getSection(DataRefImpl Sec)42809467b48Spatrick   const Elf_Shdr *getSection(DataRefImpl Sec) const {
42909467b48Spatrick     return reinterpret_cast<const Elf_Shdr *>(Sec.p);
43009467b48Spatrick   }
43109467b48Spatrick 
43209467b48Spatrick   basic_symbol_iterator symbol_begin() const override;
43309467b48Spatrick   basic_symbol_iterator symbol_end() const override;
43409467b48Spatrick 
43509467b48Spatrick   elf_symbol_iterator dynamic_symbol_begin() const;
43609467b48Spatrick   elf_symbol_iterator dynamic_symbol_end() const;
43709467b48Spatrick 
43809467b48Spatrick   section_iterator section_begin() const override;
43909467b48Spatrick   section_iterator section_end() const override;
44009467b48Spatrick 
44109467b48Spatrick   Expected<int64_t> getRelocationAddend(DataRefImpl Rel) const override;
44209467b48Spatrick 
44309467b48Spatrick   uint8_t getBytesInAddress() const override;
44409467b48Spatrick   StringRef getFileFormatName() const override;
44509467b48Spatrick   Triple::ArchType getArch() const override;
44609467b48Spatrick   Expected<uint64_t> getStartAddress() const override;
44709467b48Spatrick 
getPlatformFlags()44873471bf0Spatrick   unsigned getPlatformFlags() const override { return EF.getHeader().e_flags; }
44909467b48Spatrick 
getELFFile()45073471bf0Spatrick   const ELFFile<ELFT> &getELFFile() const { return EF; }
45109467b48Spatrick 
isDyldType()45209467b48Spatrick   bool isDyldType() const { return isDyldELFObject; }
classof(const Binary * v)45309467b48Spatrick   static bool classof(const Binary *v) {
45409467b48Spatrick     return v->getType() == getELFType(ELFT::TargetEndianness == support::little,
45509467b48Spatrick                                       ELFT::Is64Bits);
45609467b48Spatrick   }
45709467b48Spatrick 
45809467b48Spatrick   elf_symbol_iterator_range getDynamicSymbolIterators() const override;
45909467b48Spatrick 
46009467b48Spatrick   bool isRelocatableObject() const override;
461*d415bd75Srobert 
createFakeSections()462*d415bd75Srobert   void createFakeSections() { EF.createFakeSections(); }
46309467b48Spatrick };
46409467b48Spatrick 
46509467b48Spatrick using ELF32LEObjectFile = ELFObjectFile<ELF32LE>;
46609467b48Spatrick using ELF64LEObjectFile = ELFObjectFile<ELF64LE>;
46709467b48Spatrick using ELF32BEObjectFile = ELFObjectFile<ELF32BE>;
46809467b48Spatrick using ELF64BEObjectFile = ELFObjectFile<ELF64BE>;
46909467b48Spatrick 
47009467b48Spatrick template <class ELFT>
moveSymbolNext(DataRefImpl & Sym)47109467b48Spatrick void ELFObjectFile<ELFT>::moveSymbolNext(DataRefImpl &Sym) const {
47209467b48Spatrick   ++Sym.d.b;
47309467b48Spatrick }
47409467b48Spatrick 
initContent()47573471bf0Spatrick template <class ELFT> Error ELFObjectFile<ELFT>::initContent() {
47673471bf0Spatrick   auto SectionsOrErr = EF.sections();
47773471bf0Spatrick   if (!SectionsOrErr)
47873471bf0Spatrick     return SectionsOrErr.takeError();
47973471bf0Spatrick 
48073471bf0Spatrick   for (const Elf_Shdr &Sec : *SectionsOrErr) {
48173471bf0Spatrick     switch (Sec.sh_type) {
48273471bf0Spatrick     case ELF::SHT_DYNSYM: {
48373471bf0Spatrick       if (!DotDynSymSec)
48473471bf0Spatrick         DotDynSymSec = &Sec;
48573471bf0Spatrick       break;
48673471bf0Spatrick     }
48773471bf0Spatrick     case ELF::SHT_SYMTAB: {
48873471bf0Spatrick       if (!DotSymtabSec)
48973471bf0Spatrick         DotSymtabSec = &Sec;
49073471bf0Spatrick       break;
49173471bf0Spatrick     }
49273471bf0Spatrick     case ELF::SHT_SYMTAB_SHNDX: {
49373471bf0Spatrick       if (!DotSymtabShndxSec)
49473471bf0Spatrick         DotSymtabShndxSec = &Sec;
49573471bf0Spatrick       break;
49673471bf0Spatrick     }
49773471bf0Spatrick     }
49873471bf0Spatrick   }
49973471bf0Spatrick 
50073471bf0Spatrick   ContentValid = true;
50173471bf0Spatrick   return Error::success();
50273471bf0Spatrick }
50373471bf0Spatrick 
50409467b48Spatrick template <class ELFT>
getSymbolName(DataRefImpl Sym)50509467b48Spatrick Expected<StringRef> ELFObjectFile<ELFT>::getSymbolName(DataRefImpl Sym) const {
50673471bf0Spatrick   Expected<const Elf_Sym *> SymOrErr = getSymbol(Sym);
50773471bf0Spatrick   if (!SymOrErr)
50873471bf0Spatrick     return SymOrErr.takeError();
50909467b48Spatrick   auto SymTabOrErr = EF.getSection(Sym.d.a);
51009467b48Spatrick   if (!SymTabOrErr)
51109467b48Spatrick     return SymTabOrErr.takeError();
51209467b48Spatrick   const Elf_Shdr *SymTableSec = *SymTabOrErr;
51309467b48Spatrick   auto StrTabOrErr = EF.getSection(SymTableSec->sh_link);
51409467b48Spatrick   if (!StrTabOrErr)
51509467b48Spatrick     return StrTabOrErr.takeError();
51609467b48Spatrick   const Elf_Shdr *StringTableSec = *StrTabOrErr;
51773471bf0Spatrick   auto SymStrTabOrErr = EF.getStringTable(*StringTableSec);
51809467b48Spatrick   if (!SymStrTabOrErr)
51909467b48Spatrick     return SymStrTabOrErr.takeError();
52073471bf0Spatrick   Expected<StringRef> Name = (*SymOrErr)->getName(*SymStrTabOrErr);
52109467b48Spatrick   if (Name && !Name->empty())
52209467b48Spatrick     return Name;
52309467b48Spatrick 
52409467b48Spatrick   // If the symbol name is empty use the section name.
52573471bf0Spatrick   if ((*SymOrErr)->getType() == ELF::STT_SECTION) {
52609467b48Spatrick     if (Expected<section_iterator> SecOrErr = getSymbolSection(Sym)) {
52709467b48Spatrick       consumeError(Name.takeError());
52809467b48Spatrick       return (*SecOrErr)->getName();
52909467b48Spatrick     }
53009467b48Spatrick   }
53109467b48Spatrick   return Name;
53209467b48Spatrick }
53309467b48Spatrick 
53409467b48Spatrick template <class ELFT>
getSectionFlags(DataRefImpl Sec)53509467b48Spatrick uint64_t ELFObjectFile<ELFT>::getSectionFlags(DataRefImpl Sec) const {
53609467b48Spatrick   return getSection(Sec)->sh_flags;
53709467b48Spatrick }
53809467b48Spatrick 
53909467b48Spatrick template <class ELFT>
getSectionType(DataRefImpl Sec)54009467b48Spatrick uint32_t ELFObjectFile<ELFT>::getSectionType(DataRefImpl Sec) const {
54109467b48Spatrick   return getSection(Sec)->sh_type;
54209467b48Spatrick }
54309467b48Spatrick 
54409467b48Spatrick template <class ELFT>
getSectionOffset(DataRefImpl Sec)54509467b48Spatrick uint64_t ELFObjectFile<ELFT>::getSectionOffset(DataRefImpl Sec) const {
54609467b48Spatrick   return getSection(Sec)->sh_offset;
54709467b48Spatrick }
54809467b48Spatrick 
54909467b48Spatrick template <class ELFT>
getSymbolValueImpl(DataRefImpl Symb)55009467b48Spatrick uint64_t ELFObjectFile<ELFT>::getSymbolValueImpl(DataRefImpl Symb) const {
55173471bf0Spatrick   Expected<const Elf_Sym *> SymOrErr = getSymbol(Symb);
55273471bf0Spatrick   if (!SymOrErr)
55373471bf0Spatrick     report_fatal_error(SymOrErr.takeError());
55473471bf0Spatrick 
55573471bf0Spatrick   uint64_t Ret = (*SymOrErr)->st_value;
55673471bf0Spatrick   if ((*SymOrErr)->st_shndx == ELF::SHN_ABS)
55709467b48Spatrick     return Ret;
55809467b48Spatrick 
55973471bf0Spatrick   const Elf_Ehdr &Header = EF.getHeader();
56009467b48Spatrick   // Clear the ARM/Thumb or microMIPS indicator flag.
56173471bf0Spatrick   if ((Header.e_machine == ELF::EM_ARM || Header.e_machine == ELF::EM_MIPS) &&
56273471bf0Spatrick       (*SymOrErr)->getType() == ELF::STT_FUNC)
56309467b48Spatrick     Ret &= ~1;
56409467b48Spatrick 
56509467b48Spatrick   return Ret;
56609467b48Spatrick }
56709467b48Spatrick 
56809467b48Spatrick template <class ELFT>
56909467b48Spatrick Expected<uint64_t>
getSymbolAddress(DataRefImpl Symb)57009467b48Spatrick ELFObjectFile<ELFT>::getSymbolAddress(DataRefImpl Symb) const {
571097a140dSpatrick   Expected<uint64_t> SymbolValueOrErr = getSymbolValue(Symb);
572097a140dSpatrick   if (!SymbolValueOrErr)
573097a140dSpatrick     // TODO: Test this error.
574097a140dSpatrick     return SymbolValueOrErr.takeError();
575097a140dSpatrick 
576097a140dSpatrick   uint64_t Result = *SymbolValueOrErr;
57773471bf0Spatrick   Expected<const Elf_Sym *> SymOrErr = getSymbol(Symb);
57873471bf0Spatrick   if (!SymOrErr)
57973471bf0Spatrick     return SymOrErr.takeError();
58073471bf0Spatrick 
58173471bf0Spatrick   switch ((*SymOrErr)->st_shndx) {
58209467b48Spatrick   case ELF::SHN_COMMON:
58309467b48Spatrick   case ELF::SHN_UNDEF:
58409467b48Spatrick   case ELF::SHN_ABS:
58509467b48Spatrick     return Result;
58609467b48Spatrick   }
58709467b48Spatrick 
58809467b48Spatrick   auto SymTabOrErr = EF.getSection(Symb.d.a);
58909467b48Spatrick   if (!SymTabOrErr)
59009467b48Spatrick     return SymTabOrErr.takeError();
59109467b48Spatrick 
59273471bf0Spatrick   if (EF.getHeader().e_type == ELF::ET_REL) {
59373471bf0Spatrick     ArrayRef<Elf_Word> ShndxTable;
59473471bf0Spatrick     if (DotSymtabShndxSec) {
59573471bf0Spatrick       // TODO: Test this error.
59673471bf0Spatrick       if (Expected<ArrayRef<Elf_Word>> ShndxTableOrErr =
59773471bf0Spatrick               EF.getSHNDXTable(*DotSymtabShndxSec))
59873471bf0Spatrick         ShndxTable = *ShndxTableOrErr;
59973471bf0Spatrick       else
60073471bf0Spatrick         return ShndxTableOrErr.takeError();
60173471bf0Spatrick     }
60273471bf0Spatrick 
60373471bf0Spatrick     Expected<const Elf_Shdr *> SectionOrErr =
60473471bf0Spatrick         EF.getSection(**SymOrErr, *SymTabOrErr, ShndxTable);
60509467b48Spatrick     if (!SectionOrErr)
60609467b48Spatrick       return SectionOrErr.takeError();
60709467b48Spatrick     const Elf_Shdr *Section = *SectionOrErr;
60809467b48Spatrick     if (Section)
60909467b48Spatrick       Result += Section->sh_addr;
61009467b48Spatrick   }
61109467b48Spatrick 
61209467b48Spatrick   return Result;
61309467b48Spatrick }
61409467b48Spatrick 
61509467b48Spatrick template <class ELFT>
getSymbolAlignment(DataRefImpl Symb)61609467b48Spatrick uint32_t ELFObjectFile<ELFT>::getSymbolAlignment(DataRefImpl Symb) const {
61773471bf0Spatrick   Expected<const Elf_Sym *> SymOrErr = getSymbol(Symb);
61873471bf0Spatrick   if (!SymOrErr)
61973471bf0Spatrick     report_fatal_error(SymOrErr.takeError());
62073471bf0Spatrick   if ((*SymOrErr)->st_shndx == ELF::SHN_COMMON)
62173471bf0Spatrick     return (*SymOrErr)->st_value;
62209467b48Spatrick   return 0;
62309467b48Spatrick }
62409467b48Spatrick 
62509467b48Spatrick template <class ELFT>
getEMachine()62609467b48Spatrick uint16_t ELFObjectFile<ELFT>::getEMachine() const {
62773471bf0Spatrick   return EF.getHeader().e_machine;
62809467b48Spatrick }
62909467b48Spatrick 
getEType()63009467b48Spatrick template <class ELFT> uint16_t ELFObjectFile<ELFT>::getEType() const {
63173471bf0Spatrick   return EF.getHeader().e_type;
63209467b48Spatrick }
63309467b48Spatrick 
63409467b48Spatrick template <class ELFT>
getSymbolSize(DataRefImpl Sym)63509467b48Spatrick uint64_t ELFObjectFile<ELFT>::getSymbolSize(DataRefImpl Sym) const {
63673471bf0Spatrick   Expected<const Elf_Sym *> SymOrErr = getSymbol(Sym);
63773471bf0Spatrick   if (!SymOrErr)
63873471bf0Spatrick     report_fatal_error(SymOrErr.takeError());
63973471bf0Spatrick   return (*SymOrErr)->st_size;
64009467b48Spatrick }
64109467b48Spatrick 
64209467b48Spatrick template <class ELFT>
getCommonSymbolSizeImpl(DataRefImpl Symb)64309467b48Spatrick uint64_t ELFObjectFile<ELFT>::getCommonSymbolSizeImpl(DataRefImpl Symb) const {
64473471bf0Spatrick   return getSymbolSize(Symb);
64509467b48Spatrick }
64609467b48Spatrick 
64709467b48Spatrick template <class ELFT>
getSymbolBinding(DataRefImpl Symb)64809467b48Spatrick uint8_t ELFObjectFile<ELFT>::getSymbolBinding(DataRefImpl Symb) const {
64973471bf0Spatrick   Expected<const Elf_Sym *> SymOrErr = getSymbol(Symb);
65073471bf0Spatrick   if (!SymOrErr)
65173471bf0Spatrick     report_fatal_error(SymOrErr.takeError());
65273471bf0Spatrick   return (*SymOrErr)->getBinding();
65309467b48Spatrick }
65409467b48Spatrick 
65509467b48Spatrick template <class ELFT>
getSymbolOther(DataRefImpl Symb)65609467b48Spatrick uint8_t ELFObjectFile<ELFT>::getSymbolOther(DataRefImpl Symb) const {
65773471bf0Spatrick   Expected<const Elf_Sym *> SymOrErr = getSymbol(Symb);
65873471bf0Spatrick   if (!SymOrErr)
65973471bf0Spatrick     report_fatal_error(SymOrErr.takeError());
66073471bf0Spatrick   return (*SymOrErr)->st_other;
66109467b48Spatrick }
66209467b48Spatrick 
66309467b48Spatrick template <class ELFT>
getSymbolELFType(DataRefImpl Symb)66409467b48Spatrick uint8_t ELFObjectFile<ELFT>::getSymbolELFType(DataRefImpl Symb) const {
66573471bf0Spatrick   Expected<const Elf_Sym *> SymOrErr = getSymbol(Symb);
66673471bf0Spatrick   if (!SymOrErr)
66773471bf0Spatrick     report_fatal_error(SymOrErr.takeError());
66873471bf0Spatrick   return (*SymOrErr)->getType();
66909467b48Spatrick }
67009467b48Spatrick 
67109467b48Spatrick template <class ELFT>
67209467b48Spatrick Expected<SymbolRef::Type>
getSymbolType(DataRefImpl Symb)67309467b48Spatrick ELFObjectFile<ELFT>::getSymbolType(DataRefImpl Symb) const {
67473471bf0Spatrick   Expected<const Elf_Sym *> SymOrErr = getSymbol(Symb);
67573471bf0Spatrick   if (!SymOrErr)
67673471bf0Spatrick     return SymOrErr.takeError();
67709467b48Spatrick 
67873471bf0Spatrick   switch ((*SymOrErr)->getType()) {
67909467b48Spatrick   case ELF::STT_NOTYPE:
68009467b48Spatrick     return SymbolRef::ST_Unknown;
68109467b48Spatrick   case ELF::STT_SECTION:
68209467b48Spatrick     return SymbolRef::ST_Debug;
68309467b48Spatrick   case ELF::STT_FILE:
68409467b48Spatrick     return SymbolRef::ST_File;
68509467b48Spatrick   case ELF::STT_FUNC:
68609467b48Spatrick     return SymbolRef::ST_Function;
68709467b48Spatrick   case ELF::STT_OBJECT:
68809467b48Spatrick   case ELF::STT_COMMON:
68909467b48Spatrick     return SymbolRef::ST_Data;
69073471bf0Spatrick   case ELF::STT_TLS:
69109467b48Spatrick   default:
69209467b48Spatrick     return SymbolRef::ST_Other;
69309467b48Spatrick   }
69409467b48Spatrick }
69509467b48Spatrick 
69609467b48Spatrick template <class ELFT>
getSymbolFlags(DataRefImpl Sym)697097a140dSpatrick Expected<uint32_t> ELFObjectFile<ELFT>::getSymbolFlags(DataRefImpl Sym) const {
69873471bf0Spatrick   Expected<const Elf_Sym *> SymOrErr = getSymbol(Sym);
69973471bf0Spatrick   if (!SymOrErr)
70073471bf0Spatrick     return SymOrErr.takeError();
70109467b48Spatrick 
70273471bf0Spatrick   const Elf_Sym *ESym = *SymOrErr;
70309467b48Spatrick   uint32_t Result = SymbolRef::SF_None;
70409467b48Spatrick 
70509467b48Spatrick   if (ESym->getBinding() != ELF::STB_LOCAL)
70609467b48Spatrick     Result |= SymbolRef::SF_Global;
70709467b48Spatrick 
70809467b48Spatrick   if (ESym->getBinding() == ELF::STB_WEAK)
70909467b48Spatrick     Result |= SymbolRef::SF_Weak;
71009467b48Spatrick 
71109467b48Spatrick   if (ESym->st_shndx == ELF::SHN_ABS)
71209467b48Spatrick     Result |= SymbolRef::SF_Absolute;
71309467b48Spatrick 
71409467b48Spatrick   if (ESym->getType() == ELF::STT_FILE || ESym->getType() == ELF::STT_SECTION)
71509467b48Spatrick     Result |= SymbolRef::SF_FormatSpecific;
71609467b48Spatrick 
717097a140dSpatrick   if (Expected<typename ELFT::SymRange> SymbolsOrErr =
718097a140dSpatrick           EF.symbols(DotSymtabSec)) {
719097a140dSpatrick     // Set the SF_FormatSpecific flag for the 0-index null symbol.
720097a140dSpatrick     if (ESym == SymbolsOrErr->begin())
72109467b48Spatrick       Result |= SymbolRef::SF_FormatSpecific;
722097a140dSpatrick   } else
723097a140dSpatrick     // TODO: Test this error.
724097a140dSpatrick     return SymbolsOrErr.takeError();
725097a140dSpatrick 
726097a140dSpatrick   if (Expected<typename ELFT::SymRange> SymbolsOrErr =
727097a140dSpatrick           EF.symbols(DotDynSymSec)) {
728097a140dSpatrick     // Set the SF_FormatSpecific flag for the 0-index null symbol.
729097a140dSpatrick     if (ESym == SymbolsOrErr->begin())
73009467b48Spatrick       Result |= SymbolRef::SF_FormatSpecific;
731097a140dSpatrick   } else
732097a140dSpatrick     // TODO: Test this error.
733097a140dSpatrick     return SymbolsOrErr.takeError();
73409467b48Spatrick 
73573471bf0Spatrick   if (EF.getHeader().e_machine == ELF::EM_AARCH64) {
73673471bf0Spatrick     if (Expected<StringRef> NameOrErr = getSymbolName(Sym)) {
73773471bf0Spatrick       StringRef Name = *NameOrErr;
73873471bf0Spatrick       if (Name.startswith("$d") || Name.startswith("$x"))
73973471bf0Spatrick         Result |= SymbolRef::SF_FormatSpecific;
74073471bf0Spatrick     } else {
74173471bf0Spatrick       // TODO: Actually report errors helpfully.
74273471bf0Spatrick       consumeError(NameOrErr.takeError());
74373471bf0Spatrick     }
74473471bf0Spatrick   } else if (EF.getHeader().e_machine == ELF::EM_ARM) {
74509467b48Spatrick     if (Expected<StringRef> NameOrErr = getSymbolName(Sym)) {
74609467b48Spatrick       StringRef Name = *NameOrErr;
747*d415bd75Srobert       // TODO Investigate why empty name symbols need to be marked.
748*d415bd75Srobert       if (Name.empty() || Name.startswith("$d") || Name.startswith("$t") ||
74909467b48Spatrick           Name.startswith("$a"))
75009467b48Spatrick         Result |= SymbolRef::SF_FormatSpecific;
75109467b48Spatrick     } else {
75209467b48Spatrick       // TODO: Actually report errors helpfully.
75309467b48Spatrick       consumeError(NameOrErr.takeError());
75409467b48Spatrick     }
75509467b48Spatrick     if (ESym->getType() == ELF::STT_FUNC && (ESym->st_value & 1) == 1)
75609467b48Spatrick       Result |= SymbolRef::SF_Thumb;
75773471bf0Spatrick   } else if (EF.getHeader().e_machine == ELF::EM_RISCV) {
75873471bf0Spatrick     if (Expected<StringRef> NameOrErr = getSymbolName(Sym)) {
75973471bf0Spatrick       // Mark empty name symbols used for label differences.
76073471bf0Spatrick       if (NameOrErr->empty())
76173471bf0Spatrick         Result |= SymbolRef::SF_FormatSpecific;
76273471bf0Spatrick     } else {
76373471bf0Spatrick       // TODO: Actually report errors helpfully.
76473471bf0Spatrick       consumeError(NameOrErr.takeError());
76573471bf0Spatrick     }
76609467b48Spatrick   }
76709467b48Spatrick 
76809467b48Spatrick   if (ESym->st_shndx == ELF::SHN_UNDEF)
76909467b48Spatrick     Result |= SymbolRef::SF_Undefined;
77009467b48Spatrick 
77109467b48Spatrick   if (ESym->getType() == ELF::STT_COMMON || ESym->st_shndx == ELF::SHN_COMMON)
77209467b48Spatrick     Result |= SymbolRef::SF_Common;
77309467b48Spatrick 
77409467b48Spatrick   if (isExportedToOtherDSO(ESym))
77509467b48Spatrick     Result |= SymbolRef::SF_Exported;
77609467b48Spatrick 
777*d415bd75Srobert   if (ESym->getType() == ELF::STT_GNU_IFUNC)
778*d415bd75Srobert     Result |= SymbolRef::SF_Indirect;
779*d415bd75Srobert 
78009467b48Spatrick   if (ESym->getVisibility() == ELF::STV_HIDDEN)
78109467b48Spatrick     Result |= SymbolRef::SF_Hidden;
78209467b48Spatrick 
78309467b48Spatrick   return Result;
78409467b48Spatrick }
78509467b48Spatrick 
78609467b48Spatrick template <class ELFT>
78709467b48Spatrick Expected<section_iterator>
getSymbolSection(const Elf_Sym * ESym,const Elf_Shdr * SymTab)78809467b48Spatrick ELFObjectFile<ELFT>::getSymbolSection(const Elf_Sym *ESym,
78909467b48Spatrick                                       const Elf_Shdr *SymTab) const {
79073471bf0Spatrick   ArrayRef<Elf_Word> ShndxTable;
79173471bf0Spatrick   if (DotSymtabShndxSec) {
79273471bf0Spatrick     // TODO: Test this error.
79373471bf0Spatrick     Expected<ArrayRef<Elf_Word>> ShndxTableOrErr =
79473471bf0Spatrick         EF.getSHNDXTable(*DotSymtabShndxSec);
79573471bf0Spatrick     if (!ShndxTableOrErr)
79673471bf0Spatrick       return ShndxTableOrErr.takeError();
79773471bf0Spatrick     ShndxTable = *ShndxTableOrErr;
79873471bf0Spatrick   }
79973471bf0Spatrick 
80073471bf0Spatrick   auto ESecOrErr = EF.getSection(*ESym, SymTab, ShndxTable);
80109467b48Spatrick   if (!ESecOrErr)
80209467b48Spatrick     return ESecOrErr.takeError();
80309467b48Spatrick 
80409467b48Spatrick   const Elf_Shdr *ESec = *ESecOrErr;
80509467b48Spatrick   if (!ESec)
80609467b48Spatrick     return section_end();
80709467b48Spatrick 
80809467b48Spatrick   DataRefImpl Sec;
80909467b48Spatrick   Sec.p = reinterpret_cast<intptr_t>(ESec);
81009467b48Spatrick   return section_iterator(SectionRef(Sec, this));
81109467b48Spatrick }
81209467b48Spatrick 
81309467b48Spatrick template <class ELFT>
81409467b48Spatrick Expected<section_iterator>
getSymbolSection(DataRefImpl Symb)81509467b48Spatrick ELFObjectFile<ELFT>::getSymbolSection(DataRefImpl Symb) const {
81673471bf0Spatrick   Expected<const Elf_Sym *> SymOrErr = getSymbol(Symb);
81773471bf0Spatrick   if (!SymOrErr)
81873471bf0Spatrick     return SymOrErr.takeError();
81973471bf0Spatrick 
82009467b48Spatrick   auto SymTabOrErr = EF.getSection(Symb.d.a);
82109467b48Spatrick   if (!SymTabOrErr)
82209467b48Spatrick     return SymTabOrErr.takeError();
82373471bf0Spatrick   return getSymbolSection(*SymOrErr, *SymTabOrErr);
82409467b48Spatrick }
82509467b48Spatrick 
82609467b48Spatrick template <class ELFT>
moveSectionNext(DataRefImpl & Sec)82709467b48Spatrick void ELFObjectFile<ELFT>::moveSectionNext(DataRefImpl &Sec) const {
82809467b48Spatrick   const Elf_Shdr *ESec = getSection(Sec);
82909467b48Spatrick   Sec = toDRI(++ESec);
83009467b48Spatrick }
83109467b48Spatrick 
83209467b48Spatrick template <class ELFT>
getSectionName(DataRefImpl Sec)83309467b48Spatrick Expected<StringRef> ELFObjectFile<ELFT>::getSectionName(DataRefImpl Sec) const {
83473471bf0Spatrick   return EF.getSectionName(*getSection(Sec));
83509467b48Spatrick }
83609467b48Spatrick 
83709467b48Spatrick template <class ELFT>
getSectionAddress(DataRefImpl Sec)83809467b48Spatrick uint64_t ELFObjectFile<ELFT>::getSectionAddress(DataRefImpl Sec) const {
83909467b48Spatrick   return getSection(Sec)->sh_addr;
84009467b48Spatrick }
84109467b48Spatrick 
84209467b48Spatrick template <class ELFT>
getSectionIndex(DataRefImpl Sec)84309467b48Spatrick uint64_t ELFObjectFile<ELFT>::getSectionIndex(DataRefImpl Sec) const {
84409467b48Spatrick   auto SectionsOrErr = EF.sections();
84509467b48Spatrick   handleAllErrors(std::move(SectionsOrErr.takeError()),
84609467b48Spatrick                   [](const ErrorInfoBase &) {
84709467b48Spatrick                     llvm_unreachable("unable to get section index");
84809467b48Spatrick                   });
84909467b48Spatrick   const Elf_Shdr *First = SectionsOrErr->begin();
85009467b48Spatrick   return getSection(Sec) - First;
85109467b48Spatrick }
85209467b48Spatrick 
85309467b48Spatrick template <class ELFT>
getSectionSize(DataRefImpl Sec)85409467b48Spatrick uint64_t ELFObjectFile<ELFT>::getSectionSize(DataRefImpl Sec) const {
85509467b48Spatrick   return getSection(Sec)->sh_size;
85609467b48Spatrick }
85709467b48Spatrick 
85809467b48Spatrick template <class ELFT>
85909467b48Spatrick Expected<ArrayRef<uint8_t>>
getSectionContents(DataRefImpl Sec)86009467b48Spatrick ELFObjectFile<ELFT>::getSectionContents(DataRefImpl Sec) const {
86109467b48Spatrick   const Elf_Shdr *EShdr = getSection(Sec);
86209467b48Spatrick   if (EShdr->sh_type == ELF::SHT_NOBITS)
863*d415bd75Srobert     return ArrayRef((const uint8_t *)base(), (size_t)0);
864097a140dSpatrick   if (Error E =
86509467b48Spatrick           checkOffset(getMemoryBufferRef(),
86609467b48Spatrick                       (uintptr_t)base() + EShdr->sh_offset, EShdr->sh_size))
867097a140dSpatrick     return std::move(E);
868*d415bd75Srobert   return ArrayRef((const uint8_t *)base() + EShdr->sh_offset, EShdr->sh_size);
86909467b48Spatrick }
87009467b48Spatrick 
87109467b48Spatrick template <class ELFT>
getSectionAlignment(DataRefImpl Sec)87209467b48Spatrick uint64_t ELFObjectFile<ELFT>::getSectionAlignment(DataRefImpl Sec) const {
87309467b48Spatrick   return getSection(Sec)->sh_addralign;
87409467b48Spatrick }
87509467b48Spatrick 
87609467b48Spatrick template <class ELFT>
isSectionCompressed(DataRefImpl Sec)87709467b48Spatrick bool ELFObjectFile<ELFT>::isSectionCompressed(DataRefImpl Sec) const {
87809467b48Spatrick   return getSection(Sec)->sh_flags & ELF::SHF_COMPRESSED;
87909467b48Spatrick }
88009467b48Spatrick 
88109467b48Spatrick template <class ELFT>
isSectionText(DataRefImpl Sec)88209467b48Spatrick bool ELFObjectFile<ELFT>::isSectionText(DataRefImpl Sec) const {
88309467b48Spatrick   return getSection(Sec)->sh_flags & ELF::SHF_EXECINSTR;
88409467b48Spatrick }
88509467b48Spatrick 
88609467b48Spatrick template <class ELFT>
isSectionData(DataRefImpl Sec)88709467b48Spatrick bool ELFObjectFile<ELFT>::isSectionData(DataRefImpl Sec) const {
88809467b48Spatrick   const Elf_Shdr *EShdr = getSection(Sec);
88909467b48Spatrick   return EShdr->sh_type == ELF::SHT_PROGBITS &&
89009467b48Spatrick          EShdr->sh_flags & ELF::SHF_ALLOC &&
89109467b48Spatrick          !(EShdr->sh_flags & ELF::SHF_EXECINSTR);
89209467b48Spatrick }
89309467b48Spatrick 
89409467b48Spatrick template <class ELFT>
isSectionBSS(DataRefImpl Sec)89509467b48Spatrick bool ELFObjectFile<ELFT>::isSectionBSS(DataRefImpl Sec) const {
89609467b48Spatrick   const Elf_Shdr *EShdr = getSection(Sec);
89709467b48Spatrick   return EShdr->sh_flags & (ELF::SHF_ALLOC | ELF::SHF_WRITE) &&
89809467b48Spatrick          EShdr->sh_type == ELF::SHT_NOBITS;
89909467b48Spatrick }
90009467b48Spatrick 
90109467b48Spatrick template <class ELFT>
90209467b48Spatrick std::vector<SectionRef>
dynamic_relocation_sections()90309467b48Spatrick ELFObjectFile<ELFT>::dynamic_relocation_sections() const {
90409467b48Spatrick   std::vector<SectionRef> Res;
90509467b48Spatrick   std::vector<uintptr_t> Offsets;
90609467b48Spatrick 
90709467b48Spatrick   auto SectionsOrErr = EF.sections();
90809467b48Spatrick   if (!SectionsOrErr)
90909467b48Spatrick     return Res;
91009467b48Spatrick 
91109467b48Spatrick   for (const Elf_Shdr &Sec : *SectionsOrErr) {
91209467b48Spatrick     if (Sec.sh_type != ELF::SHT_DYNAMIC)
91309467b48Spatrick       continue;
91409467b48Spatrick     Elf_Dyn *Dynamic =
91509467b48Spatrick         reinterpret_cast<Elf_Dyn *>((uintptr_t)base() + Sec.sh_offset);
91609467b48Spatrick     for (; Dynamic->d_tag != ELF::DT_NULL; Dynamic++) {
91709467b48Spatrick       if (Dynamic->d_tag == ELF::DT_REL || Dynamic->d_tag == ELF::DT_RELA ||
91809467b48Spatrick           Dynamic->d_tag == ELF::DT_JMPREL) {
91909467b48Spatrick         Offsets.push_back(Dynamic->d_un.d_val);
92009467b48Spatrick       }
92109467b48Spatrick     }
92209467b48Spatrick   }
92309467b48Spatrick   for (const Elf_Shdr &Sec : *SectionsOrErr) {
92409467b48Spatrick     if (is_contained(Offsets, Sec.sh_addr))
92509467b48Spatrick       Res.emplace_back(toDRI(&Sec), this);
92609467b48Spatrick   }
92709467b48Spatrick   return Res;
92809467b48Spatrick }
92909467b48Spatrick 
93009467b48Spatrick template <class ELFT>
isSectionVirtual(DataRefImpl Sec)93109467b48Spatrick bool ELFObjectFile<ELFT>::isSectionVirtual(DataRefImpl Sec) const {
93209467b48Spatrick   return getSection(Sec)->sh_type == ELF::SHT_NOBITS;
93309467b48Spatrick }
93409467b48Spatrick 
93509467b48Spatrick template <class ELFT>
isBerkeleyText(DataRefImpl Sec)93609467b48Spatrick bool ELFObjectFile<ELFT>::isBerkeleyText(DataRefImpl Sec) const {
93709467b48Spatrick   return getSection(Sec)->sh_flags & ELF::SHF_ALLOC &&
93809467b48Spatrick          (getSection(Sec)->sh_flags & ELF::SHF_EXECINSTR ||
93909467b48Spatrick           !(getSection(Sec)->sh_flags & ELF::SHF_WRITE));
94009467b48Spatrick }
94109467b48Spatrick 
94209467b48Spatrick template <class ELFT>
isBerkeleyData(DataRefImpl Sec)94309467b48Spatrick bool ELFObjectFile<ELFT>::isBerkeleyData(DataRefImpl Sec) const {
94409467b48Spatrick   const Elf_Shdr *EShdr = getSection(Sec);
94509467b48Spatrick   return !isBerkeleyText(Sec) && EShdr->sh_type != ELF::SHT_NOBITS &&
94609467b48Spatrick          EShdr->sh_flags & ELF::SHF_ALLOC;
94709467b48Spatrick }
94809467b48Spatrick 
94909467b48Spatrick template <class ELFT>
isDebugSection(DataRefImpl Sec)95073471bf0Spatrick bool ELFObjectFile<ELFT>::isDebugSection(DataRefImpl Sec) const {
95173471bf0Spatrick   Expected<StringRef> SectionNameOrErr = getSectionName(Sec);
95273471bf0Spatrick   if (!SectionNameOrErr) {
95373471bf0Spatrick     // TODO: Report the error message properly.
95473471bf0Spatrick     consumeError(SectionNameOrErr.takeError());
95573471bf0Spatrick     return false;
95673471bf0Spatrick   }
95773471bf0Spatrick   StringRef SectionName = SectionNameOrErr.get();
958097a140dSpatrick   return SectionName.startswith(".debug") ||
959097a140dSpatrick          SectionName.startswith(".zdebug") || SectionName == ".gdb_index";
960097a140dSpatrick }
961097a140dSpatrick 
962097a140dSpatrick template <class ELFT>
96309467b48Spatrick relocation_iterator
section_rel_begin(DataRefImpl Sec)96409467b48Spatrick ELFObjectFile<ELFT>::section_rel_begin(DataRefImpl Sec) const {
96509467b48Spatrick   DataRefImpl RelData;
96609467b48Spatrick   auto SectionsOrErr = EF.sections();
96709467b48Spatrick   if (!SectionsOrErr)
96809467b48Spatrick     return relocation_iterator(RelocationRef());
96909467b48Spatrick   uintptr_t SHT = reinterpret_cast<uintptr_t>((*SectionsOrErr).begin());
97073471bf0Spatrick   RelData.d.a = (Sec.p - SHT) / EF.getHeader().e_shentsize;
97109467b48Spatrick   RelData.d.b = 0;
97209467b48Spatrick   return relocation_iterator(RelocationRef(RelData, this));
97309467b48Spatrick }
97409467b48Spatrick 
97509467b48Spatrick template <class ELFT>
97609467b48Spatrick relocation_iterator
section_rel_end(DataRefImpl Sec)97709467b48Spatrick ELFObjectFile<ELFT>::section_rel_end(DataRefImpl Sec) const {
97809467b48Spatrick   const Elf_Shdr *S = reinterpret_cast<const Elf_Shdr *>(Sec.p);
97909467b48Spatrick   relocation_iterator Begin = section_rel_begin(Sec);
98009467b48Spatrick   if (S->sh_type != ELF::SHT_RELA && S->sh_type != ELF::SHT_REL)
98109467b48Spatrick     return Begin;
98209467b48Spatrick   DataRefImpl RelData = Begin->getRawDataRefImpl();
98309467b48Spatrick   const Elf_Shdr *RelSec = getRelSection(RelData);
98409467b48Spatrick 
98509467b48Spatrick   // Error check sh_link here so that getRelocationSymbol can just use it.
98609467b48Spatrick   auto SymSecOrErr = EF.getSection(RelSec->sh_link);
98709467b48Spatrick   if (!SymSecOrErr)
988*d415bd75Srobert     report_fatal_error(
989*d415bd75Srobert         Twine(errorToErrorCode(SymSecOrErr.takeError()).message()));
99009467b48Spatrick 
99109467b48Spatrick   RelData.d.b += S->sh_size / S->sh_entsize;
99209467b48Spatrick   return relocation_iterator(RelocationRef(RelData, this));
99309467b48Spatrick }
99409467b48Spatrick 
99509467b48Spatrick template <class ELFT>
99609467b48Spatrick Expected<section_iterator>
getRelocatedSection(DataRefImpl Sec)99709467b48Spatrick ELFObjectFile<ELFT>::getRelocatedSection(DataRefImpl Sec) const {
99809467b48Spatrick   const Elf_Shdr *EShdr = getSection(Sec);
99909467b48Spatrick   uintX_t Type = EShdr->sh_type;
100009467b48Spatrick   if (Type != ELF::SHT_REL && Type != ELF::SHT_RELA)
100109467b48Spatrick     return section_end();
100209467b48Spatrick 
100309467b48Spatrick   Expected<const Elf_Shdr *> SecOrErr = EF.getSection(EShdr->sh_info);
100409467b48Spatrick   if (!SecOrErr)
100509467b48Spatrick     return SecOrErr.takeError();
100609467b48Spatrick   return section_iterator(SectionRef(toDRI(*SecOrErr), this));
100709467b48Spatrick }
100809467b48Spatrick 
100909467b48Spatrick // Relocations
101009467b48Spatrick template <class ELFT>
moveRelocationNext(DataRefImpl & Rel)101109467b48Spatrick void ELFObjectFile<ELFT>::moveRelocationNext(DataRefImpl &Rel) const {
101209467b48Spatrick   ++Rel.d.b;
101309467b48Spatrick }
101409467b48Spatrick 
101509467b48Spatrick template <class ELFT>
101609467b48Spatrick symbol_iterator
getRelocationSymbol(DataRefImpl Rel)101709467b48Spatrick ELFObjectFile<ELFT>::getRelocationSymbol(DataRefImpl Rel) const {
101809467b48Spatrick   uint32_t symbolIdx;
101909467b48Spatrick   const Elf_Shdr *sec = getRelSection(Rel);
102009467b48Spatrick   if (sec->sh_type == ELF::SHT_REL)
102109467b48Spatrick     symbolIdx = getRel(Rel)->getSymbol(EF.isMips64EL());
102209467b48Spatrick   else
102309467b48Spatrick     symbolIdx = getRela(Rel)->getSymbol(EF.isMips64EL());
102409467b48Spatrick   if (!symbolIdx)
102509467b48Spatrick     return symbol_end();
102609467b48Spatrick 
102709467b48Spatrick   // FIXME: error check symbolIdx
102809467b48Spatrick   DataRefImpl SymbolData;
102909467b48Spatrick   SymbolData.d.a = sec->sh_link;
103009467b48Spatrick   SymbolData.d.b = symbolIdx;
103109467b48Spatrick   return symbol_iterator(SymbolRef(SymbolData, this));
103209467b48Spatrick }
103309467b48Spatrick 
103409467b48Spatrick template <class ELFT>
getRelocationOffset(DataRefImpl Rel)103509467b48Spatrick uint64_t ELFObjectFile<ELFT>::getRelocationOffset(DataRefImpl Rel) const {
103609467b48Spatrick   const Elf_Shdr *sec = getRelSection(Rel);
103709467b48Spatrick   if (sec->sh_type == ELF::SHT_REL)
103809467b48Spatrick     return getRel(Rel)->r_offset;
103909467b48Spatrick 
104009467b48Spatrick   return getRela(Rel)->r_offset;
104109467b48Spatrick }
104209467b48Spatrick 
104309467b48Spatrick template <class ELFT>
getRelocationType(DataRefImpl Rel)104409467b48Spatrick uint64_t ELFObjectFile<ELFT>::getRelocationType(DataRefImpl Rel) const {
104509467b48Spatrick   const Elf_Shdr *sec = getRelSection(Rel);
104609467b48Spatrick   if (sec->sh_type == ELF::SHT_REL)
104709467b48Spatrick     return getRel(Rel)->getType(EF.isMips64EL());
104809467b48Spatrick   else
104909467b48Spatrick     return getRela(Rel)->getType(EF.isMips64EL());
105009467b48Spatrick }
105109467b48Spatrick 
105209467b48Spatrick template <class ELFT>
getRelocationTypeName(uint32_t Type)105309467b48Spatrick StringRef ELFObjectFile<ELFT>::getRelocationTypeName(uint32_t Type) const {
105473471bf0Spatrick   return getELFRelocationTypeName(EF.getHeader().e_machine, Type);
105509467b48Spatrick }
105609467b48Spatrick 
105709467b48Spatrick template <class ELFT>
getRelocationTypeName(DataRefImpl Rel,SmallVectorImpl<char> & Result)105809467b48Spatrick void ELFObjectFile<ELFT>::getRelocationTypeName(
105909467b48Spatrick     DataRefImpl Rel, SmallVectorImpl<char> &Result) const {
106009467b48Spatrick   uint32_t type = getRelocationType(Rel);
106109467b48Spatrick   EF.getRelocationTypeName(type, Result);
106209467b48Spatrick }
106309467b48Spatrick 
106409467b48Spatrick template <class ELFT>
106509467b48Spatrick Expected<int64_t>
getRelocationAddend(DataRefImpl Rel)106609467b48Spatrick ELFObjectFile<ELFT>::getRelocationAddend(DataRefImpl Rel) const {
106709467b48Spatrick   if (getRelSection(Rel)->sh_type != ELF::SHT_RELA)
106809467b48Spatrick     return createError("Section is not SHT_RELA");
106909467b48Spatrick   return (int64_t)getRela(Rel)->r_addend;
107009467b48Spatrick }
107109467b48Spatrick 
107209467b48Spatrick template <class ELFT>
107309467b48Spatrick const typename ELFObjectFile<ELFT>::Elf_Rel *
getRel(DataRefImpl Rel)107409467b48Spatrick ELFObjectFile<ELFT>::getRel(DataRefImpl Rel) const {
107509467b48Spatrick   assert(getRelSection(Rel)->sh_type == ELF::SHT_REL);
107609467b48Spatrick   auto Ret = EF.template getEntry<Elf_Rel>(Rel.d.a, Rel.d.b);
107709467b48Spatrick   if (!Ret)
1078*d415bd75Srobert     report_fatal_error(Twine(errorToErrorCode(Ret.takeError()).message()));
107909467b48Spatrick   return *Ret;
108009467b48Spatrick }
108109467b48Spatrick 
108209467b48Spatrick template <class ELFT>
108309467b48Spatrick const typename ELFObjectFile<ELFT>::Elf_Rela *
getRela(DataRefImpl Rela)108409467b48Spatrick ELFObjectFile<ELFT>::getRela(DataRefImpl Rela) const {
108509467b48Spatrick   assert(getRelSection(Rela)->sh_type == ELF::SHT_RELA);
108609467b48Spatrick   auto Ret = EF.template getEntry<Elf_Rela>(Rela.d.a, Rela.d.b);
108709467b48Spatrick   if (!Ret)
1088*d415bd75Srobert     report_fatal_error(Twine(errorToErrorCode(Ret.takeError()).message()));
108909467b48Spatrick   return *Ret;
109009467b48Spatrick }
109109467b48Spatrick 
109209467b48Spatrick template <class ELFT>
109309467b48Spatrick Expected<ELFObjectFile<ELFT>>
create(MemoryBufferRef Object,bool InitContent)109473471bf0Spatrick ELFObjectFile<ELFT>::create(MemoryBufferRef Object, bool InitContent) {
109509467b48Spatrick   auto EFOrErr = ELFFile<ELFT>::create(Object.getBuffer());
109609467b48Spatrick   if (Error E = EFOrErr.takeError())
109709467b48Spatrick     return std::move(E);
109809467b48Spatrick 
109973471bf0Spatrick   ELFObjectFile<ELFT> Obj = {Object, std::move(*EFOrErr), nullptr, nullptr,
110073471bf0Spatrick                              nullptr};
110173471bf0Spatrick   if (InitContent)
110273471bf0Spatrick     if (Error E = Obj.initContent())
110373471bf0Spatrick       return std::move(E);
110473471bf0Spatrick   return std::move(Obj);
110509467b48Spatrick }
110609467b48Spatrick 
110709467b48Spatrick template <class ELFT>
ELFObjectFile(MemoryBufferRef Object,ELFFile<ELFT> EF,const Elf_Shdr * DotDynSymSec,const Elf_Shdr * DotSymtabSec,const Elf_Shdr * DotSymtabShndx)110809467b48Spatrick ELFObjectFile<ELFT>::ELFObjectFile(MemoryBufferRef Object, ELFFile<ELFT> EF,
110909467b48Spatrick                                    const Elf_Shdr *DotDynSymSec,
111009467b48Spatrick                                    const Elf_Shdr *DotSymtabSec,
111173471bf0Spatrick                                    const Elf_Shdr *DotSymtabShndx)
111209467b48Spatrick     : ELFObjectFileBase(
111309467b48Spatrick           getELFType(ELFT::TargetEndianness == support::little, ELFT::Is64Bits),
111409467b48Spatrick           Object),
111509467b48Spatrick       EF(EF), DotDynSymSec(DotDynSymSec), DotSymtabSec(DotSymtabSec),
111673471bf0Spatrick       DotSymtabShndxSec(DotSymtabShndx) {}
111709467b48Spatrick 
111809467b48Spatrick template <class ELFT>
ELFObjectFile(ELFObjectFile<ELFT> && Other)111909467b48Spatrick ELFObjectFile<ELFT>::ELFObjectFile(ELFObjectFile<ELFT> &&Other)
112009467b48Spatrick     : ELFObjectFile(Other.Data, Other.EF, Other.DotDynSymSec,
112173471bf0Spatrick                     Other.DotSymtabSec, Other.DotSymtabShndxSec) {}
112209467b48Spatrick 
112309467b48Spatrick template <class ELFT>
symbol_begin()112409467b48Spatrick basic_symbol_iterator ELFObjectFile<ELFT>::symbol_begin() const {
112509467b48Spatrick   DataRefImpl Sym =
112609467b48Spatrick       toDRI(DotSymtabSec,
112709467b48Spatrick             DotSymtabSec && DotSymtabSec->sh_size >= sizeof(Elf_Sym) ? 1 : 0);
112809467b48Spatrick   return basic_symbol_iterator(SymbolRef(Sym, this));
112909467b48Spatrick }
113009467b48Spatrick 
113109467b48Spatrick template <class ELFT>
symbol_end()113209467b48Spatrick basic_symbol_iterator ELFObjectFile<ELFT>::symbol_end() const {
113309467b48Spatrick   const Elf_Shdr *SymTab = DotSymtabSec;
113409467b48Spatrick   if (!SymTab)
113509467b48Spatrick     return symbol_begin();
113609467b48Spatrick   DataRefImpl Sym = toDRI(SymTab, SymTab->sh_size / sizeof(Elf_Sym));
113709467b48Spatrick   return basic_symbol_iterator(SymbolRef(Sym, this));
113809467b48Spatrick }
113909467b48Spatrick 
114009467b48Spatrick template <class ELFT>
dynamic_symbol_begin()114109467b48Spatrick elf_symbol_iterator ELFObjectFile<ELFT>::dynamic_symbol_begin() const {
1142097a140dSpatrick   if (!DotDynSymSec || DotDynSymSec->sh_size < sizeof(Elf_Sym))
1143097a140dSpatrick     // Ignore errors here where the dynsym is empty or sh_size less than the
1144097a140dSpatrick     // size of one symbol. These should be handled elsewhere.
1145097a140dSpatrick     return symbol_iterator(SymbolRef(toDRI(DotDynSymSec, 0), this));
1146097a140dSpatrick   // Skip 0-index NULL symbol.
1147097a140dSpatrick   return symbol_iterator(SymbolRef(toDRI(DotDynSymSec, 1), this));
114809467b48Spatrick }
114909467b48Spatrick 
115009467b48Spatrick template <class ELFT>
dynamic_symbol_end()115109467b48Spatrick elf_symbol_iterator ELFObjectFile<ELFT>::dynamic_symbol_end() const {
115209467b48Spatrick   const Elf_Shdr *SymTab = DotDynSymSec;
115309467b48Spatrick   if (!SymTab)
115409467b48Spatrick     return dynamic_symbol_begin();
115509467b48Spatrick   DataRefImpl Sym = toDRI(SymTab, SymTab->sh_size / sizeof(Elf_Sym));
115609467b48Spatrick   return basic_symbol_iterator(SymbolRef(Sym, this));
115709467b48Spatrick }
115809467b48Spatrick 
115909467b48Spatrick template <class ELFT>
section_begin()116009467b48Spatrick section_iterator ELFObjectFile<ELFT>::section_begin() const {
116109467b48Spatrick   auto SectionsOrErr = EF.sections();
116209467b48Spatrick   if (!SectionsOrErr)
116309467b48Spatrick     return section_iterator(SectionRef());
116409467b48Spatrick   return section_iterator(SectionRef(toDRI((*SectionsOrErr).begin()), this));
116509467b48Spatrick }
116609467b48Spatrick 
116709467b48Spatrick template <class ELFT>
section_end()116809467b48Spatrick section_iterator ELFObjectFile<ELFT>::section_end() const {
116909467b48Spatrick   auto SectionsOrErr = EF.sections();
117009467b48Spatrick   if (!SectionsOrErr)
117109467b48Spatrick     return section_iterator(SectionRef());
117209467b48Spatrick   return section_iterator(SectionRef(toDRI((*SectionsOrErr).end()), this));
117309467b48Spatrick }
117409467b48Spatrick 
117509467b48Spatrick template <class ELFT>
getBytesInAddress()117609467b48Spatrick uint8_t ELFObjectFile<ELFT>::getBytesInAddress() const {
117709467b48Spatrick   return ELFT::Is64Bits ? 8 : 4;
117809467b48Spatrick }
117909467b48Spatrick 
118009467b48Spatrick template <class ELFT>
getFileFormatName()118109467b48Spatrick StringRef ELFObjectFile<ELFT>::getFileFormatName() const {
1182*d415bd75Srobert   constexpr bool IsLittleEndian = ELFT::TargetEndianness == support::little;
118373471bf0Spatrick   switch (EF.getHeader().e_ident[ELF::EI_CLASS]) {
118409467b48Spatrick   case ELF::ELFCLASS32:
118573471bf0Spatrick     switch (EF.getHeader().e_machine) {
118673471bf0Spatrick     case ELF::EM_68K:
118773471bf0Spatrick       return "elf32-m68k";
118809467b48Spatrick     case ELF::EM_386:
1189097a140dSpatrick       return "elf32-i386";
119009467b48Spatrick     case ELF::EM_IAMCU:
1191097a140dSpatrick       return "elf32-iamcu";
119209467b48Spatrick     case ELF::EM_X86_64:
1193097a140dSpatrick       return "elf32-x86-64";
119409467b48Spatrick     case ELF::EM_ARM:
1195097a140dSpatrick       return (IsLittleEndian ? "elf32-littlearm" : "elf32-bigarm");
119609467b48Spatrick     case ELF::EM_AVR:
1197097a140dSpatrick       return "elf32-avr";
119809467b48Spatrick     case ELF::EM_HEXAGON:
1199097a140dSpatrick       return "elf32-hexagon";
120009467b48Spatrick     case ELF::EM_LANAI:
1201097a140dSpatrick       return "elf32-lanai";
120209467b48Spatrick     case ELF::EM_MIPS:
1203097a140dSpatrick       return "elf32-mips";
120409467b48Spatrick     case ELF::EM_MSP430:
1205097a140dSpatrick       return "elf32-msp430";
120609467b48Spatrick     case ELF::EM_PPC:
120773471bf0Spatrick       return (IsLittleEndian ? "elf32-powerpcle" : "elf32-powerpc");
120809467b48Spatrick     case ELF::EM_RISCV:
1209097a140dSpatrick       return "elf32-littleriscv";
121073471bf0Spatrick     case ELF::EM_CSKY:
121173471bf0Spatrick       return "elf32-csky";
121209467b48Spatrick     case ELF::EM_SPARC:
121309467b48Spatrick     case ELF::EM_SPARC32PLUS:
1214097a140dSpatrick       return "elf32-sparc";
121509467b48Spatrick     case ELF::EM_AMDGPU:
1216097a140dSpatrick       return "elf32-amdgpu";
1217*d415bd75Srobert     case ELF::EM_LOONGARCH:
1218*d415bd75Srobert       return "elf32-loongarch";
1219*d415bd75Srobert     case ELF::EM_XTENSA:
1220*d415bd75Srobert       return "elf32-xtensa";
122109467b48Spatrick     default:
1222097a140dSpatrick       return "elf32-unknown";
122309467b48Spatrick     }
122409467b48Spatrick   case ELF::ELFCLASS64:
122573471bf0Spatrick     switch (EF.getHeader().e_machine) {
122609467b48Spatrick     case ELF::EM_386:
1227097a140dSpatrick       return "elf64-i386";
122809467b48Spatrick     case ELF::EM_X86_64:
1229097a140dSpatrick       return "elf64-x86-64";
123009467b48Spatrick     case ELF::EM_AARCH64:
1231097a140dSpatrick       return (IsLittleEndian ? "elf64-littleaarch64" : "elf64-bigaarch64");
123209467b48Spatrick     case ELF::EM_PPC64:
1233097a140dSpatrick       return (IsLittleEndian ? "elf64-powerpcle" : "elf64-powerpc");
123409467b48Spatrick     case ELF::EM_RISCV:
1235097a140dSpatrick       return "elf64-littleriscv";
123609467b48Spatrick     case ELF::EM_S390:
1237097a140dSpatrick       return "elf64-s390";
123809467b48Spatrick     case ELF::EM_SPARCV9:
1239097a140dSpatrick       return "elf64-sparc";
124009467b48Spatrick     case ELF::EM_MIPS:
1241097a140dSpatrick       return "elf64-mips";
124209467b48Spatrick     case ELF::EM_AMDGPU:
1243097a140dSpatrick       return "elf64-amdgpu";
124409467b48Spatrick     case ELF::EM_BPF:
1245097a140dSpatrick       return "elf64-bpf";
1246097a140dSpatrick     case ELF::EM_VE:
1247097a140dSpatrick       return "elf64-ve";
1248*d415bd75Srobert     case ELF::EM_LOONGARCH:
1249*d415bd75Srobert       return "elf64-loongarch";
125009467b48Spatrick     default:
1251097a140dSpatrick       return "elf64-unknown";
125209467b48Spatrick     }
125309467b48Spatrick   default:
125409467b48Spatrick     // FIXME: Proper error handling.
125509467b48Spatrick     report_fatal_error("Invalid ELFCLASS!");
125609467b48Spatrick   }
125709467b48Spatrick }
125809467b48Spatrick 
getArch()125909467b48Spatrick template <class ELFT> Triple::ArchType ELFObjectFile<ELFT>::getArch() const {
126009467b48Spatrick   bool IsLittleEndian = ELFT::TargetEndianness == support::little;
126173471bf0Spatrick   switch (EF.getHeader().e_machine) {
126273471bf0Spatrick   case ELF::EM_68K:
126373471bf0Spatrick     return Triple::m68k;
126409467b48Spatrick   case ELF::EM_386:
126509467b48Spatrick   case ELF::EM_IAMCU:
126609467b48Spatrick     return Triple::x86;
126709467b48Spatrick   case ELF::EM_X86_64:
126809467b48Spatrick     return Triple::x86_64;
126909467b48Spatrick   case ELF::EM_AARCH64:
127009467b48Spatrick     return IsLittleEndian ? Triple::aarch64 : Triple::aarch64_be;
127109467b48Spatrick   case ELF::EM_ARM:
127209467b48Spatrick     return Triple::arm;
127309467b48Spatrick   case ELF::EM_AVR:
127409467b48Spatrick     return Triple::avr;
127509467b48Spatrick   case ELF::EM_HEXAGON:
127609467b48Spatrick     return Triple::hexagon;
127709467b48Spatrick   case ELF::EM_LANAI:
127809467b48Spatrick     return Triple::lanai;
127909467b48Spatrick   case ELF::EM_MIPS:
128073471bf0Spatrick     switch (EF.getHeader().e_ident[ELF::EI_CLASS]) {
128109467b48Spatrick     case ELF::ELFCLASS32:
128209467b48Spatrick       return IsLittleEndian ? Triple::mipsel : Triple::mips;
128309467b48Spatrick     case ELF::ELFCLASS64:
128409467b48Spatrick       return IsLittleEndian ? Triple::mips64el : Triple::mips64;
128509467b48Spatrick     default:
128609467b48Spatrick       report_fatal_error("Invalid ELFCLASS!");
128709467b48Spatrick     }
128809467b48Spatrick   case ELF::EM_MSP430:
128909467b48Spatrick     return Triple::msp430;
129009467b48Spatrick   case ELF::EM_PPC:
129173471bf0Spatrick     return IsLittleEndian ? Triple::ppcle : Triple::ppc;
129209467b48Spatrick   case ELF::EM_PPC64:
129309467b48Spatrick     return IsLittleEndian ? Triple::ppc64le : Triple::ppc64;
129409467b48Spatrick   case ELF::EM_RISCV:
129573471bf0Spatrick     switch (EF.getHeader().e_ident[ELF::EI_CLASS]) {
129609467b48Spatrick     case ELF::ELFCLASS32:
129709467b48Spatrick       return Triple::riscv32;
129809467b48Spatrick     case ELF::ELFCLASS64:
129909467b48Spatrick       return Triple::riscv64;
130009467b48Spatrick     default:
130109467b48Spatrick       report_fatal_error("Invalid ELFCLASS!");
130209467b48Spatrick     }
130309467b48Spatrick   case ELF::EM_S390:
130409467b48Spatrick     return Triple::systemz;
130509467b48Spatrick 
130609467b48Spatrick   case ELF::EM_SPARC:
130709467b48Spatrick   case ELF::EM_SPARC32PLUS:
130809467b48Spatrick     return IsLittleEndian ? Triple::sparcel : Triple::sparc;
130909467b48Spatrick   case ELF::EM_SPARCV9:
131009467b48Spatrick     return Triple::sparcv9;
131109467b48Spatrick 
131209467b48Spatrick   case ELF::EM_AMDGPU: {
131309467b48Spatrick     if (!IsLittleEndian)
131409467b48Spatrick       return Triple::UnknownArch;
131509467b48Spatrick 
131673471bf0Spatrick     unsigned MACH = EF.getHeader().e_flags & ELF::EF_AMDGPU_MACH;
131709467b48Spatrick     if (MACH >= ELF::EF_AMDGPU_MACH_R600_FIRST &&
131809467b48Spatrick         MACH <= ELF::EF_AMDGPU_MACH_R600_LAST)
131909467b48Spatrick       return Triple::r600;
132009467b48Spatrick     if (MACH >= ELF::EF_AMDGPU_MACH_AMDGCN_FIRST &&
132109467b48Spatrick         MACH <= ELF::EF_AMDGPU_MACH_AMDGCN_LAST)
132209467b48Spatrick       return Triple::amdgcn;
132309467b48Spatrick 
132409467b48Spatrick     return Triple::UnknownArch;
132509467b48Spatrick   }
132609467b48Spatrick 
132709467b48Spatrick   case ELF::EM_BPF:
132809467b48Spatrick     return IsLittleEndian ? Triple::bpfel : Triple::bpfeb;
132909467b48Spatrick 
1330097a140dSpatrick   case ELF::EM_VE:
1331097a140dSpatrick     return Triple::ve;
133273471bf0Spatrick   case ELF::EM_CSKY:
133373471bf0Spatrick     return Triple::csky;
1334*d415bd75Srobert 
1335*d415bd75Srobert   case ELF::EM_LOONGARCH:
1336*d415bd75Srobert     switch (EF.getHeader().e_ident[ELF::EI_CLASS]) {
1337*d415bd75Srobert     case ELF::ELFCLASS32:
1338*d415bd75Srobert       return Triple::loongarch32;
1339*d415bd75Srobert     case ELF::ELFCLASS64:
1340*d415bd75Srobert       return Triple::loongarch64;
1341*d415bd75Srobert     default:
1342*d415bd75Srobert       report_fatal_error("Invalid ELFCLASS!");
1343*d415bd75Srobert     }
1344*d415bd75Srobert 
1345*d415bd75Srobert   case ELF::EM_XTENSA:
1346*d415bd75Srobert     return Triple::xtensa;
1347*d415bd75Srobert 
134809467b48Spatrick   default:
134909467b48Spatrick     return Triple::UnknownArch;
135009467b48Spatrick   }
135109467b48Spatrick }
135209467b48Spatrick 
135309467b48Spatrick template <class ELFT>
getStartAddress()135409467b48Spatrick Expected<uint64_t> ELFObjectFile<ELFT>::getStartAddress() const {
135573471bf0Spatrick   return EF.getHeader().e_entry;
135609467b48Spatrick }
135709467b48Spatrick 
135809467b48Spatrick template <class ELFT>
135909467b48Spatrick ELFObjectFileBase::elf_symbol_iterator_range
getDynamicSymbolIterators()136009467b48Spatrick ELFObjectFile<ELFT>::getDynamicSymbolIterators() const {
136109467b48Spatrick   return make_range(dynamic_symbol_begin(), dynamic_symbol_end());
136209467b48Spatrick }
136309467b48Spatrick 
isRelocatableObject()136409467b48Spatrick template <class ELFT> bool ELFObjectFile<ELFT>::isRelocatableObject() const {
136573471bf0Spatrick   return EF.getHeader().e_type == ELF::ET_REL;
136609467b48Spatrick }
136709467b48Spatrick 
136809467b48Spatrick } // end namespace object
136909467b48Spatrick } // end namespace llvm
137009467b48Spatrick 
137109467b48Spatrick #endif // LLVM_OBJECT_ELFOBJECTFILE_H
1372