1 //===- ELFReader.h --------------------------------------------------------===// 2 // 3 // The MCLinker Project 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 #ifndef MCLD_ELF_READER_INTERFACE_H 10 #define MCLD_ELF_READER_INTERFACE_H 11 #ifdef ENABLE_UNITTEST 12 #include <gtest.h> 13 #endif 14 15 #include <llvm/ADT/StringRef.h> 16 #include <llvm/Support/ELF.h> 17 #include <llvm/Support/Host.h> 18 19 #include <mcld/Module.h> 20 #include <mcld/LinkerConfig.h> 21 #include <mcld/LD/LDContext.h> 22 #include <mcld/Target/GNULDBackend.h> 23 #include <mcld/Support/MsgHandling.h> 24 25 namespace mcld { 26 27 class Module; 28 class IRBuilder; 29 class FragmentRef; 30 class SectionData; 31 class LDSection; 32 33 /** \class ELFReaderIF 34 * \brief ELFReaderIF provides common interface for all kind of ELF readers. 35 */ 36 class ELFReaderIF 37 { 38 public: 39 ELFReaderIF(GNULDBackend& pBackend) 40 : m_Backend(pBackend) 41 { } 42 43 virtual ~ELFReaderIF() { } 44 45 /// ELFHeaderSize - return the size of the ELFHeader 46 virtual size_t getELFHeaderSize() const = 0; 47 48 /// isELF - is this a ELF file 49 virtual bool isELF(void* pELFHeader) const = 0; 50 51 /// isMyEndian - is this ELF file in the same endian to me? 52 virtual bool isMyEndian(void* pELFHeader) const = 0; 53 54 /// isMyMachine - is this ELF file generated for the same machine. 55 virtual bool isMyMachine(void* pELFHeader) const = 0; 56 57 /// fileType - the file type of this file 58 virtual Input::Type fileType(void* pELFHeader) const = 0; 59 60 /// target - the target backend 61 const GNULDBackend& target() const { return m_Backend; } 62 GNULDBackend& target() { return m_Backend; } 63 64 65 /// readSectionHeaders - read ELF section header table and create LDSections 66 virtual bool readSectionHeaders(Input& pInput, void* pELFHeader) const = 0; 67 68 /// readRegularSection - read a regular section and create fragments. 69 virtual bool readRegularSection(Input& pInput, SectionData& pSD) const = 0; 70 71 /// readSymbols - read ELF symbols and create LDSymbol 72 virtual bool readSymbols(Input& pInput, 73 IRBuilder& pBuilder, 74 const MemoryRegion& pRegion, 75 const char* StrTab) const = 0; 76 77 /// readSignature - read a symbol from the given Input and index in symtab 78 /// This is used to get the signature of a group section. 79 virtual ResolveInfo* readSignature(Input& pInput, 80 LDSection& pSymTab, 81 uint32_t pSymIdx) const = 0; 82 83 /// readRela - read ELF rela and create Relocation 84 virtual bool readRela(Input& pInput, 85 LDSection& pSection, 86 const MemoryRegion& pRegion) const = 0; 87 88 /// readRel - read ELF rel and create Relocation 89 virtual bool readRel(Input& pInput, 90 LDSection& pSection, 91 const MemoryRegion& pRegion) const = 0; 92 93 /// readDynamic - read ELF .dynamic in input dynobj 94 virtual bool readDynamic(Input& pInput) const = 0; 95 96 protected: 97 /// LinkInfo - some section needs sh_link and sh_info, remember them. 98 struct LinkInfo { 99 LDSection* section; 100 uint32_t sh_link; 101 uint32_t sh_info; 102 }; 103 104 typedef std::vector<LinkInfo> LinkInfoList; 105 106 protected: 107 ResolveInfo::Type getSymType(uint8_t pInfo, uint16_t pShndx) const; 108 109 ResolveInfo::Desc getSymDesc(uint16_t pShndx, const Input& pInput) const; 110 111 ResolveInfo::Binding getSymBinding(uint8_t pBinding, 112 uint16_t pShndx, 113 uint8_t pVisibility) const; 114 115 uint64_t getSymValue(uint64_t pValue, 116 uint16_t pShndx, 117 const Input& pInput) const; 118 119 FragmentRef* getSymFragmentRef(Input& pInput, 120 uint16_t pShndx, 121 uint32_t pOffset) const; 122 123 ResolveInfo::Visibility getSymVisibility(uint8_t pVis) const; 124 125 protected: 126 GNULDBackend& m_Backend; 127 }; 128 129 } // namespace of mcld 130 131 #endif 132 133