1551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===- AArch64LDBackend.cpp -----------------------------------------------===// 2551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// 3551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// The MCLinker Project 4551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// 5551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// This file is distributed under the University of Illinois Open Source 6551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// License. See LICENSE.TXT for details. 7551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// 8551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 9551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include "AArch64.h" 10551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include "AArch64ELFDynamic.h" 11551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include "AArch64GNUInfo.h" 12551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include "AArch64LDBackend.h" 13551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include "AArch64Relocator.h" 14551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/IRBuilder.h" 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerConfig.h" 1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/AlignFragment.h" 1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/FillFragment.h" 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/NullFragment.h" 2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/RegionFragment.h" 2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/Stub.h" 2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/BranchIslandFactory.h" 2337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ELFFileFormat.h" 2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ELFSegment.h" 2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ELFSegmentFactory.h" 2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDContext.h" 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/StubFactory.h" 2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MemoryRegion.h" 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MemoryArea.h" 3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MsgHandling.h" 3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/TargetRegistry.h" 3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/ELFAttribute.h" 3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/GNUInfo.h" 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Object/ObjectBuilder.h" 35551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 36551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <llvm/ADT/Triple.h> 37551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <llvm/ADT/Twine.h> 38551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <llvm/Support/Casting.h> 3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <llvm/Support/ELF.h> 4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines 4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <cstring> 42551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 4337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 44551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 45551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 46551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// AArch64GNULDBackend 47551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 48551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesAArch64GNULDBackend::AArch64GNULDBackend(const LinkerConfig& pConfig, 49551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines GNUInfo* pInfo) 5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines : GNULDBackend(pConfig, pInfo), 5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pRelocator(NULL), 5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pGOT(NULL), 5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pGOTPLT(NULL), 5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pPLT(NULL), 5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pRelaDyn(NULL), 5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pRelaPLT(NULL), 5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pDynamic(NULL), 5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pGOTSymbol(NULL) { 5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines} 6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines 6137b74a387bb3993387029859c2d9d051c41c724eStephen HinesAArch64GNULDBackend::~AArch64GNULDBackend() { 62551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pRelocator != NULL) 63551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines delete m_pRelocator; 64551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pGOT == m_pGOTPLT) { 65551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pGOT != NULL) 66551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines delete m_pGOT; 67551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } else { 68551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pGOT != NULL) 69551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines delete m_pGOT; 70551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pGOTPLT != NULL) 71551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines delete m_pGOTPLT; 72551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 73551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pPLT != NULL) 74551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines delete m_pPLT; 75551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pRelaDyn != NULL) 76551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines delete m_pRelaDyn; 77551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pRelaPLT != NULL) 78551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines delete m_pRelaPLT; 79551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pDynamic != NULL) 80551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines delete m_pDynamic; 81551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 82551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 83551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesvoid AArch64GNULDBackend::initTargetSections(Module& pModule, 8437b74a387bb3993387029859c2d9d051c41c724eStephen Hines ObjectBuilder& pBuilder) { 85551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (LinkerConfig::Object != config().codeGenType()) { 86551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ELFFileFormat* file_format = getOutputFormat(); 87551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 88551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // initialize .got 89551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines LDSection& got = file_format->getGOT(); 90551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOT = new AArch64GOT(got); 91551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (config().options().hasNow()) { 92551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // when -z now is given, there will be only one .got section (contains 93551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // both GOTPLT and normal GOT entries), create GOT0 for .got section and 94551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // set m_pGOTPLT to the same .got 95551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOT->createGOT0(); 96551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOTPLT = m_pGOT; 9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines } else { 98551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // Otherwise, got should be seperated to two sections, .got and .got.plt 99551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // initialize .got.plt 100551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines LDSection& gotplt = file_format->getGOTPLT(); 101551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOTPLT = new AArch64GOT(gotplt); 102551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOTPLT->createGOT0(); 103551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 104551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 105551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // initialize .plt 106551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines LDSection& plt = file_format->getPLT(); 107551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pPLT = new AArch64PLT(plt, *m_pGOTPLT); 108551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 109551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // initialize .rela.plt 110551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines LDSection& relaplt = file_format->getRelaPlt(); 111551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines relaplt.setLink(&plt); 112551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pRelaPLT = new OutputRelocSection(pModule, relaplt); 113551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 114551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // initialize .rela.dyn 115551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines LDSection& reladyn = file_format->getRelaDyn(); 116551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pRelaDyn = new OutputRelocSection(pModule, reladyn); 117551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 118551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 119551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 120551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesvoid AArch64GNULDBackend::initTargetSymbols(IRBuilder& pBuilder, 12137b74a387bb3993387029859c2d9d051c41c724eStephen Hines Module& pModule) { 122551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // Define the symbol _GLOBAL_OFFSET_TABLE_ if there is a symbol with the 123551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // same name in input 124551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (LinkerConfig::Object != config().codeGenType()) { 12537b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pGOTSymbol = 12637b74a387bb3993387029859c2d9d051c41c724eStephen Hines pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 12737b74a387bb3993387029859c2d9d051c41c724eStephen Hines "_GLOBAL_OFFSET_TABLE_", 12837b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Object, 12937b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Define, 13037b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Local, 13137b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x0, // size 13237b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x0, // value 13337b74a387bb3993387029859c2d9d051c41c724eStephen Hines FragmentRef::Null(), 13437b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Hidden); 135551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 136551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 137551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 13837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool AArch64GNULDBackend::initRelocator() { 13937b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (m_pRelocator == NULL) { 140551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pRelocator = new AArch64Relocator(*this, config()); 141551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 142551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return true; 143551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 144551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 14537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst Relocator* AArch64GNULDBackend::getRelocator() const { 14637b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pRelocator != NULL); 1470dea6bc96bb52346737966839ac68644f7939f58Stephen Hines return m_pRelocator; 1480dea6bc96bb52346737966839ac68644f7939f58Stephen Hines} 1490dea6bc96bb52346737966839ac68644f7939f58Stephen Hines 15037b74a387bb3993387029859c2d9d051c41c724eStephen HinesRelocator* AArch64GNULDBackend::getRelocator() { 15137b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pRelocator != NULL); 152551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return m_pRelocator; 153551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 154551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 15537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid AArch64GNULDBackend::defineGOTSymbol(IRBuilder& pBuilder) { 156551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // define symbol _GLOBAL_OFFSET_TABLE_ when .got create 157551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pGOTSymbol != NULL) { 158551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines pBuilder.AddSymbol<IRBuilder::Force, IRBuilder::Unresolve>( 15937b74a387bb3993387029859c2d9d051c41c724eStephen Hines "_GLOBAL_OFFSET_TABLE_", 16037b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Object, 16137b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Define, 16237b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Local, 16337b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x0, // size 16437b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x0, // value 16537b74a387bb3993387029859c2d9d051c41c724eStephen Hines FragmentRef::Create(*(m_pGOTPLT->begin()), 0x0), 16637b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Hidden); 16737b74a387bb3993387029859c2d9d051c41c724eStephen Hines } else { 168551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOTSymbol = pBuilder.AddSymbol<IRBuilder::Force, IRBuilder::Resolve>( 16937b74a387bb3993387029859c2d9d051c41c724eStephen Hines "_GLOBAL_OFFSET_TABLE_", 17037b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Object, 17137b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Define, 17237b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Local, 17337b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x0, // size 17437b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x0, // value 17537b74a387bb3993387029859c2d9d051c41c724eStephen Hines FragmentRef::Create(*(m_pGOTPLT->begin()), 0x0), 17637b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Hidden); 177551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 178551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 179551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 18037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid AArch64GNULDBackend::doPreLayout(IRBuilder& pBuilder) { 181551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // initialize .dynamic data 18237b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (!config().isCodeStatic() && m_pDynamic == NULL) 183551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pDynamic = new AArch64ELFDynamic(*this, config()); 184551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 185551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (LinkerConfig::Object != config().codeGenType()) { 186551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // set .got size 187551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (config().options().hasNow()) { 188551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // when building shared object, the GOTPLT section is must 18937b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (LinkerConfig::DynObj == config().codeGenType() || m_pGOT->hasGOT1() || 19037b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pGOTSymbol != NULL) { 191551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOT->finalizeSectionSize(); 192551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines defineGOTSymbol(pBuilder); 193551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 19437b74a387bb3993387029859c2d9d051c41c724eStephen Hines } else { 195551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // when building shared object, the GOTPLT section is must 196551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (LinkerConfig::DynObj == config().codeGenType() || 19737b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pGOTPLT->hasGOT1() || m_pGOTSymbol != NULL) { 198551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOTPLT->finalizeSectionSize(); 199551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines defineGOTSymbol(pBuilder); 200551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 201551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pGOT->hasGOT1()) 202551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOT->finalizeSectionSize(); 203551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 204551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 205551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // set .plt size 206551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pPLT->hasPLT1()) 207551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pPLT->finalizeSectionSize(); 208551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 209551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ELFFileFormat* file_format = getOutputFormat(); 210551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // set .rela.dyn size 211551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (!m_pRelaDyn->empty()) { 21237b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert( 21337b74a387bb3993387029859c2d9d051c41c724eStephen Hines !config().isCodeStatic() && 21437b74a387bb3993387029859c2d9d051c41c724eStephen Hines "static linkage should not result in a dynamic relocation section"); 21537b74a387bb3993387029859c2d9d051c41c724eStephen Hines file_format->getRelaDyn().setSize(m_pRelaDyn->numOfRelocs() * 21637b74a387bb3993387029859c2d9d051c41c724eStephen Hines getRelaEntrySize()); 217551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 218551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 219551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // set .rela.plt size 220551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (!m_pRelaPLT->empty()) { 22137b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert( 22237b74a387bb3993387029859c2d9d051c41c724eStephen Hines !config().isCodeStatic() && 22337b74a387bb3993387029859c2d9d051c41c724eStephen Hines "static linkage should not result in a dynamic relocation section"); 22437b74a387bb3993387029859c2d9d051c41c724eStephen Hines file_format->getRelaPlt().setSize(m_pRelaPLT->numOfRelocs() * 22537b74a387bb3993387029859c2d9d051c41c724eStephen Hines getRelaEntrySize()); 226551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 227551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 228551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 229551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 23037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid AArch64GNULDBackend::doPostLayout(Module& pModule, IRBuilder& pBuilder) { 23137b74a387bb3993387029859c2d9d051c41c724eStephen Hines const ELFFileFormat* file_format = getOutputFormat(); 232551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 233551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // apply PLT 234551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (file_format->hasPLT()) { 23537b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pPLT != NULL); 236551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pPLT->applyPLT0(); 237551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pPLT->applyPLT1(); 238551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 239551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 240551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // apply GOTPLT 241551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if ((config().options().hasNow() && file_format->hasGOT()) || 24237b74a387bb3993387029859c2d9d051c41c724eStephen Hines file_format->hasGOTPLT()) { 24337b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pGOTPLT != NULL); 244551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (LinkerConfig::DynObj == config().codeGenType()) 245551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOTPLT->applyGOT0(file_format->getDynamic().addr()); 246551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines else { 247551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // executable file and object file? should fill with zero. 248551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOTPLT->applyGOT0(0); 249551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 250551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 251551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 252551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 25337b74a387bb3993387029859c2d9d051c41c724eStephen HinesAArch64ELFDynamic& AArch64GNULDBackend::dynamic() { 25437b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pDynamic != NULL); 255551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pDynamic; 256551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 257551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 25837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst AArch64ELFDynamic& AArch64GNULDBackend::dynamic() const { 25937b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pDynamic != NULL); 260551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pDynamic; 261551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 262551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 263551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesuint64_t AArch64GNULDBackend::emitSectionData(const LDSection& pSection, 26437b74a387bb3993387029859c2d9d051c41c724eStephen Hines MemoryRegion& pRegion) const { 265551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(pRegion.size() && "Size of MemoryRegion is zero!"); 266551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 267551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines const ELFFileFormat* file_format = getOutputFormat(); 268551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 269551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (file_format->hasPLT() && (&pSection == &(file_format->getPLT()))) { 270551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines uint64_t result = m_pPLT->emit(pRegion); 271551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return result; 272551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 273551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 274551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (file_format->hasGOT() && (&pSection == &(file_format->getGOT()))) { 275551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines uint64_t result = m_pGOT->emit(pRegion); 276551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return result; 277551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 278551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 279551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (file_format->hasGOTPLT() && (&pSection == &(file_format->getGOTPLT()))) { 280551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines uint64_t result = m_pGOT->emit(pRegion); 281551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return result; 282551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 283551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 284551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // TODO 285551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return pRegion.size(); 286551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 287551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 28837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesunsigned int AArch64GNULDBackend::getTargetSectionOrder( 28937b74a387bb3993387029859c2d9d051c41c724eStephen Hines const LDSection& pSectHdr) const { 290551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines const ELFFileFormat* file_format = getOutputFormat(); 291551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 292551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (file_format->hasGOT() && (&pSectHdr == &file_format->getGOT())) { 293551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (config().options().hasNow()) 294551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return SHO_RELRO; 295551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return SHO_RELRO_LAST; 296551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 297551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 298551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (file_format->hasGOTPLT() && (&pSectHdr == &file_format->getGOTPLT())) 299551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return SHO_NON_RELRO_FIRST; 300551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 301551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (file_format->hasPLT() && (&pSectHdr == &file_format->getPLT())) 302551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return SHO_PLT; 303551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 304551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return SHO_UNDEFINED; 305551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 306551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 307551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesbool AArch64GNULDBackend::doRelax(Module& pModule, 308551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines IRBuilder& pBuilder, 30937b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool& pFinished) { 310551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // TODO 311551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return false; 312551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 313551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 31437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool AArch64GNULDBackend::initTargetStubs() { 315551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // TODO 316551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return true; 317551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 318551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 31937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid AArch64GNULDBackend::doCreateProgramHdrs(Module& pModule) { 320551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // TODO 321551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 322551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 32337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool AArch64GNULDBackend::finalizeTargetSymbols() { 324551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // TODO 325551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return true; 326551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 327551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 328551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesbool AArch64GNULDBackend::mergeSection(Module& pModule, 329551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines const Input& pInput, 33037b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSection& pSection) { 331551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // TODO 332551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return true; 333551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 334551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 33537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool AArch64GNULDBackend::readSection(Input& pInput, SectionData& pSD) { 336551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // TODO 337551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return true; 338551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 339551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 34037b74a387bb3993387029859c2d9d051c41c724eStephen HinesAArch64GOT& AArch64GNULDBackend::getGOT() { 34137b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pGOT != NULL && "GOT section not exist"); 342551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pGOT; 343551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 344551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 34537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst AArch64GOT& AArch64GNULDBackend::getGOT() const { 34637b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pGOT != NULL && "GOT section not exist"); 347551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pGOT; 348551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 349551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 35037b74a387bb3993387029859c2d9d051c41c724eStephen HinesAArch64GOT& AArch64GNULDBackend::getGOTPLT() { 35137b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pGOTPLT != NULL && "GOTPLT section not exist"); 352551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pGOTPLT; 353551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 354551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 35537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst AArch64GOT& AArch64GNULDBackend::getGOTPLT() const { 35637b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pGOTPLT != NULL && "GOTPLT section not exist"); 357551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pGOTPLT; 358551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 359551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 36037b74a387bb3993387029859c2d9d051c41c724eStephen HinesAArch64PLT& AArch64GNULDBackend::getPLT() { 36137b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pPLT != NULL && "PLT section not exist"); 362551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pPLT; 363551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 364551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 36537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst AArch64PLT& AArch64GNULDBackend::getPLT() const { 36637b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pPLT != NULL && "PLT section not exist"); 367551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pPLT; 368551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 369551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 37037b74a387bb3993387029859c2d9d051c41c724eStephen HinesOutputRelocSection& AArch64GNULDBackend::getRelaDyn() { 37137b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pRelaDyn != NULL && ".rela.dyn section not exist"); 372551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pRelaDyn; 373551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 374551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 37537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst OutputRelocSection& AArch64GNULDBackend::getRelaDyn() const { 37637b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pRelaDyn != NULL && ".rela.dyn section not exist"); 377551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pRelaDyn; 378551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 379551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 38037b74a387bb3993387029859c2d9d051c41c724eStephen HinesOutputRelocSection& AArch64GNULDBackend::getRelaPLT() { 38137b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pRelaPLT != NULL && ".rela.plt section not exist"); 382551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pRelaPLT; 383551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 384551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 38537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst OutputRelocSection& AArch64GNULDBackend::getRelaPLT() const { 38637b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pRelaPLT != NULL && ".rela.plt section not exist"); 387551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pRelaPLT; 388551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 389551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 390551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 391551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// createAArch64LDBackend - the help funtion to create corresponding 392551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// AArch64LDBackend 393551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 39437b74a387bb3993387029859c2d9d051c41c724eStephen HinesTargetLDBackend* createAArch64LDBackend(const LinkerConfig& pConfig) { 395551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (pConfig.targets().triple().isOSDarwin()) { 396551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(0 && "MachO linker is not supported yet"); 397551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines /** 398551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return new AArch64MachOLDBackend(createAArch64MachOArchiveReader, 399551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines createAArch64MachOObjectReader, 400551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines createAArch64MachOObjectWriter); 401551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines **/ 402551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 403551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (pConfig.targets().triple().isOSWindows()) { 404551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(0 && "COFF linker is not supported yet"); 405551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines /** 406551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return new AArch64COFFLDBackend(createAArch64COFFArchiveReader, 407551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines createAArch64COFFObjectReader, 408551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines createAArch64COFFObjectWriter); 409551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines **/ 410551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 41137b74a387bb3993387029859c2d9d051c41c724eStephen Hines return new AArch64GNULDBackend( 41237b74a387bb3993387029859c2d9d051c41c724eStephen Hines pConfig, new AArch64GNUInfo(pConfig.targets().triple())); 413551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 414551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 41537b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 416551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 417551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 418551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// Force static initialization. 419551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 420551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesextern "C" void MCLDInitializeAArch64LDBackend() { 421551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // Register the linker backend 42237b74a387bb3993387029859c2d9d051c41c724eStephen Hines mcld::TargetRegistry::RegisterTargetLDBackend(mcld::TheAArch64Target, 42337b74a387bb3993387029859c2d9d051c41c724eStephen Hines mcld::createAArch64LDBackend); 424551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 425