ObjectLinker.cpp revision d0fbbb227051be16931a1aa9b4a7722ac039c698
122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- ObjectLinker.cpp ---------------------------------------------------===// 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//===----------------------------------------------------------------------===// 922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Object/ObjectLinker.h> 1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LinkerConfig.h> 1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Module.h> 1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/InputTree.h> 14d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/IRBuilder.h> 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/LDSection.h> 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/LDContext.h> 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/Archive.h> 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/ArchiveReader.h> 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/ObjectReader.h> 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/DynObjReader.h> 2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/GroupReader.h> 22d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/LD/BinaryReader.h> 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/ObjectWriter.h> 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/DynObjWriter.h> 2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/ExecWriter.h> 26d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/LD/BinaryWriter.h> 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/ResolveInfo.h> 2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/RelocData.h> 2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/RealPath.h> 3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/MemoryArea.h> 3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/MsgHandling.h> 3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Target/TargetLDBackend.h> 3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Fragment/FragmentLinker.h> 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Object/ObjectBuilder.h> 3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/Casting.h> 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaousing namespace llvm; 3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaousing namespace mcld; 4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoObjectLinker::ObjectLinker(const LinkerConfig& pConfig, 4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Module& pModule, 43d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao IRBuilder& pBuilder, 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao TargetLDBackend& pLDBackend) 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao : m_Config(pConfig), 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Module(pModule), 47d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_Builder(pBuilder), 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pLinker(NULL), 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_LDBackend(pLDBackend), 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pObjectReader(NULL), 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pDynObjReader(NULL), 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pArchiveReader(NULL), 53d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_pGroupReader(NULL), 54d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_pBinaryReader(NULL), 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pObjectWriter(NULL), 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pDynObjWriter(NULL), 5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pExecWriter(NULL), 58d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_pBinaryWriter(NULL) 5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // set up soname 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!m_Config.options().soname().empty()) { 6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Module.setName(m_Config.options().soname()); 6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoObjectLinker::~ObjectLinker() 6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao delete m_pLinker; 6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao delete m_pObjectReader; 7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao delete m_pDynObjReader; 7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao delete m_pArchiveReader; 72d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao delete m_pGroupReader; 73d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao delete m_pBinaryReader; 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao delete m_pObjectWriter; 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao delete m_pDynObjWriter; 7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao delete m_pExecWriter; 77d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao delete m_pBinaryWriter; 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// initFragmentLinker - initialize FragmentLinker 8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// Connect all components with FragmentLinker 8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::initFragmentLinker() 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (NULL == m_pLinker) { 8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pLinker = new FragmentLinker(m_Config, 8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Module, 8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_LDBackend); 8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // initialize the readers and writers 9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // Because constructor can not be failed, we initalize all readers and 9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // writers outside the FragmentLinker constructors. 93d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_pObjectReader = m_LDBackend.createObjectReader(m_Builder); 9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pArchiveReader = m_LDBackend.createArchiveReader(m_Module); 95d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_pDynObjReader = m_LDBackend.createDynObjReader(m_Builder); 9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pGroupReader = new GroupReader(m_Module, *m_pObjectReader, 9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *m_pDynObjReader, *m_pArchiveReader); 98d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_pBinaryReader = m_LDBackend.createBinaryReader(m_Builder); 99d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_pObjectWriter = m_LDBackend.createObjectWriter(); 100d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_pDynObjWriter = m_LDBackend.createDynObjWriter(); 101d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_pExecWriter = m_LDBackend.createExecWriter(); 102d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_pBinaryWriter = m_LDBackend.createBinaryWriter(); 10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 104d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao // initialize Relocator 105d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_LDBackend.initRelocator(*m_pLinker); 10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // initialize BranchIslandFactory 10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_LDBackend.initBRIslandFactory(); 10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // initialize StubFactory 11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_LDBackend.initStubFactory(); 11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // initialize target stubs 11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_LDBackend.initTargetStubs(*m_pLinker); 11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// initStdSections - initialize standard sections 11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::initStdSections() 12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ObjectBuilder builder(m_Config, m_Module); 12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 12322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // initialize standard sections 12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!m_LDBackend.initStdSections(builder)) 12522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // initialize target-dependent sections 12822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_LDBackend.initTargetSections(m_Module, builder); 12922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid ObjectLinker::normalize() 13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 13522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- set up inputs ----- // 13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Module::input_iterator input, inEnd = m_Module.input_end(); 13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao for (input = m_Module.input_begin(); input!=inEnd; ++input) { 13822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // is a group node 13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (isGroup(input)) { 140d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao getGroupReader()->readGroup(input, m_Builder.getInputBuilder(), m_Config); 14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao continue; 14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 14322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 14422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // already got type - for example, bitcode or external OIR (object 14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // intermediate representation) 14622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if ((*input)->type() == Input::Script || 14722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao (*input)->type() == Input::Archive || 14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao (*input)->type() == Input::External) 14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao continue; 15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 15122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (Input::Object == (*input)->type()) { 15222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Module.getObjectList().push_back(*input); 15322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao continue; 15422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 15522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (Input::DynObj == (*input)->type()) { 15722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Module.getLibraryList().push_back(*input); 15822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao continue; 15922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 16022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 161d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao // read input as a binary file 162d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao if (m_Config.options().isBinaryInput()) { 163d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao (*input)->setType(Input::Object); 164d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao getBinaryReader()->readBinary(**input); 165d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_Module.getObjectList().push_back(*input); 166d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao } 16722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // is a relocatable object file 168d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao else if (getObjectReader()->isMyFormat(**input)) { 16922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao (*input)->setType(Input::Object); 17022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao getObjectReader()->readHeader(**input); 17122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao getObjectReader()->readSections(**input); 17222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao getObjectReader()->readSymbols(**input); 17322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Module.getObjectList().push_back(*input); 17422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 17522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // is a shared object file 17622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao else if (getDynObjReader()->isMyFormat(**input)) { 17722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao (*input)->setType(Input::DynObj); 17822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao getDynObjReader()->readHeader(**input); 17922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao getDynObjReader()->readSymbols(**input); 18022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Module.getLibraryList().push_back(*input); 18122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 18222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // is an archive 18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao else if (getArchiveReader()->isMyFormat(**input)) { 18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao (*input)->setType(Input::Archive); 185d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao Archive archive(**input, m_Builder.getInputBuilder()); 18622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao getArchiveReader()->readArchive(archive); 18722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if(archive.numOfObjectMember() > 0) { 18822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Module.getInputTree().merge<InputTree::Inclusive>(input, 18922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao archive.inputs()); 19022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 19122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 19222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao else { 19322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao fatal(diag::err_unrecognized_input_file) << (*input)->path() 194d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao << m_Config.targets().triple().str(); 19522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 19622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } // end of for 19722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 19822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 19922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::linkable() const 20022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 20122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // check we have input and output files 20222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (m_Module.getInputTree().empty()) { 20322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao error(diag::err_no_inputs); 20422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 20522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 20622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 20722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // can not mix -static with shared objects 20822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Module::const_lib_iterator lib, libEnd = m_Module.lib_end(); 20922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao for (lib = m_Module.lib_begin(); lib != libEnd; ++lib) { 21022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if((*lib)->attribute()->isStatic()) { 21122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao error(diag::err_mixed_shared_static_objects) 21222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao << (*lib)->name() << (*lib)->path(); 21322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 21422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 21522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 21622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 21722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // can not mix -r with shared objects 21822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 21922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 22022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 22122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// readRelocations - read all relocation entries 22222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// 22322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// All symbols should be read and resolved before this function. 22422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::readRelocations() 22522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 22622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // Bitcode is read by the other path. This function reads relocation sections 22722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // in object files. 22822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao mcld::InputTree::bfs_iterator input, inEnd = m_Module.getInputTree().bfs_end(); 22922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao for (input=m_Module.getInputTree().bfs_begin(); input!=inEnd; ++input) { 23022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if ((*input)->type() == Input::Object && (*input)->hasMemArea()) { 23122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!getObjectReader()->readRelocations(**input)) 23222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 23322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 23422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ignore the other kinds of files. 23522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 23622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 23722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 23822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 23922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// mergeSections - put allinput sections into output sections 24022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::mergeSections() 24122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 24222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ObjectBuilder builder(m_Config, m_Module); 24322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Module::obj_iterator obj, objEnd = m_Module.obj_end(); 24422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao for (obj = m_Module.obj_begin(); obj != objEnd; ++obj) { 24522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDContext::sect_iterator sect, sectEnd = (*obj)->context()->sectEnd(); 24622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao for (sect = (*obj)->context()->sectBegin(); sect != sectEnd; ++sect) { 24722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao switch ((*sect)->kind()) { 24822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // Some *INPUT sections should not be merged. 24922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::Ignore: 25022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::Null: 25122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::Relocation: 25222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::NamePool: 25322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::Group: 25422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::StackNote: 25522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // skip 25622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao continue; 25722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::Target: 25822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!m_LDBackend.mergeSection(m_Module, **sect)) { 25922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao error(diag::err_cannot_merge_section) << (*sect)->name() 26022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao << (*obj)->name(); 26122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 26222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 26322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao break; 26422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::EhFrame: { 26522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!(*sect)->hasEhFrame()) 26622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao continue; // skip 26722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 26822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!builder.MergeSection(**sect)) { 26922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao error(diag::err_cannot_merge_section) << (*sect)->name() 27022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao << (*obj)->name(); 27122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 27222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 27322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao break; 27422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 27522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao default: { 27622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!(*sect)->hasSectionData()) 27722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao continue; // skip 27822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 27922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!builder.MergeSection(**sect)) { 28022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao error(diag::err_cannot_merge_section) << (*sect)->name() 28122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao << (*obj)->name(); 28222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 28322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 28422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao break; 28522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 28622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } // end of switch 28722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } // for each section 28822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } // for each obj 28922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 29022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 29122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 29222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// addStandardSymbols - shared object and executable files need some 29322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// standard symbols 29422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @return if there are some input symbols with the same name to the 29522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// standard symbols, return false 29622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::addStandardSymbols() 29722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 29822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // create and add section symbols for each output section 29922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Module::iterator iter, iterEnd = m_Module.end(); 30022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao for (iter = m_Module.begin(); iter != iterEnd; ++iter) { 30122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Module.getSectionSymbolSet().add(**iter, m_Module.getNamePool()); 30222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 30322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 30422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return m_LDBackend.initStandardSymbols(*m_pLinker, m_Module); 30522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 30622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 30722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// addTargetSymbols - some targets, such as MIPS and ARM, need some 30822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// target-dependent symbols 30922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @return if there are some input symbols with the same name to the 31022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// target symbols, return false 31122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::addTargetSymbols() 31222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 31322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_LDBackend.initTargetSymbols(*m_pLinker); 31422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 31522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 31622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 31722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::scanRelocations() 31822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 31922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // apply all relocations of all inputs 32022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Module::obj_iterator input, inEnd = m_Module.obj_end(); 32122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao for (input = m_Module.obj_begin(); input != inEnd; ++input) { 32222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDContext::sect_iterator rs, rsEnd = (*input)->context()->relocSectEnd(); 32322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao for (rs = (*input)->context()->relocSectBegin(); rs != rsEnd; ++rs) { 32422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // bypass the reloc section if 32522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 1. its section kind is changed to Ignore. (The target section is a 32622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // discarded group section.) 32722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 2. it has no reloc data. (All symbols in the input relocs are in the 32822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // discarded group sections) 32922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (LDFileFormat::Ignore == (*rs)->kind() || !(*rs)->hasRelocData()) 33022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao continue; 33122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao RelocData::iterator reloc, rEnd = (*rs)->getRelocData()->end(); 33222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao for (reloc = (*rs)->getRelocData()->begin(); reloc != rEnd; ++reloc) { 33322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Relocation* relocation = llvm::cast<Relocation>(reloc); 33422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // scan relocation 33522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (LinkerConfig::Object != m_Config.codeGenType()) { 33622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_LDBackend.scanRelocation(*relocation, 33722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *m_pLinker, 33822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Module, 33922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *(*rs)->getLink()); 34022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 34122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao else { 34222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_LDBackend.partialScanRelocation(*relocation, 34322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *m_pLinker, 34422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Module, 34522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *(*rs)->getLink()); 34622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 34722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } // for all relocations 34822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } // for all relocation section 34922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } // for all inputs 35022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 35122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 35222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 35322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// prelayout - help backend to do some modification before layout 35422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::prelayout() 35522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 35622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // finalize the section symbols, set their fragment reference and push them 35722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // into output symbol table 358d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao Module::iterator sect, sEnd = m_Module.end(); 359d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao for (sect = m_Module.begin(); sect != sEnd; ++sect) { 360d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_Module.getSectionSymbolSet().finalize(**sect, m_Module.getSymbolTable()); 36122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 36222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 36322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_LDBackend.preLayout(m_Module, *m_pLinker); 36422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 365d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao if (LinkerConfig::Object != m_Config.codeGenType() || 366d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_Config.options().isDefineCommon()) 367d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_LDBackend.allocateCommonSymbols(m_Module); 36822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 36922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// check program interpreter - computer the name size of the runtime dyld 37022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!m_pLinker->isStaticLink() && 37122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao (LinkerConfig::Exec == m_Config.codeGenType() || 37222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Config.options().isPIE() || 37322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Config.options().hasDyld())) 37422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_LDBackend.sizeInterp(); 37522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 37622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// measure NamePools - compute the size of name pool sections 37722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// In ELF, will compute the size of.symtab, .strtab, .dynsym, .dynstr, 37822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// .hash and .shstrtab sections. 37922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// 38022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// dump all symbols and strings from FragmentLinker and build the format-dependent 38122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// hash table. 38222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_LDBackend.sizeNamePools(m_Module, m_pLinker->isStaticLink()); 38322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 38422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 38522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 38622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 38722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// layout - linearly layout all output sections and reserve some space 38822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// for GOT/PLT 38922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// Because we do not support instruction relaxing in this early version, 39022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// if there is a branch can not jump to its target, we return false 39122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// directly 39222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::layout() 39322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 394d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_LDBackend.layout(m_Module, *m_pLinker); 395d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao return true; 39622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 39722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 39822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// prelayout - help backend to do some modification after layout 39922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::postlayout() 40022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 40122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_LDBackend.postLayout(m_Module, *m_pLinker); 40222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 40322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 40422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 40522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// finalizeSymbolValue - finalize the resolved symbol value. 40622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// Before relocate(), after layout(), FragmentLinker should correct value of all 40722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// symbol. 40822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::finalizeSymbolValue() 40922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 41022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return m_pLinker->finalizeSymbols(); 41122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 41222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 41322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// relocate - applying relocation entries and create relocation 41422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// section in the output files 41522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// Create relocation section, asking TargetLDBackend to 41622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// read the relocation information into RelocationEntry 41722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// and push_back into the relocation section 41822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::relocation() 41922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 42022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return m_pLinker->applyRelocations(); 42122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 42222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 42322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// emitOutput - emit the output file. 42422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::emitOutput(MemoryArea& pOutput) 42522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 42622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao switch(m_Config.codeGenType()) { 42722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LinkerConfig::Object: 42822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao getObjectWriter()->writeObject(m_Module, pOutput); 42922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 43022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LinkerConfig::DynObj: 43122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao getDynObjWriter()->writeDynObj(m_Module, pOutput); 43222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 43322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LinkerConfig::Exec: 43422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao getExecWriter()->writeExecutable(m_Module, pOutput); 43522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 436d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao case LinkerConfig::Binary: 437d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao getBinaryWriter()->writeBinary(m_Module, pOutput); 438d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao return true; 43922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao default: 44022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao fatal(diag::unrecognized_output_file) << m_Config.codeGenType(); 44122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 44222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 44322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 44422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 44522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// postProcessing - do modification after all processes 44622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::postProcessing(MemoryArea& pOutput) 44722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 44822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pLinker->syncRelocationResult(pOutput); 44922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 45022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // emit .eh_frame_hdr 45122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // eh_frame_hdr should be emitted after syncRelocation, because eh_frame_hdr 45222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // needs FDE PC value, which will be corrected at syncRelocation 45322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_LDBackend.postProcessing(*m_pLinker, pOutput); 45422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 45522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 45622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 457