Home | History | Annotate | Download | only in Object
      1 //===- ObjectLinker.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 //
     10 // ObjectLinker plays the same role as GNU collect2 to prepare all implicit
     11 // parameters for FragmentLinker.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 #ifndef MCLD_OBJECT_OBJECT_LINKER_H
     15 #define MCLD_OBJECT_OBJECT_LINKER_H
     16 #ifdef ENABLE_UNITTEST
     17 #include <gtest.h>
     18 #endif
     19 #include <stddef.h>
     20 
     21 namespace mcld {
     22 
     23 class Module;
     24 class LinkerConfig;
     25 class IRBuilder;
     26 class FragmentLinker;
     27 class TargetLDBackend;
     28 class MemoryArea;
     29 class MemoryAreaFactory;
     30 class ObjectReader;
     31 class DynObjReader;
     32 class ArchiveReader;
     33 class GroupReader;
     34 class BinaryReader;
     35 class ObjectWriter;
     36 class DynObjWriter;
     37 class ExecWriter;
     38 class BinaryWriter;
     39 
     40 /** \class ObjectLinker
     41  *  \brief ObjectLinker prepares parameters for FragmentLinker.
     42  */
     43 class ObjectLinker
     44 {
     45 public:
     46   ObjectLinker(const LinkerConfig& pConfig,
     47                TargetLDBackend& pLDBackend);
     48 
     49   ~ObjectLinker();
     50 
     51   void setup(Module& pModule, IRBuilder& pBuilder);
     52 
     53   /// initFragmentLinker - initialize FragmentLinker
     54   ///  Connect all components in FragmentLinker
     55   bool initFragmentLinker();
     56 
     57   /// initStdSections - initialize standard sections of the output file.
     58   bool initStdSections();
     59 
     60   /// normalize - normalize the input files
     61   void normalize();
     62 
     63   /// linkable - check the linkability of current LinkerConfig
     64   ///  Check list:
     65   ///  - check the Attributes are not violate the constaint
     66   ///  - check every Input has a correct Attribute
     67   bool linkable() const;
     68 
     69   /// readRelocations - read all relocation entries
     70   bool readRelocations();
     71 
     72   /// mergeSections - put allinput sections into output sections
     73   bool mergeSections();
     74 
     75   /// allocateCommonSymobols - allocate fragments for common symbols to the
     76   /// corresponding sections
     77   bool allocateCommonSymbols();
     78 
     79   /// addStandardSymbols - shared object and executable files need some
     80   /// standard symbols
     81   ///   @return if there are some input symbols with the same name to the
     82   ///   standard symbols, return false
     83   bool addStandardSymbols();
     84 
     85   /// addTargetSymbols - some targets, such as MIPS and ARM, need some
     86   /// target-dependent symbols
     87   ///   @return if there are some input symbols with the same name to the
     88   ///   target symbols, return false
     89   bool addTargetSymbols();
     90 
     91   /// addScriptSymbols - define symbols from the command line option or linker
     92   /// scripts.
     93   bool addScriptSymbols();
     94 
     95   /// scanRelocations - scan all relocation entries by output symbols.
     96   bool scanRelocations();
     97 
     98   /// initStubs - initialize stub-related stuff.
     99   bool initStubs();
    100 
    101   /// prelayout - help backend to do some modification before layout
    102   bool prelayout();
    103 
    104   /// layout - linearly layout all output sections and reserve some space
    105   /// for GOT/PLT
    106   ///   Because we do not support instruction relaxing in this early version,
    107   ///   if there is a branch can not jump to its target, we return false
    108   ///   directly
    109   bool layout();
    110 
    111   /// postlayout - help backend to do some modification after layout
    112   bool postlayout();
    113 
    114   /// relocate - applying relocation entries and create relocation
    115   /// section in the output files
    116   /// Create relocation section, asking TargetLDBackend to
    117   /// read the relocation information into RelocationEntry
    118   /// and push_back into the relocation section
    119   bool relocation();
    120 
    121   /// finalizeSymbolValue - finalize the symbol value
    122   bool finalizeSymbolValue();
    123 
    124   /// emitOutput - emit the output file.
    125   bool emitOutput(MemoryArea& pOutput);
    126 
    127   /// postProcessing - do modificatiion after all processes
    128   bool postProcessing(MemoryArea& pOutput);
    129 
    130   /// getLinker - get internal FragmentLinker object
    131   const FragmentLinker* getLinker() const { return m_pLinker; }
    132   FragmentLinker*       getLinker()       { return m_pLinker; }
    133 
    134   /// hasInitLinker - has Linker been initialized?
    135   bool hasInitLinker() const
    136   { return (NULL != m_pLinker); }
    137 
    138   // -----  readers and writers  ----- //
    139   const ObjectReader*  getObjectReader () const { return m_pObjectReader;  }
    140   ObjectReader*        getObjectReader ()       { return m_pObjectReader;  }
    141 
    142   const DynObjReader*  getDynObjReader () const { return m_pDynObjReader;  }
    143   DynObjReader*        getDynObjReader ()       { return m_pDynObjReader;  }
    144 
    145   const ArchiveReader* getArchiveReader() const { return m_pArchiveReader; }
    146   ArchiveReader*       getArchiveReader()       { return m_pArchiveReader; }
    147 
    148   const GroupReader*   getGroupReader  () const { return m_pGroupReader;   }
    149   GroupReader*         getGroupReader  ()       { return m_pGroupReader;   }
    150 
    151   const BinaryReader*  getBinaryReader () const { return m_pBinaryReader;  }
    152   BinaryReader*        getBinaryReader ()       { return m_pBinaryReader;  }
    153 
    154   const ObjectWriter*  getWriter () const { return m_pWriter;  }
    155   ObjectWriter*        getWriter ()       { return m_pWriter;  }
    156 
    157 private:
    158   const LinkerConfig& m_Config;
    159   FragmentLinker* m_pLinker;
    160   Module* m_pModule;
    161   IRBuilder* m_pBuilder;
    162 
    163   TargetLDBackend &m_LDBackend;
    164 
    165   // -----  readers and writers  ----- //
    166   ObjectReader*  m_pObjectReader;
    167   DynObjReader*  m_pDynObjReader;
    168   ArchiveReader* m_pArchiveReader;
    169   GroupReader*   m_pGroupReader;
    170   BinaryReader*  m_pBinaryReader;
    171   ObjectWriter*  m_pWriter;
    172 };
    173 
    174 } // end namespace mcld
    175 #endif
    176