ObjectLinker.h revision f7ac0f19a1c8d0ad14bcf6456ce368b830fea886
10b167267bda99b68346045ccab14e810121d5de4Glenn Kasten//===- ObjectLinker.h -----------------------------------------------------===// 20b167267bda99b68346045ccab14e810121d5de4Glenn Kasten// 30b167267bda99b68346045ccab14e810121d5de4Glenn Kasten// The MCLinker Project 40b167267bda99b68346045ccab14e810121d5de4Glenn Kasten// 50b167267bda99b68346045ccab14e810121d5de4Glenn Kasten// This file is distributed under the University of Illinois Open Source 60b167267bda99b68346045ccab14e810121d5de4Glenn Kasten// License. See LICENSE.TXT for details. 70b167267bda99b68346045ccab14e810121d5de4Glenn Kasten// 80b167267bda99b68346045ccab14e810121d5de4Glenn Kasten//===----------------------------------------------------------------------===// 90b167267bda99b68346045ccab14e810121d5de4Glenn Kasten// 100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten// ObjectLinker plays the same role as GNU collect2 to prepare all implicit 110b167267bda99b68346045ccab14e810121d5de4Glenn Kasten// parameters for FragmentLinker. 120b167267bda99b68346045ccab14e810121d5de4Glenn Kasten// 130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten//===----------------------------------------------------------------------===// 140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#ifndef MCLD_OBJECT_OBJECT_LINKER_H 150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#define MCLD_OBJECT_OBJECT_LINKER_H 160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#ifdef ENABLE_UNITTEST 170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#include <gtest.h> 180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#endif 19979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten#include <stddef.h> 20979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten 21979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastennamespace mcld { 22979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten 23979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenclass Module; 24979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenclass LinkerConfig; 250b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass IRBuilder; 260b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass FragmentLinker; 270b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass TargetLDBackend; 280b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass MemoryArea; 290b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass MemoryAreaFactory; 300b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass ObjectReader; 310b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass DynObjReader; 320b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass ArchiveReader; 330b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass GroupReader; 34979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenclass BinaryReader; 35979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenclass ObjectWriter; 360b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass DynObjWriter; 370b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass ExecWriter; 380b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass BinaryWriter; 390b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 40979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten/** \class ObjectLinker 410b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * \brief ObjectLinker prepares parameters for FragmentLinker. 420b167267bda99b68346045ccab14e810121d5de4Glenn Kasten */ 430b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass ObjectLinker 440b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 450b167267bda99b68346045ccab14e810121d5de4Glenn Kastenpublic: 460b167267bda99b68346045ccab14e810121d5de4Glenn Kasten ObjectLinker(const LinkerConfig& pConfig, 470b167267bda99b68346045ccab14e810121d5de4Glenn Kasten TargetLDBackend& pLDBackend); 480b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 490b167267bda99b68346045ccab14e810121d5de4Glenn Kasten ~ObjectLinker(); 500b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 510b167267bda99b68346045ccab14e810121d5de4Glenn Kasten void setup(Module& pModule, IRBuilder& pBuilder); 520b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 530b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// initFragmentLinker - initialize FragmentLinker 540b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// Connect all components in FragmentLinker 550b167267bda99b68346045ccab14e810121d5de4Glenn Kasten bool initFragmentLinker(); 560b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 570b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// initStdSections - initialize standard sections of the output file. 580b167267bda99b68346045ccab14e810121d5de4Glenn Kasten bool initStdSections(); 590b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 600b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// normalize - normalize the input files 610b167267bda99b68346045ccab14e810121d5de4Glenn Kasten void normalize(); 620b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 630b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// linkable - check the linkability of current LinkerConfig 640b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// Check list: 650b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// - check the Attributes are not violate the constaint 660b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// - check every Input has a correct Attribute 67979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten bool linkable() const; 68979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten 690b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// readRelocations - read all relocation entries 700b167267bda99b68346045ccab14e810121d5de4Glenn Kasten bool readRelocations(); 710b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 720b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// mergeSections - put allinput sections into output sections 73979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten bool mergeSections(); 740b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 750b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// allocateCommonSymobols - allocate fragments for common symbols to the 760b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// corresponding sections 770b167267bda99b68346045ccab14e810121d5de4Glenn Kasten bool allocateCommonSymbols(); 780b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 790b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// addStandardSymbols - shared object and executable files need some 800b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// standard symbols 810b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// @return if there are some input symbols with the same name to the 820b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// standard symbols, return false 830b167267bda99b68346045ccab14e810121d5de4Glenn Kasten bool addStandardSymbols(); 840b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 850b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// addTargetSymbols - some targets, such as MIPS and ARM, need some 860b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// target-dependent symbols 870b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// @return if there are some input symbols with the same name to the 880b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// target symbols, return false 890b167267bda99b68346045ccab14e810121d5de4Glenn Kasten bool addTargetSymbols(); 900b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 910b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// addScriptSymbols - define symbols from the command line option or linker 92979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten /// scripts. 93979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten bool addScriptSymbols(); 940b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 950b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// scanRelocations - scan all relocation entries by output symbols. 960b167267bda99b68346045ccab14e810121d5de4Glenn Kasten bool scanRelocations(); 970b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 980b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// initStubs - initialize stub-related stuff. 990b167267bda99b68346045ccab14e810121d5de4Glenn Kasten bool initStubs(); 1000b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1010b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// prelayout - help backend to do some modification before layout 1020b167267bda99b68346045ccab14e810121d5de4Glenn Kasten bool prelayout(); 1030b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1040b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// layout - linearly layout all output sections and reserve some space 1050b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// for GOT/PLT 1060b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// Because we do not support instruction relaxing in this early version, 1070b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// if there is a branch can not jump to its target, we return false 1080b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// directly 1090b167267bda99b68346045ccab14e810121d5de4Glenn Kasten bool layout(); 1100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1110b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// postlayout - help backend to do some modification after layout 1120b167267bda99b68346045ccab14e810121d5de4Glenn Kasten bool postlayout(); 1130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// relocate - applying relocation entries and create relocation 1150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// section in the output files 1160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// Create relocation section, asking TargetLDBackend to 1170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// read the relocation information into RelocationEntry 1180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// and push_back into the relocation section 1190b167267bda99b68346045ccab14e810121d5de4Glenn Kasten bool relocation(); 1200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1210b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// finalizeSymbolValue - finalize the symbol value 1220b167267bda99b68346045ccab14e810121d5de4Glenn Kasten bool finalizeSymbolValue(); 1230b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1240b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// emitOutput - emit the output file. 1250b167267bda99b68346045ccab14e810121d5de4Glenn Kasten bool emitOutput(MemoryArea& pOutput); 1260b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1270b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// postProcessing - do modificatiion after all processes 1280b167267bda99b68346045ccab14e810121d5de4Glenn Kasten bool postProcessing(MemoryArea& pOutput); 1290b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1300b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// getLinker - get internal FragmentLinker object 1310b167267bda99b68346045ccab14e810121d5de4Glenn Kasten const FragmentLinker* getLinker() const { return m_pLinker; } 1320b167267bda99b68346045ccab14e810121d5de4Glenn Kasten FragmentLinker* getLinker() { return m_pLinker; } 1330b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1340b167267bda99b68346045ccab14e810121d5de4Glenn Kasten /// hasInitLinker - has Linker been initialized? 1350b167267bda99b68346045ccab14e810121d5de4Glenn Kasten bool hasInitLinker() const 1360b167267bda99b68346045ccab14e810121d5de4Glenn Kasten { return (NULL != m_pLinker); } 1370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1380b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // ----- readers and writers ----- // 1390b167267bda99b68346045ccab14e810121d5de4Glenn Kasten const ObjectReader* getObjectReader () const { return m_pObjectReader; } 1400b167267bda99b68346045ccab14e810121d5de4Glenn Kasten ObjectReader* getObjectReader () { return m_pObjectReader; } 1410b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1420b167267bda99b68346045ccab14e810121d5de4Glenn Kasten const DynObjReader* getDynObjReader () const { return m_pDynObjReader; } 1430b167267bda99b68346045ccab14e810121d5de4Glenn Kasten DynObjReader* getDynObjReader () { return m_pDynObjReader; } 1440b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1450b167267bda99b68346045ccab14e810121d5de4Glenn Kasten const ArchiveReader* getArchiveReader() const { return m_pArchiveReader; } 1460b167267bda99b68346045ccab14e810121d5de4Glenn Kasten ArchiveReader* getArchiveReader() { return m_pArchiveReader; } 1470b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1480b167267bda99b68346045ccab14e810121d5de4Glenn Kasten const GroupReader* getGroupReader () const { return m_pGroupReader; } 1490b167267bda99b68346045ccab14e810121d5de4Glenn Kasten GroupReader* getGroupReader () { return m_pGroupReader; } 1500b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1510b167267bda99b68346045ccab14e810121d5de4Glenn Kasten const BinaryReader* getBinaryReader () const { return m_pBinaryReader; } 1520b167267bda99b68346045ccab14e810121d5de4Glenn Kasten BinaryReader* getBinaryReader () { return m_pBinaryReader; } 1530b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1540b167267bda99b68346045ccab14e810121d5de4Glenn Kasten const ObjectWriter* getWriter () const { return m_pWriter; } 1550b167267bda99b68346045ccab14e810121d5de4Glenn Kasten ObjectWriter* getWriter () { return m_pWriter; } 1560b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1570b167267bda99b68346045ccab14e810121d5de4Glenn Kastenprivate: 1580b167267bda99b68346045ccab14e810121d5de4Glenn Kasten const LinkerConfig& m_Config; 1590b167267bda99b68346045ccab14e810121d5de4Glenn Kasten FragmentLinker* m_pLinker; 1600b167267bda99b68346045ccab14e810121d5de4Glenn Kasten Module* m_pModule; 1610b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IRBuilder* m_pBuilder; 1620b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1630b167267bda99b68346045ccab14e810121d5de4Glenn Kasten TargetLDBackend &m_LDBackend; 1640b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1650b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // ----- readers and writers ----- // 1660b167267bda99b68346045ccab14e810121d5de4Glenn Kasten ObjectReader* m_pObjectReader; 1670b167267bda99b68346045ccab14e810121d5de4Glenn Kasten DynObjReader* m_pDynObjReader; 1680b167267bda99b68346045ccab14e810121d5de4Glenn Kasten ArchiveReader* m_pArchiveReader; 1690b167267bda99b68346045ccab14e810121d5de4Glenn Kasten GroupReader* m_pGroupReader; 1700b167267bda99b68346045ccab14e810121d5de4Glenn Kasten BinaryReader* m_pBinaryReader; 1710b167267bda99b68346045ccab14e810121d5de4Glenn Kasten ObjectWriter* m_pWriter; 1720b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}; 1730b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1740b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} // end namespace mcld 1750b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#endif 1760b167267bda99b68346045ccab14e810121d5de4Glenn Kasten