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//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Object/ObjectLinker.h" 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/InputTree.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/IRBuilder.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerConfig.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerScript.h" 1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Module.h" 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/Relocation.h" 1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/Archive.h" 1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ArchiveReader.h" 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/BinaryReader.h" 2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/BranchIslandFactory.h" 2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/DebugString.h" 2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/DynObjReader.h" 2337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/GarbageCollection.h" 2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/GroupReader.h" 2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/IdenticalCodeFolding.h" 2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDContext.h" 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSection.h" 2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ObjectReader.h" 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ObjectWriter.h" 3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/Relocator.h" 3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/RelocData.h" 3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ResolveInfo.h" 3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/SectionData.h" 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Object/ObjectBuilder.h" 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/Assignment.h" 3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/Operand.h" 3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/RpnEvaluator.h" 3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/ScriptFile.h" 3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/ScriptReader.h" 4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/FileOutputBuffer.h" 4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MsgHandling.h" 4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/RealPath.h" 4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/TargetLDBackend.h" 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/Casting.h> 4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/Support/Host.h> 4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines 480dea6bc96bb52346737966839ac68644f7939f58Stephen Hines#include <system_error> 496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 5037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===----------------------------------------------------------------------===// 5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// ObjectLinker 5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===----------------------------------------------------------------------===// 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoObjectLinker::ObjectLinker(const LinkerConfig& pConfig, 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao TargetLDBackend& pLDBackend) 5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines : m_Config(pConfig), 5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pModule(NULL), 5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pBuilder(NULL), 6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_LDBackend(pLDBackend), 6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pObjectReader(NULL), 6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pDynObjReader(NULL), 6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pArchiveReader(NULL), 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pGroupReader(NULL), 6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pBinaryReader(NULL), 6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pScriptReader(NULL), 6737b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pWriter(NULL) { 6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7037b74a387bb3993387029859c2d9d051c41c724eStephen HinesObjectLinker::~ObjectLinker() { 7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao delete m_pObjectReader; 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao delete m_pDynObjReader; 7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao delete m_pArchiveReader; 74d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao delete m_pGroupReader; 75d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao delete m_pBinaryReader; 7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines delete m_pScriptReader; 776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines delete m_pWriter; 786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 8037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::initialize(Module& pModule, IRBuilder& pBuilder) { 816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pModule = &pModule; 826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pBuilder = &pBuilder; 83f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // initialize the readers and writers 8537b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pObjectReader = m_LDBackend.createObjectReader(*m_pBuilder); 866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pArchiveReader = m_LDBackend.createArchiveReader(*m_pModule); 8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pDynObjReader = m_LDBackend.createDynObjReader(*m_pBuilder); 8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pBinaryReader = m_LDBackend.createBinaryReader(*m_pBuilder); 8937b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pGroupReader = new GroupReader(*m_pModule, 9037b74a387bb3993387029859c2d9d051c41c724eStephen Hines *m_pObjectReader, 9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines *m_pDynObjReader, 9237b74a387bb3993387029859c2d9d051c41c724eStephen Hines *m_pArchiveReader, 9337b74a387bb3993387029859c2d9d051c41c724eStephen Hines *m_pBinaryReader); 9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pScriptReader = new ScriptReader( 9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines *m_pObjectReader, *m_pArchiveReader, *m_pDynObjReader, *m_pGroupReader); 9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pWriter = m_LDBackend.createWriter(); 9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 98d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao // initialize Relocator 996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_LDBackend.initRelocator(); 10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// initStdSections - initialize standard sections 10537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::initStdSections() { 106533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines ObjectBuilder builder(*m_pModule); 10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // initialize standard sections 10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!m_LDBackend.initStdSections(builder)) 11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // initialize target-dependent sections 1136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_LDBackend.initTargetSections(*m_pModule, builder); 11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ObjectLinker::addUndefinedSymbols() { 1190dea6bc96bb52346737966839ac68644f7939f58Stephen Hines // Add the symbol set by -u as an undefind global symbol into symbol pool 1200dea6bc96bb52346737966839ac68644f7939f58Stephen Hines GeneralOptions::const_undef_sym_iterator usym; 1210dea6bc96bb52346737966839ac68644f7939f58Stephen Hines GeneralOptions::const_undef_sym_iterator usymEnd = 12237b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Config.options().undef_sym_end(); 1230dea6bc96bb52346737966839ac68644f7939f58Stephen Hines for (usym = m_Config.options().undef_sym_begin(); usym != usymEnd; ++usym) { 1240dea6bc96bb52346737966839ac68644f7939f58Stephen Hines Resolver::Result result; 12537b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pModule->getNamePool().insertSymbol(*usym, // name 12637b74a387bb3993387029859c2d9d051c41c724eStephen Hines false, // isDyn 1270dea6bc96bb52346737966839ac68644f7939f58Stephen Hines ResolveInfo::NoType, 1280dea6bc96bb52346737966839ac68644f7939f58Stephen Hines ResolveInfo::Undefined, 1290dea6bc96bb52346737966839ac68644f7939f58Stephen Hines ResolveInfo::Global, 13037b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x0, // size 13137b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x0, // value 1320dea6bc96bb52346737966839ac68644f7939f58Stephen Hines ResolveInfo::Default, 1330dea6bc96bb52346737966839ac68644f7939f58Stephen Hines NULL, 1340dea6bc96bb52346737966839ac68644f7939f58Stephen Hines result); 1350dea6bc96bb52346737966839ac68644f7939f58Stephen Hines 1360dea6bc96bb52346737966839ac68644f7939f58Stephen Hines LDSymbol* output_sym = result.info->outSymbol(); 1370dea6bc96bb52346737966839ac68644f7939f58Stephen Hines // create the output symbol if it dose not have one 13837b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (!result.existent || (output_sym != NULL)) { 1390dea6bc96bb52346737966839ac68644f7939f58Stephen Hines output_sym = LDSymbol::Create(*result.info); 1400dea6bc96bb52346737966839ac68644f7939f58Stephen Hines result.info->setSymPtr(output_sym); 1410dea6bc96bb52346737966839ac68644f7939f58Stephen Hines output_sym->setFragmentRef(FragmentRef::Null()); 1420dea6bc96bb52346737966839ac68644f7939f58Stephen Hines } 1430dea6bc96bb52346737966839ac68644f7939f58Stephen Hines } 1440dea6bc96bb52346737966839ac68644f7939f58Stephen Hines} 1450dea6bc96bb52346737966839ac68644f7939f58Stephen Hines 14637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ObjectLinker::normalize() { 14722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- set up inputs ----- // 1486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Module::input_iterator input, inEnd = m_pModule->input_end(); 14937b74a387bb3993387029859c2d9d051c41c724eStephen Hines for (input = m_pModule->input_begin(); input != inEnd; ++input) { 15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // is a group node 15122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (isGroup(input)) { 15237b74a387bb3993387029859c2d9d051c41c724eStephen Hines getGroupReader()->readGroup( 15337b74a387bb3993387029859c2d9d051c41c724eStephen Hines input, inEnd, m_pBuilder->getInputBuilder(), m_Config); 15422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao continue; 15522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 15722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // already got type - for example, bitcode or external OIR (object 15822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // intermediate representation) 15922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if ((*input)->type() == Input::Script || 16022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao (*input)->type() == Input::Archive || 16122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao (*input)->type() == Input::External) 16222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao continue; 16322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 16422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (Input::Object == (*input)->type()) { 1656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pModule->getObjectList().push_back(*input); 16622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao continue; 16722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 16822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 16922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (Input::DynObj == (*input)->type()) { 1706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pModule->getLibraryList().push_back(*input); 17122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao continue; 17222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 17322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 17487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool doContinue = false; 175d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao // read input as a binary file 17687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (getBinaryReader()->isMyFormat(**input, doContinue)) { 177d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao (*input)->setType(Input::Object); 178d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao getBinaryReader()->readBinary(**input); 1796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pModule->getObjectList().push_back(*input); 18037b74a387bb3993387029859c2d9d051c41c724eStephen Hines } else if (doContinue && 18137b74a387bb3993387029859c2d9d051c41c724eStephen Hines getObjectReader()->isMyFormat(**input, doContinue)) { 18237b74a387bb3993387029859c2d9d051c41c724eStephen Hines // is a relocatable object file 18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao (*input)->setType(Input::Object); 18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao getObjectReader()->readHeader(**input); 18522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao getObjectReader()->readSections(**input); 18622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao getObjectReader()->readSymbols(**input); 1876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pModule->getObjectList().push_back(*input); 18837b74a387bb3993387029859c2d9d051c41c724eStephen Hines } else if (doContinue && 18937b74a387bb3993387029859c2d9d051c41c724eStephen Hines getDynObjReader()->isMyFormat(**input, doContinue)) { 19037b74a387bb3993387029859c2d9d051c41c724eStephen Hines // is a shared object file 19122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao (*input)->setType(Input::DynObj); 19222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao getDynObjReader()->readHeader(**input); 19322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao getDynObjReader()->readSymbols(**input); 1946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pModule->getLibraryList().push_back(*input); 19537b74a387bb3993387029859c2d9d051c41c724eStephen Hines } else if (doContinue && 19637b74a387bb3993387029859c2d9d051c41c724eStephen Hines getArchiveReader()->isMyFormat(**input, doContinue)) { 19737b74a387bb3993387029859c2d9d051c41c724eStephen Hines // is an archive 19822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao (*input)->setType(Input::Archive); 1990dea6bc96bb52346737966839ac68644f7939f58Stephen Hines if (m_Config.options().isInExcludeLIBS(**input)) { 2000dea6bc96bb52346737966839ac68644f7939f58Stephen Hines (*input)->setNoExport(); 2010dea6bc96bb52346737966839ac68644f7939f58Stephen Hines } 2026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Archive archive(**input, m_pBuilder->getInputBuilder()); 20387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines getArchiveReader()->readArchive(m_Config, archive); 20437b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (archive.numOfObjectMember() > 0) { 2056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pModule->getInputTree().merge<InputTree::Inclusive>(input, 20687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines archive.inputs()); 20787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 20837b74a387bb3993387029859c2d9d051c41c724eStephen Hines } else if (doContinue && 20937b74a387bb3993387029859c2d9d051c41c724eStephen Hines getScriptReader()->isMyFormat(**input, doContinue)) { 21037b74a387bb3993387029859c2d9d051c41c724eStephen Hines // try to parse input as a linker script 21137b74a387bb3993387029859c2d9d051c41c724eStephen Hines ScriptFile script( 21237b74a387bb3993387029859c2d9d051c41c724eStephen Hines ScriptFile::LDScript, **input, m_pBuilder->getInputBuilder()); 21387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (getScriptReader()->readScript(m_Config, script)) { 21487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines (*input)->setType(Input::Script); 21587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines script.activate(*m_pModule); 21687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (script.inputs().size() > 0) { 21737b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pModule->getInputTree().merge<InputTree::Inclusive>( 21837b74a387bb3993387029859c2d9d051c41c724eStephen Hines input, script.inputs()); 21987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 22022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 22137b74a387bb3993387029859c2d9d051c41c724eStephen Hines } else { 22287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (m_Config.options().warnMismatch()) 22337b74a387bb3993387029859c2d9d051c41c724eStephen Hines warning(diag::warn_unrecognized_input_file) 22437b74a387bb3993387029859c2d9d051c41c724eStephen Hines << (*input)->path() << m_Config.targets().triple().str(); 22522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 22637b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // end of for 22722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 22822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 22937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::linkable() const { 23022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // check we have input and output files 2316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines if (m_pModule->getInputTree().empty()) { 23222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao error(diag::err_no_inputs); 23322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 23422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 23522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 23622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // can not mix -static with shared objects 2376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Module::const_lib_iterator lib, libEnd = m_pModule->lib_end(); 2386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines for (lib = m_pModule->lib_begin(); lib != libEnd; ++lib) { 23937b74a387bb3993387029859c2d9d051c41c724eStephen Hines if ((*lib)->attribute()->isStatic()) { 24037b74a387bb3993387029859c2d9d051c41c724eStephen Hines error(diag::err_mixed_shared_static_objects) << (*lib)->name() 24137b74a387bb3993387029859c2d9d051c41c724eStephen Hines << (*lib)->path(); 24222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 24322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 24422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 24522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // --nmagic and --omagic options lead to static executable program. 2476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // These options turn off page alignment of sections. Because the 2486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // sections are not aligned to pages, these sections can not contain any 2496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // exported functions. Also, because the two options disable linking 2506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // against shared libraries, the output absolutely does not call outside 2516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // functions. 2526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines if (m_Config.options().nmagic() && !m_Config.isCodeStatic()) { 2536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines error(diag::err_nmagic_not_static); 2546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return false; 2556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 2566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines if (m_Config.options().omagic() && !m_Config.isCodeStatic()) { 2576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines error(diag::err_omagic_not_static); 2586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return false; 2596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 2606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 26122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 26222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 26322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 26437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ObjectLinker::dataStrippingOpt() { 26537b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (m_Config.codeGenType() == LinkerConfig::Object) { 26637b74a387bb3993387029859c2d9d051c41c724eStephen Hines return; 26737b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 26837b74a387bb3993387029859c2d9d051c41c724eStephen Hines 26987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Garbege collection 27087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (m_Config.options().GCSections()) { 27187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines GarbageCollection GC(m_Config, m_LDBackend, *m_pModule); 27287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines GC.run(); 27387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 2740dea6bc96bb52346737966839ac68644f7939f58Stephen Hines 2750dea6bc96bb52346737966839ac68644f7939f58Stephen Hines // Identical code folding 2762bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (m_Config.options().getICFMode() != GeneralOptions::ICF::None) { 2770dea6bc96bb52346737966839ac68644f7939f58Stephen Hines IdenticalCodeFolding icf(m_Config, m_LDBackend, *m_pModule); 2780dea6bc96bb52346737966839ac68644f7939f58Stephen Hines icf.foldIdenticalCode(); 2790dea6bc96bb52346737966839ac68644f7939f58Stephen Hines } 28087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return; 28187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 28287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 28322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// readRelocations - read all relocation entries 28422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// 28522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// All symbols should be read and resolved before this function. 28637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::readRelocations() { 28722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // Bitcode is read by the other path. This function reads relocation sections 28822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // in object files. 28937b74a387bb3993387029859c2d9d051c41c724eStephen Hines mcld::InputTree::bfs_iterator input, 29037b74a387bb3993387029859c2d9d051c41c724eStephen Hines inEnd = m_pModule->getInputTree().bfs_end(); 29137b74a387bb3993387029859c2d9d051c41c724eStephen Hines for (input = m_pModule->getInputTree().bfs_begin(); input != inEnd; ++input) { 29222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if ((*input)->type() == Input::Object && (*input)->hasMemArea()) { 29322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!getObjectReader()->readRelocations(**input)) 29422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 29522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 29622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ignore the other kinds of files. 29722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 29822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 29922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 30022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 30122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// mergeSections - put allinput sections into output sections 30237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::mergeSections() { 303a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines // run the target-dependent hooks before merging sections 304a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines m_LDBackend.preMergeSections(*m_pModule); 305a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 30637b74a387bb3993387029859c2d9d051c41c724eStephen Hines // Set up input/output from ldscript requirement if any 30737b74a387bb3993387029859c2d9d051c41c724eStephen Hines { 30837b74a387bb3993387029859c2d9d051c41c724eStephen Hines RpnEvaluator evaluator(*m_pModule, m_LDBackend); 30937b74a387bb3993387029859c2d9d051c41c724eStephen Hines SectionMap::iterator out, outBegin, outEnd; 31037b74a387bb3993387029859c2d9d051c41c724eStephen Hines outBegin = m_pModule->getScript().sectionMap().begin(); 31137b74a387bb3993387029859c2d9d051c41c724eStephen Hines outEnd = m_pModule->getScript().sectionMap().end(); 31237b74a387bb3993387029859c2d9d051c41c724eStephen Hines for (out = outBegin; out != outEnd; ++out) { 31337b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t out_align = 0x0, in_align = 0x0; 31437b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSection* out_sect = (*out)->getSection(); 31537b74a387bb3993387029859c2d9d051c41c724eStephen Hines SectionMap::Output::iterator in, inBegin, inEnd; 31637b74a387bb3993387029859c2d9d051c41c724eStephen Hines inBegin = (*out)->begin(); 31737b74a387bb3993387029859c2d9d051c41c724eStephen Hines inEnd = (*out)->end(); 31837b74a387bb3993387029859c2d9d051c41c724eStephen Hines 31937b74a387bb3993387029859c2d9d051c41c724eStephen Hines // force input alignment from ldscript if any 32037b74a387bb3993387029859c2d9d051c41c724eStephen Hines if ((*out)->prolog().hasSubAlign()) { 32137b74a387bb3993387029859c2d9d051c41c724eStephen Hines evaluator.eval((*out)->prolog().subAlign(), in_align); 32237b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 32337b74a387bb3993387029859c2d9d051c41c724eStephen Hines 32437b74a387bb3993387029859c2d9d051c41c724eStephen Hines for (in = inBegin; in != inEnd; ++in) { 32537b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSection* in_sect = (*in)->getSection(); 32637b74a387bb3993387029859c2d9d051c41c724eStephen Hines if ((*out)->prolog().hasSubAlign()) 32737b74a387bb3993387029859c2d9d051c41c724eStephen Hines in_sect->setAlign(in_align); 32837b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for each input section description 32937b74a387bb3993387029859c2d9d051c41c724eStephen Hines 33037b74a387bb3993387029859c2d9d051c41c724eStephen Hines // force output alignment from ldscript if any 33137b74a387bb3993387029859c2d9d051c41c724eStephen Hines if ((*out)->prolog().hasAlign()) { 33237b74a387bb3993387029859c2d9d051c41c724eStephen Hines evaluator.eval((*out)->prolog().align(), out_align); 33337b74a387bb3993387029859c2d9d051c41c724eStephen Hines out_sect->setAlign(out_align); 33437b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 33537b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for each output section description 33637b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 33737b74a387bb3993387029859c2d9d051c41c724eStephen Hines 338533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines ObjectBuilder builder(*m_pModule); 3396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Module::obj_iterator obj, objEnd = m_pModule->obj_end(); 3406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines for (obj = m_pModule->obj_begin(); obj != objEnd; ++obj) { 34122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDContext::sect_iterator sect, sectEnd = (*obj)->context()->sectEnd(); 34222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao for (sect = (*obj)->context()->sectBegin(); sect != sectEnd; ++sect) { 34322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao switch ((*sect)->kind()) { 34422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // Some *INPUT sections should not be merged. 3450dea6bc96bb52346737966839ac68644f7939f58Stephen Hines case LDFileFormat::Folded: 34622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::Ignore: 34722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::Null: 34822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::NamePool: 34922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::Group: 35022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::StackNote: 35122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // skip 35222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao continue; 35337b74a387bb3993387029859c2d9d051c41c724eStephen Hines case LDFileFormat::Relocation: 35487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (!(*sect)->hasRelocData()) 35537b74a387bb3993387029859c2d9d051c41c724eStephen Hines continue; // skip 35687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3570dea6bc96bb52346737966839ac68644f7939f58Stephen Hines if ((*sect)->getLink()->kind() == LDFileFormat::Ignore || 3580dea6bc96bb52346737966839ac68644f7939f58Stephen Hines (*sect)->getLink()->kind() == LDFileFormat::Folded) 35987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines (*sect)->setKind(LDFileFormat::Ignore); 36087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines break; 36122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::Target: 36287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (!m_LDBackend.mergeSection(*m_pModule, **obj, **sect)) { 36322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao error(diag::err_cannot_merge_section) << (*sect)->name() 36422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao << (*obj)->name(); 36522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 36622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 36722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao break; 36822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::EhFrame: { 36922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!(*sect)->hasEhFrame()) 37037b74a387bb3993387029859c2d9d051c41c724eStephen Hines continue; // skip 37122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 372f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection* out_sect = NULL; 37337b74a387bb3993387029859c2d9d051c41c724eStephen Hines if ((out_sect = builder.MergeSection(**obj, **sect)) != NULL) { 37487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (!m_LDBackend.updateSectionFlags(*out_sect, **sect)) { 37587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines error(diag::err_cannot_merge_section) << (*sect)->name() 37687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines << (*obj)->name(); 37787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return false; 37887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 37922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 38022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao break; 38122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 38237b74a387bb3993387029859c2d9d051c41c724eStephen Hines case LDFileFormat::DebugString: { 38337b74a387bb3993387029859c2d9d051c41c724eStephen Hines // FIXME: disable debug string merge when doing partial link. 38437b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (LinkerConfig::Object == m_Config.codeGenType()) 38537b74a387bb3993387029859c2d9d051c41c724eStephen Hines (*sect)->setKind(LDFileFormat::Debug); 38604c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines } 38704c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines // Fall through 38822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao default: { 38922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!(*sect)->hasSectionData()) 39037b74a387bb3993387029859c2d9d051c41c724eStephen Hines continue; // skip 39122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 392f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection* out_sect = NULL; 39337b74a387bb3993387029859c2d9d051c41c724eStephen Hines if ((out_sect = builder.MergeSection(**obj, **sect)) != NULL) { 39487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (!m_LDBackend.updateSectionFlags(*out_sect, **sect)) { 39587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines error(diag::err_cannot_merge_section) << (*sect)->name() 39687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines << (*obj)->name(); 39787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return false; 39887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 39922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 40022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao break; 40122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 40237b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // end of switch 40337b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for each section 40437b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for each obj 40537b74a387bb3993387029859c2d9d051c41c724eStephen Hines 40637b74a387bb3993387029859c2d9d051c41c724eStephen Hines { 40737b74a387bb3993387029859c2d9d051c41c724eStephen Hines SectionMap::iterator out, outBegin, outEnd; 40837b74a387bb3993387029859c2d9d051c41c724eStephen Hines outBegin = m_pModule->getScript().sectionMap().begin(); 40937b74a387bb3993387029859c2d9d051c41c724eStephen Hines outEnd = m_pModule->getScript().sectionMap().end(); 41037b74a387bb3993387029859c2d9d051c41c724eStephen Hines for (out = outBegin; out != outEnd; ++out) { 41137b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSection* out_sect = (*out)->getSection(); 41237b74a387bb3993387029859c2d9d051c41c724eStephen Hines SectionMap::Output::iterator in, inBegin, inEnd; 41337b74a387bb3993387029859c2d9d051c41c724eStephen Hines inBegin = (*out)->begin(); 41437b74a387bb3993387029859c2d9d051c41c724eStephen Hines inEnd = (*out)->end(); 41537b74a387bb3993387029859c2d9d051c41c724eStephen Hines 41637b74a387bb3993387029859c2d9d051c41c724eStephen Hines for (in = inBegin; in != inEnd; ++in) { 41737b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSection* in_sect = (*in)->getSection(); 41837b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (builder.MoveSectionData(*in_sect->getSectionData(), 41937b74a387bb3993387029859c2d9d051c41c724eStephen Hines *out_sect->getSectionData())) { 42037b74a387bb3993387029859c2d9d051c41c724eStephen Hines builder.UpdateSectionAlign(*out_sect, *in_sect); 42137b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_LDBackend.updateSectionFlags(*out_sect, *in_sect); 42237b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 42337b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for each input section description 42437b74a387bb3993387029859c2d9d051c41c724eStephen Hines 42537b74a387bb3993387029859c2d9d051c41c724eStephen Hines if ((*out)->hasContent()) { 42637b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSection* target = m_pModule->getSection((*out)->name()); 42737b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(target != NULL && target->hasSectionData()); 42837b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (builder.MoveSectionData(*out_sect->getSectionData(), 42937b74a387bb3993387029859c2d9d051c41c724eStephen Hines *target->getSectionData())) { 43037b74a387bb3993387029859c2d9d051c41c724eStephen Hines builder.UpdateSectionAlign(*target, *out_sect); 43137b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_LDBackend.updateSectionFlags(*target, *out_sect); 43237b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 43387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 43437b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for each output section description 43537b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 43687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 437a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines // run the target-dependent hooks after merging sections 438a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines m_LDBackend.postMergeSections(*m_pModule); 439a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 44022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 44122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 44222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 44337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ObjectLinker::addSymbolToOutput(ResolveInfo& pInfo, Module& pModule) { 44487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // section symbols will be defined by linker later, we should not add section 44587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // symbols to output here 44637b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (ResolveInfo::Section == pInfo.type() || pInfo.outSymbol() == NULL) 44787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return; 44887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 44987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // if the symbols defined in the Ignore sections (e.g. discared by GC), then 45087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // not to put them to output 45137b74a387bb3993387029859c2d9d051c41c724eStephen Hines // make sure that symbols defined in .debug_str won't add into output 45237b74a387bb3993387029859c2d9d051c41c724eStephen Hines // symbol table. Since these symbols has fragRef to input fragments, which 45337b74a387bb3993387029859c2d9d051c41c724eStephen Hines // will refer to input LDSection and has bad result when emitting their 45437b74a387bb3993387029859c2d9d051c41c724eStephen Hines // section index. However, .debug_str actually does not need symobl in 45537b74a387bb3993387029859c2d9d051c41c724eStephen Hines // shrad/executable objects, so it's fine to do so. 45637b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (pInfo.outSymbol()->hasFragRef() && 45737b74a387bb3993387029859c2d9d051c41c724eStephen Hines (LDFileFormat::Ignore == 45837b74a387bb3993387029859c2d9d051c41c724eStephen Hines pInfo.outSymbol() 45937b74a387bb3993387029859c2d9d051c41c724eStephen Hines ->fragRef() 46037b74a387bb3993387029859c2d9d051c41c724eStephen Hines ->frag() 46137b74a387bb3993387029859c2d9d051c41c724eStephen Hines ->getParent() 46237b74a387bb3993387029859c2d9d051c41c724eStephen Hines ->getSection() 46337b74a387bb3993387029859c2d9d051c41c724eStephen Hines .kind() || 46437b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDFileFormat::DebugString == 46537b74a387bb3993387029859c2d9d051c41c724eStephen Hines pInfo.outSymbol() 46637b74a387bb3993387029859c2d9d051c41c724eStephen Hines ->fragRef() 46737b74a387bb3993387029859c2d9d051c41c724eStephen Hines ->frag() 46837b74a387bb3993387029859c2d9d051c41c724eStephen Hines ->getParent() 46937b74a387bb3993387029859c2d9d051c41c724eStephen Hines ->getSection() 47037b74a387bb3993387029859c2d9d051c41c724eStephen Hines .kind())) 47187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return; 47287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 47387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (pInfo.shouldForceLocal(m_Config)) 47487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines pModule.getSymbolTable().forceLocal(*pInfo.outSymbol()); 47587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines else 47687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines pModule.getSymbolTable().add(*pInfo.outSymbol()); 47787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 47887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 47937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ObjectLinker::addSymbolsToOutput(Module& pModule) { 48087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Traverse all the free ResolveInfo and add the output symobols to output 48187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines NamePool::freeinfo_iterator free_it, 48237b74a387bb3993387029859c2d9d051c41c724eStephen Hines free_end = pModule.getNamePool().freeinfo_end(); 48387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (free_it = pModule.getNamePool().freeinfo_begin(); free_it != free_end; 48437b74a387bb3993387029859c2d9d051c41c724eStephen Hines ++free_it) 48587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines addSymbolToOutput(**free_it, pModule); 48687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 48787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Traverse all the resolveInfo and add the output symbol to output 48887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines NamePool::syminfo_iterator info_it, 48937b74a387bb3993387029859c2d9d051c41c724eStephen Hines info_end = pModule.getNamePool().syminfo_end(); 49087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (info_it = pModule.getNamePool().syminfo_begin(); info_it != info_end; 49137b74a387bb3993387029859c2d9d051c41c724eStephen Hines ++info_it) 49287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines addSymbolToOutput(*info_it.getEntry(), pModule); 49387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 49487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 49522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// addStandardSymbols - shared object and executable files need some 49622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// standard symbols 49722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @return if there are some input symbols with the same name to the 49822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// standard symbols, return false 49937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::addStandardSymbols() { 50022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // create and add section symbols for each output section 5016f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Module::iterator iter, iterEnd = m_pModule->end(); 5026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines for (iter = m_pModule->begin(); iter != iterEnd; ++iter) { 5036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pModule->getSectionSymbolSet().add(**iter, m_pModule->getNamePool()); 50422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 50522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return m_LDBackend.initStandardSymbols(*m_pBuilder, *m_pModule); 50722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 50822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 50922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// addTargetSymbols - some targets, such as MIPS and ARM, need some 51022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// target-dependent symbols 51122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @return if there are some input symbols with the same name to the 51222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// target symbols, return false 51337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::addTargetSymbols() { 5146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_LDBackend.initTargetSymbols(*m_pBuilder, *m_pModule); 5156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return true; 5166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 5176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 5186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// addScriptSymbols - define symbols from the command line option or linker 5196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// scripts. 52037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::addScriptSymbols() { 52187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LinkerScript& script = m_pModule->getScript(); 52287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LinkerScript::Assignments::iterator it, ie = script.assignments().end(); 52387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // go through the entire symbol assignments 52487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (it = script.assignments().begin(); it != ie; ++it) { 52587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDSymbol* symbol = NULL; 52687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines assert((*it).second.symbol().type() == Operand::SYMBOL); 52737b74a387bb3993387029859c2d9d051c41c724eStephen Hines const llvm::StringRef symName = (*it).second.symbol().name(); 52837b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Type type = ResolveInfo::NoType; 52937b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Visibility vis = ResolveInfo::Default; 53087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t size = 0; 53187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ResolveInfo* old_info = m_pModule->getNamePool().findInfo(symName); 532f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // if the symbol does not exist, we can set type to NOTYPE 533f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // else we retain its type, same goes for size - 0 or retain old value 534f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // and visibility - Default or retain 535f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (old_info != NULL) { 53687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines type = static_cast<ResolveInfo::Type>(old_info->type()); 53787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines vis = old_info->visibility(); 53887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size = old_info->size(); 539f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 54087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 54187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Add symbol and refine the visibility if needed 54287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // FIXME: bfd linker would change the binding instead, but currently 54387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // ABS is also a kind of Binding in ResolveInfo. 54487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines switch ((*it).second.type()) { 54537b74a387bb3993387029859c2d9d051c41c724eStephen Hines case Assignment::HIDDEN: 54637b74a387bb3993387029859c2d9d051c41c724eStephen Hines vis = ResolveInfo::Hidden; 54787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Fall through 54837b74a387bb3993387029859c2d9d051c41c724eStephen Hines case Assignment::DEFAULT: 54937b74a387bb3993387029859c2d9d051c41c724eStephen Hines symbol = m_pBuilder->AddSymbol<IRBuilder::Force, IRBuilder::Unresolve>( 55037b74a387bb3993387029859c2d9d051c41c724eStephen Hines symName, 55137b74a387bb3993387029859c2d9d051c41c724eStephen Hines type, 55237b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Define, 55337b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Absolute, 55437b74a387bb3993387029859c2d9d051c41c724eStephen Hines size, 55537b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x0, 55637b74a387bb3993387029859c2d9d051c41c724eStephen Hines FragmentRef::Null(), 55737b74a387bb3993387029859c2d9d051c41c724eStephen Hines vis); 55837b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 55937b74a387bb3993387029859c2d9d051c41c724eStephen Hines case Assignment::PROVIDE_HIDDEN: 56037b74a387bb3993387029859c2d9d051c41c724eStephen Hines vis = ResolveInfo::Hidden; 56187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Fall through 56237b74a387bb3993387029859c2d9d051c41c724eStephen Hines case Assignment::PROVIDE: 56337b74a387bb3993387029859c2d9d051c41c724eStephen Hines symbol = 56437b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pBuilder->AddSymbol<IRBuilder::AsReferred, IRBuilder::Unresolve>( 56537b74a387bb3993387029859c2d9d051c41c724eStephen Hines symName, 56637b74a387bb3993387029859c2d9d051c41c724eStephen Hines type, 56737b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Define, 56837b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Absolute, 56937b74a387bb3993387029859c2d9d051c41c724eStephen Hines size, 57037b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x0, 57137b74a387bb3993387029859c2d9d051c41c724eStephen Hines FragmentRef::Null(), 57237b74a387bb3993387029859c2d9d051c41c724eStephen Hines vis); 57337b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 574f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 57587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Set symbol of this assignment. 57687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines (*it).first = symbol; 577f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 57822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 57922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 58022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 58137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::scanRelocations() { 58222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // apply all relocations of all inputs 5836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Module::obj_iterator input, inEnd = m_pModule->obj_end(); 5846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines for (input = m_pModule->obj_begin(); input != inEnd; ++input) { 585f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_LDBackend.getRelocator()->initializeScan(**input); 58622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDContext::sect_iterator rs, rsEnd = (*input)->context()->relocSectEnd(); 58722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao for (rs = (*input)->context()->relocSectBegin(); rs != rsEnd; ++rs) { 58822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // bypass the reloc section if 58922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 1. its section kind is changed to Ignore. (The target section is a 59022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // discarded group section.) 59122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 2. it has no reloc data. (All symbols in the input relocs are in the 59222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // discarded group sections) 59322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (LDFileFormat::Ignore == (*rs)->kind() || !(*rs)->hasRelocData()) 59422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao continue; 59522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao RelocData::iterator reloc, rEnd = (*rs)->getRelocData()->end(); 59622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao for (reloc = (*rs)->getRelocData()->begin(); reloc != rEnd; ++reloc) { 59722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Relocation* relocation = llvm::cast<Relocation>(reloc); 59887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 59987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // bypass the reloc if the symbol is in the discarded input section 60087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ResolveInfo* info = relocation->symInfo(); 60187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (!info->outSymbol()->hasFragRef() && 60287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ResolveInfo::Section == info->type() && 60387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ResolveInfo::Undefined == info->desc()) 60437b74a387bb3993387029859c2d9d051c41c724eStephen Hines continue; 60587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 60622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // scan relocation 60737b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (LinkerConfig::Object != m_Config.codeGenType()) { 608f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_LDBackend.getRelocator()->scanRelocation( 60937b74a387bb3993387029859c2d9d051c41c724eStephen Hines *relocation, *m_pBuilder, *m_pModule, **rs, **input); 61037b74a387bb3993387029859c2d9d051c41c724eStephen Hines } else { 611f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_LDBackend.getRelocator()->partialScanRelocation( 61237b74a387bb3993387029859c2d9d051c41c724eStephen Hines *relocation, *m_pModule); 61337b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 61437b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for all relocations 61537b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for all relocation section 616f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_LDBackend.getRelocator()->finalizeScan(**input); 61737b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for all inputs 61822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 61922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 62022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// initStubs - initialize stub-related stuff. 62237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::initStubs() { 6236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // initialize BranchIslandFactory 6246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_LDBackend.initBRIslandFactory(); 6256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 6266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // initialize StubFactory 6276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_LDBackend.initStubFactory(); 6286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 6296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // initialize target stubs 6306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_LDBackend.initTargetStubs(); 6316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return true; 6326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 6336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 6346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// allocateCommonSymobols - allocate fragments for common symbols to the 6356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// corresponding sections 63637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::allocateCommonSymbols() { 6376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines if (LinkerConfig::Object != m_Config.codeGenType() || 6386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_Config.options().isDefineCommon()) 6396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return m_LDBackend.allocateCommonSymbols(*m_pModule); 6406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return true; 6416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 6426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 64322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// prelayout - help backend to do some modification before layout 64437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::prelayout() { 64522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // finalize the section symbols, set their fragment reference and push them 64622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // into output symbol table 6476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Module::iterator sect, sEnd = m_pModule->end(); 6486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines for (sect = m_pModule->begin(); sect != sEnd; ++sect) { 64937b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pModule->getSectionSymbolSet().finalize( 65037b74a387bb3993387029859c2d9d051c41c724eStephen Hines **sect, 651f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pModule->getSymbolTable(), 652f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_Config.codeGenType() == LinkerConfig::Object); 65322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 65422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_LDBackend.preLayout(*m_pModule, *m_pBuilder); 65622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 65722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// check program interpreter - computer the name size of the runtime dyld 6586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines if (!m_Config.isCodeStatic() && 65922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao (LinkerConfig::Exec == m_Config.codeGenType() || 66037b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Config.options().isPIE() || m_Config.options().hasDyld())) 66122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_LDBackend.sizeInterp(); 66222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 66322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// measure NamePools - compute the size of name pool sections 66422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// In ELF, will compute the size of.symtab, .strtab, .dynsym, .dynstr, 66522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// .hash and .shstrtab sections. 66622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// 66737b74a387bb3993387029859c2d9d051c41c724eStephen Hines /// dump all symbols and strings from ObjectLinker and build the 66837b74a387bb3993387029859c2d9d051c41c724eStephen Hines /// format-dependent 66922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// hash table. 670f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @note sizeNamePools replies on LinkerConfig::CodePosition. Must determine 671f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// code position model before calling GNULDBackend::sizeNamePools() 672f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_LDBackend.sizeNamePools(*m_pModule); 67322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 67487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Do this after backend prelayout since it may add eh_frame entries. 67587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDSection* eh_frame_sect = m_pModule->getSection(".eh_frame"); 67687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (eh_frame_sect && eh_frame_sect->hasEhFrame()) 67787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines eh_frame_sect->getEhFrame()->computeOffsetSize(); 67887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_LDBackend.createAndSizeEhFrameHdr(*m_pModule); 67987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 68037b74a387bb3993387029859c2d9d051c41c724eStephen Hines // size debug string table and set up the debug string offset 68137b74a387bb3993387029859c2d9d051c41c724eStephen Hines // we set the .debug_str size here so that there won't be a section symbol for 68237b74a387bb3993387029859c2d9d051c41c724eStephen Hines // .debug_str. While actually it doesn't matter that .debug_str has section 68337b74a387bb3993387029859c2d9d051c41c724eStephen Hines // symbol or not. 68437b74a387bb3993387029859c2d9d051c41c724eStephen Hines // FIXME: disable debug string merge when doing partial link. 68537b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (LinkerConfig::Object != m_Config.codeGenType()) { 68637b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSection* debug_str_sect = m_pModule->getSection(".debug_str"); 68737b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (debug_str_sect && debug_str_sect->hasDebugString()) 68837b74a387bb3993387029859c2d9d051c41c724eStephen Hines debug_str_sect->getDebugString()->computeOffsetSize(); 68937b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 69022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 69122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 69222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 69322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// layout - linearly layout all output sections and reserve some space 69422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// for GOT/PLT 69522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// Because we do not support instruction relaxing in this early version, 69622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// if there is a branch can not jump to its target, we return false 69722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// directly 69837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::layout() { 6996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_LDBackend.layout(*m_pModule); 700d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao return true; 70122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 70222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 70322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// prelayout - help backend to do some modification after layout 70437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::postlayout() { 7056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_LDBackend.postLayout(*m_pModule, *m_pBuilder); 70622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 70722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 70822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 70922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// finalizeSymbolValue - finalize the resolved symbol value. 71037b74a387bb3993387029859c2d9d051c41c724eStephen Hines/// Before relocate(), after layout(), ObjectLinker should correct value of 71137b74a387bb3993387029859c2d9d051c41c724eStephen Hines/// all 71222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// symbol. 71337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::finalizeSymbolValue() { 71487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Module::sym_iterator symbol, symEnd = m_pModule->sym_end(); 71587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (symbol = m_pModule->sym_begin(); symbol != symEnd; ++symbol) { 71687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if ((*symbol)->resolveInfo()->isAbsolute() || 71787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines (*symbol)->resolveInfo()->type() == ResolveInfo::File) { 71887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // absolute symbols should just use its value directly (i.e., the result 71987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // of symbol resolution) 72087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines continue; 72187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 72287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 72387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if ((*symbol)->resolveInfo()->type() == ResolveInfo::ThreadLocal) { 72487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_LDBackend.finalizeTLSSymbol(**symbol); 72587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines continue; 72687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 72787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 72887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if ((*symbol)->hasFragRef()) { 72987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // set the virtual address of the symbol. If the output file is 73087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // relocatable object file, the section's virtual address becomes zero. 73187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // And the symbol's value become section relative offset. 73287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t value = (*symbol)->fragRef()->getOutputOffset(); 73337b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert((*symbol)->fragRef()->frag() != NULL); 73487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t addr = 73537b74a387bb3993387029859c2d9d051c41c724eStephen Hines (*symbol)->fragRef()->frag()->getParent()->getSection().addr(); 73687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines (*symbol)->setValue(value + addr); 73787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines continue; 73887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 739f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 74087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 74187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines RpnEvaluator evaluator(*m_pModule, m_LDBackend); 74287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool finalized = m_LDBackend.finalizeSymbols(); 74387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool scriptSymsFinalized = true; 74487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LinkerScript& script = m_pModule->getScript(); 74587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LinkerScript::Assignments::iterator assign, assignEnd; 74687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines assignEnd = script.assignments().end(); 74787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (assign = script.assignments().begin(); assign != assignEnd; ++assign) { 74887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDSymbol* symbol = (*assign).first; 74987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Assignment& assignment = (*assign).second; 75087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 75187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (symbol == NULL) 75287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines continue; 75387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 75487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines scriptSymsFinalized &= assignment.assign(evaluator); 75587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (!scriptSymsFinalized) 75687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines break; 75787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 75887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines symbol->setValue(assignment.symbol().value()); 75937b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for each script symbol assignment 76087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 76187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool assertionsPassed = true; 76287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LinkerScript::Assertions::iterator assert, assertEnd; 76387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines assertEnd = script.assertions().end(); 76487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (assert = script.assertions().begin(); assert != assertEnd; ++assert) { 76587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t res = 0x0; 76687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines evaluator.eval((*assert).getRpnExpr(), res); 76787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (res == 0x0) 76887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines fatal(diag::err_assert_failed) << (*assert).message(); 76937b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for each assertion in ldscript 77087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 77187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return finalized && scriptSymsFinalized && assertionsPassed; 77222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 77322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 77422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// relocate - applying relocation entries and create relocation 77522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// section in the output files 77622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// Create relocation section, asking TargetLDBackend to 77722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// read the relocation information into RelocationEntry 77822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// and push_back into the relocation section 77937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::relocation() { 78087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // when producing relocatables, no need to apply relocation 78187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (LinkerConfig::Object == m_Config.codeGenType()) 78287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return true; 78387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 78437b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSection* debug_str_sect = m_pModule->getSection(".debug_str"); 78537b74a387bb3993387029859c2d9d051c41c724eStephen Hines 78687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // apply all relocations of all inputs 78787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Module::obj_iterator input, inEnd = m_pModule->obj_end(); 78887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (input = m_pModule->obj_begin(); input != inEnd; ++input) { 78987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_LDBackend.getRelocator()->initializeApply(**input); 79087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDContext::sect_iterator rs, rsEnd = (*input)->context()->relocSectEnd(); 79187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (rs = (*input)->context()->relocSectBegin(); rs != rsEnd; ++rs) { 79287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // bypass the reloc section if 79387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // 1. its section kind is changed to Ignore. (The target section is a 79487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // discarded group section.) 79587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // 2. it has no reloc data. (All symbols in the input relocs are in the 79687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // discarded group sections) 79787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (LDFileFormat::Ignore == (*rs)->kind() || !(*rs)->hasRelocData()) 79887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines continue; 79987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines RelocData::iterator reloc, rEnd = (*rs)->getRelocData()->end(); 80087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (reloc = (*rs)->getRelocData()->begin(); reloc != rEnd; ++reloc) { 80187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Relocation* relocation = llvm::cast<Relocation>(reloc); 80287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 80387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // bypass the reloc if the symbol is in the discarded input section 80487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ResolveInfo* info = relocation->symInfo(); 80587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (!info->outSymbol()->hasFragRef() && 80687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ResolveInfo::Section == info->type() && 80787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ResolveInfo::Undefined == info->desc()) 80887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines continue; 80987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 81037b74a387bb3993387029859c2d9d051c41c724eStephen Hines // apply the relocation aginst symbol on DebugString 81137b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (info->outSymbol()->hasFragRef() && 81237b74a387bb3993387029859c2d9d051c41c724eStephen Hines info->outSymbol()->fragRef()->frag()->getKind() 81337b74a387bb3993387029859c2d9d051c41c724eStephen Hines == Fragment::Region && 81437b74a387bb3993387029859c2d9d051c41c724eStephen Hines info->outSymbol()->fragRef()->frag()->getParent()->getSection() 81537b74a387bb3993387029859c2d9d051c41c724eStephen Hines .kind() == LDFileFormat::DebugString) { 81637b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(debug_str_sect != NULL); 81737b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(debug_str_sect->hasDebugString()); 81837b74a387bb3993387029859c2d9d051c41c724eStephen Hines debug_str_sect->getDebugString()->applyOffset(*relocation, 81937b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_LDBackend); 82037b74a387bb3993387029859c2d9d051c41c724eStephen Hines continue; 82137b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 82237b74a387bb3993387029859c2d9d051c41c724eStephen Hines 82387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines relocation->apply(*m_LDBackend.getRelocator()); 82437b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for all relocations 82537b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for all relocation section 82687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_LDBackend.getRelocator()->finalizeApply(**input); 82737b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for all inputs 82887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 82987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // apply relocations created by relaxation 83087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines BranchIslandFactory* br_factory = m_LDBackend.getBRIslandFactory(); 83187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines BranchIslandFactory::iterator facIter, facEnd = br_factory->end(); 83287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (facIter = br_factory->begin(); facIter != facEnd; ++facIter) { 83387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines BranchIsland& island = *facIter; 83487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines BranchIsland::reloc_iterator iter, iterEnd = island.reloc_end(); 83587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (iter = island.reloc_begin(); iter != iterEnd; ++iter) 83687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines (*iter)->apply(*m_LDBackend.getRelocator()); 83787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 83837b74a387bb3993387029859c2d9d051c41c724eStephen Hines 83904c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines // apply relocations created by LD backend 84004c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines for (TargetLDBackend::extra_reloc_iterator 84104c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines iter = m_LDBackend.extra_reloc_begin(), 84204c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines end = m_LDBackend.extra_reloc_end(); iter != end; ++iter) { 84304c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines iter->apply(*m_LDBackend.getRelocator()); 84404c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines } 84504c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines 84687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return true; 84722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 84822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 84922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// emitOutput - emit the output file. 85037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::emitOutput(FileOutputBuffer& pOutput) { 8510dea6bc96bb52346737966839ac68644f7939f58Stephen Hines return std::error_code() == getWriter()->writeObject(*m_pModule, pOutput); 85222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 85322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 85422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// postProcessing - do modification after all processes 85537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::postProcessing(FileOutputBuffer& pOutput) { 85687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (LinkerConfig::Object != m_Config.codeGenType()) 85787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines normalSyncRelocationResult(pOutput); 85887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines else 85987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines partialSyncRelocationResult(pOutput); 86022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 86122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // emit .eh_frame_hdr 86222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // eh_frame_hdr should be emitted after syncRelocation, because eh_frame_hdr 86322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // needs FDE PC value, which will be corrected at syncRelocation 8646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_LDBackend.postProcessing(pOutput); 86522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 86622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 86722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 86837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ObjectLinker::normalSyncRelocationResult(FileOutputBuffer& pOutput) { 86987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint8_t* data = pOutput.getBufferStart(); 87087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 87187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // sync all relocations of all inputs 87287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Module::obj_iterator input, inEnd = m_pModule->obj_end(); 87387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (input = m_pModule->obj_begin(); input != inEnd; ++input) { 87487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDContext::sect_iterator rs, rsEnd = (*input)->context()->relocSectEnd(); 87587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (rs = (*input)->context()->relocSectBegin(); rs != rsEnd; ++rs) { 87687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // bypass the reloc section if 87787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // 1. its section kind is changed to Ignore. (The target section is a 87887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // discarded group section.) 87987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // 2. it has no reloc data. (All symbols in the input relocs are in the 88087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // discarded group sections) 88187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (LDFileFormat::Ignore == (*rs)->kind() || !(*rs)->hasRelocData()) 88287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines continue; 88387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines RelocData::iterator reloc, rEnd = (*rs)->getRelocData()->end(); 88487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (reloc = (*rs)->getRelocData()->begin(); reloc != rEnd; ++reloc) { 88587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Relocation* relocation = llvm::cast<Relocation>(reloc); 88687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 88787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // bypass the reloc if the symbol is in the discarded input section 88887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ResolveInfo* info = relocation->symInfo(); 88987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (!info->outSymbol()->hasFragRef() && 89087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ResolveInfo::Section == info->type() && 89187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ResolveInfo::Undefined == info->desc()) 89287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines continue; 89387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 89487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // bypass the relocation with NONE type. This is to avoid overwrite the 89587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // target result by NONE type relocation if there is a place which has 89687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // two relocations to apply to, and one of it is NONE type. The result 89787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // we want is the value of the other relocation result. For example, 89887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // in .exidx, there are usually an R_ARM_NONE and R_ARM_PREL31 apply to 89987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // the same place 90037b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (relocation->type() == 0x0) 90187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines continue; 90287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines writeRelocationResult(*relocation, data); 90337b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for all relocations 90437b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for all relocation section 90537b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for all inputs 90687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 90787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // sync relocations created by relaxation 90887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines BranchIslandFactory* br_factory = m_LDBackend.getBRIslandFactory(); 90987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines BranchIslandFactory::iterator facIter, facEnd = br_factory->end(); 91087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (facIter = br_factory->begin(); facIter != facEnd; ++facIter) { 91187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines BranchIsland& island = *facIter; 91287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines BranchIsland::reloc_iterator iter, iterEnd = island.reloc_end(); 91387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (iter = island.reloc_begin(); iter != iterEnd; ++iter) { 91487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Relocation* reloc = *iter; 91587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines writeRelocationResult(*reloc, data); 91687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 91787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 91804c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines 91904c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines // sync relocations created by LD backend 92004c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines for (TargetLDBackend::extra_reloc_iterator 92104c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines iter = m_LDBackend.extra_reloc_begin(), 92204c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines end = m_LDBackend.extra_reloc_end(); iter != end; ++iter) { 92304c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines writeRelocationResult(*iter, data); 92404c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines } 92587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 92687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 92737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ObjectLinker::partialSyncRelocationResult(FileOutputBuffer& pOutput) { 92887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint8_t* data = pOutput.getBufferStart(); 92987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 93087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // traverse outputs' LDSection to get RelocData 93187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Module::iterator sectIter, sectEnd = m_pModule->end(); 93287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (sectIter = m_pModule->begin(); sectIter != sectEnd; ++sectIter) { 93387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (LDFileFormat::Relocation != (*sectIter)->kind()) 93487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines continue; 93587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 93687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines RelocData* reloc_data = (*sectIter)->getRelocData(); 93787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines RelocData::iterator relocIter, relocEnd = reloc_data->end(); 93887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (relocIter = reloc_data->begin(); relocIter != relocEnd; ++relocIter) { 93987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Relocation* reloc = llvm::cast<Relocation>(relocIter); 94087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 94187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // bypass the relocation with NONE type. This is to avoid overwrite the 94287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // target result by NONE type relocation if there is a place which has 94387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // two relocations to apply to, and one of it is NONE type. The result 94487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // we want is the value of the other relocation result. For example, 94587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // in .exidx, there are usually an R_ARM_NONE and R_ARM_PREL31 apply to 94687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // the same place 94737b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (reloc->type() == 0x0) 94887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines continue; 94987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines writeRelocationResult(*reloc, data); 95087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 95187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 95287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 95387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 95437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ObjectLinker::writeRelocationResult(Relocation& pReloc, uint8_t* pOutput) { 95587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // get output file offset 95687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t out_offset = 95737b74a387bb3993387029859c2d9d051c41c724eStephen Hines pReloc.targetRef().frag()->getParent()->getSection().offset() + 95837b74a387bb3993387029859c2d9d051c41c724eStephen Hines pReloc.targetRef().getOutputOffset(); 95987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 96087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint8_t* target_addr = pOutput + out_offset; 96187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // byte swapping if target and host has different endian, and then write back 96237b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (llvm::sys::IsLittleEndianHost != m_Config.targets().isLittleEndian()) { 96337b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t tmp_data = 0; 96437b74a387bb3993387029859c2d9d051c41c724eStephen Hines 96537b74a387bb3993387029859c2d9d051c41c724eStephen Hines switch (pReloc.size(*m_LDBackend.getRelocator())) { 96637b74a387bb3993387029859c2d9d051c41c724eStephen Hines case 8u: 96737b74a387bb3993387029859c2d9d051c41c724eStephen Hines std::memcpy(target_addr, &pReloc.target(), 1); 96837b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 96937b74a387bb3993387029859c2d9d051c41c724eStephen Hines 97037b74a387bb3993387029859c2d9d051c41c724eStephen Hines case 16u: 97137b74a387bb3993387029859c2d9d051c41c724eStephen Hines tmp_data = mcld::bswap16(pReloc.target()); 97237b74a387bb3993387029859c2d9d051c41c724eStephen Hines std::memcpy(target_addr, &tmp_data, 2); 97337b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 97437b74a387bb3993387029859c2d9d051c41c724eStephen Hines 97537b74a387bb3993387029859c2d9d051c41c724eStephen Hines case 32u: 97637b74a387bb3993387029859c2d9d051c41c724eStephen Hines tmp_data = mcld::bswap32(pReloc.target()); 97737b74a387bb3993387029859c2d9d051c41c724eStephen Hines std::memcpy(target_addr, &tmp_data, 4); 97837b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 97937b74a387bb3993387029859c2d9d051c41c724eStephen Hines 98037b74a387bb3993387029859c2d9d051c41c724eStephen Hines case 64u: 98137b74a387bb3993387029859c2d9d051c41c724eStephen Hines tmp_data = mcld::bswap64(pReloc.target()); 98237b74a387bb3993387029859c2d9d051c41c724eStephen Hines std::memcpy(target_addr, &tmp_data, 8); 98337b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 98437b74a387bb3993387029859c2d9d051c41c724eStephen Hines 98537b74a387bb3993387029859c2d9d051c41c724eStephen Hines default: 98637b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 98787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 98837b74a387bb3993387029859c2d9d051c41c724eStephen Hines } else { 98937b74a387bb3993387029859c2d9d051c41c724eStephen Hines std::memcpy(target_addr, 99037b74a387bb3993387029859c2d9d051c41c724eStephen Hines &pReloc.target(), 99137b74a387bb3993387029859c2d9d051c41c724eStephen Hines pReloc.size(*m_LDBackend.getRelocator()) / 8); 99287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 99387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 99487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 99537b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 996