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