122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- ObjectLinker.h -----------------------------------------------------===// 222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// The MCLinker Project 422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This file is distributed under the University of Illinois Open Source 622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// License. See LICENSE.TXT for details. 722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_OBJECT_OBJECTLINKER_H 1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_OBJECT_OBJECTLINKER_H 1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/Support/DataTypes.h> 1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Module; 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LinkerConfig; 17d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass IRBuilder; 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass TargetLDBackend; 1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass FileOutputBuffer; 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass ObjectReader; 2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass DynObjReader; 2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass ArchiveReader; 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass GroupReader; 24d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass BinaryReader; 2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass ScriptReader; 2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass ObjectWriter; 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass DynObjWriter; 2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass ExecWriter; 29d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass BinaryWriter; 3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Relocation; 3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass ResolveInfo; 3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class ObjectLinker 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */ 3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass ObjectLinker 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic: 3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ObjectLinker(const LinkerConfig& pConfig, 3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao TargetLDBackend& pLDBackend); 4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ~ObjectLinker(); 4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool initialize(Module& pModule, IRBuilder& pBuilder); 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// initStdSections - initialize standard sections of the output file. 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool initStdSections(); 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 48a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines /// addUndefinedSymbols - add symbols set by -u 49a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines void addUndefinedSymbols(); 50a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// normalize - normalize the input files 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void normalize(); 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// linkable - check the linkability of current LinkerConfig 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// Check list: 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// - check the Attributes are not violate the constaint 5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// - check every Input has a correct Attribute 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool linkable() const; 5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// readRelocations - read all relocation entries 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool readRelocations(); 6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// dataStrippingOpt - optimizations for reducing code size 6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void dataStrippingOpt(); 6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// mergeSections - put allinput sections into output sections 6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool mergeSections(); 6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// addSymbolsToOutput - after all symbols has been resolved, add the symbol 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// to output 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addSymbolsToOutput(Module& pModule); 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// allocateCommonSymobols - allocate fragments for common symbols to the 746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// corresponding sections 756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bool allocateCommonSymbols(); 766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// addStandardSymbols - shared object and executable files need some 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// standard symbols 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @return if there are some input symbols with the same name to the 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// standard symbols, return false 8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool addStandardSymbols(); 8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// addTargetSymbols - some targets, such as MIPS and ARM, need some 8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// target-dependent symbols 8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @return if there are some input symbols with the same name to the 8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// target symbols, return false 8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool addTargetSymbols(); 8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// addScriptSymbols - define symbols from the command line option or linker 906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// scripts. 916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bool addScriptSymbols(); 926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// scanRelocations - scan all relocation entries by output symbols. 9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool scanRelocations(); 9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// initStubs - initialize stub-related stuff. 976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bool initStubs(); 986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// prelayout - help backend to do some modification before layout 10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool prelayout(); 10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// layout - linearly layout all output sections and reserve some space 10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// for GOT/PLT 10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// Because we do not support instruction relaxing in this early version, 10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// if there is a branch can not jump to its target, we return false 10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// directly 10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool layout(); 10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// postlayout - help backend to do some modification after layout 11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool postlayout(); 11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// relocate - applying relocation entries and create relocation 11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// section in the output files 11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// Create relocation section, asking TargetLDBackend to 11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// read the relocation information into RelocationEntry 11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// and push_back into the relocation section 11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool relocation(); 11822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// finalizeSymbolValue - finalize the symbol value 12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool finalizeSymbolValue(); 12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// emitOutput - emit the output file. 12387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool emitOutput(FileOutputBuffer& pOutput); 12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 12522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// postProcessing - do modificatiion after all processes 12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool postProcessing(FileOutputBuffer& pOutput); 12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 12822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- readers and writers ----- // 12922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const ObjectReader* getObjectReader () const { return m_pObjectReader; } 13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ObjectReader* getObjectReader () { return m_pObjectReader; } 13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const DynObjReader* getDynObjReader () const { return m_pDynObjReader; } 13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao DynObjReader* getDynObjReader () { return m_pDynObjReader; } 13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const ArchiveReader* getArchiveReader() const { return m_pArchiveReader; } 13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ArchiveReader* getArchiveReader() { return m_pArchiveReader; } 13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 138d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao const GroupReader* getGroupReader () const { return m_pGroupReader; } 139d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao GroupReader* getGroupReader () { return m_pGroupReader; } 140d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 141d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao const BinaryReader* getBinaryReader () const { return m_pBinaryReader; } 142d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao BinaryReader* getBinaryReader () { return m_pBinaryReader; } 14322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 14487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const ScriptReader* getScriptReader () const { return m_pScriptReader; } 14587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ScriptReader* getScriptReader () { return m_pScriptReader; } 14687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const ObjectWriter* getWriter () const { return m_pWriter; } 1486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines ObjectWriter* getWriter () { return m_pWriter; } 149d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate: 15187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// normalSyncRelocationResult - sync relocation result when producing shared 15287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// objects or executables 15387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void normalSyncRelocationResult(FileOutputBuffer& pOutput); 15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 15587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// partialSyncRelocationResult - sync relocation result when doing partial 15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// link 15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void partialSyncRelocationResult(FileOutputBuffer& pOutput); 15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 15987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// writeRelocationResult - helper function of syncRelocationResult, write 16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// relocation target data to output 16187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void writeRelocationResult(Relocation& pReloc, uint8_t* pOutput); 16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 16387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// addSymbolToOutput - add a symbol to output symbol table if it's not a 16487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// section symbol and not defined in the discarded section 16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addSymbolToOutput(ResolveInfo& pInfo, Module& pModule); 16687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 16787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 16822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const LinkerConfig& m_Config; 1696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Module* m_pModule; 1706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines IRBuilder* m_pBuilder; 1716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 17222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao TargetLDBackend &m_LDBackend; 17322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 17422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- readers and writers ----- // 175d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao ObjectReader* m_pObjectReader; 176d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao DynObjReader* m_pDynObjReader; 17722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ArchiveReader* m_pArchiveReader; 178d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao GroupReader* m_pGroupReader; 179d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao BinaryReader* m_pBinaryReader; 18087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ScriptReader* m_pScriptReader; 1816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines ObjectWriter* m_pWriter; 18222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}; 18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} // end namespace mcld 18522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 186