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