Home | History | Annotate | Download | only in LD
      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 
     20 namespace mcld {
     21 
     22 class IRBuilder;
     23 class FragmentRef;
     24 class LDSection;
     25 class SectionData;
     26 
     27 /** \class ELFReaderIF
     28  *  \brief ELFReaderIF provides common interface for all kind of ELF readers.
     29  */
     30 class 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