1d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===- ARMRelocator.h ----------------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef ARM_RELOCATION_FACTORY_H 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define ARM_RELOCATION_FACTORY_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 15d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/LD/Relocator.h> 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Target/GOT.h> 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Target/SymbolEntryMap.h> 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "ARMLDBackend.h" 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 22d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao/** \class ARMRelocator 23d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao * \brief ARMRelocator creates and destroys the ARM relocations. 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 26d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass ARMRelocator : public Relocator 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 29d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao typedef SymbolEntryMap<ARMGOTEntry> SymGOTMap; 30d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao typedef SymbolEntryMap<ARMPLT1> SymPLTMap; 3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 32f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /** \enum ReservedEntryType 33f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * \brief The reserved entry type of reserved space in ResolveInfo. 34f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 35f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * This is used for sacnRelocation to record what kinds of entries are 36f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * reserved for this resolved symbol 37f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 38f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * In ARM, there are three kinds of entries, GOT, PLT, and dynamic reloction. 39f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * GOT may needs a corresponding relocation to relocate itself, so we 40f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * separate GOT to two situations: GOT and GOTRel. Besides, for the same 41f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * symbol, there might be two kinds of entries reserved for different location. 42f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * For example, reference to the same symbol, one may use GOT and the other may 43f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * use dynamic relocation. 44f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * bit: 3 2 1 0 46f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * | PLT | GOTRel | GOT | Rel | 47f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * value Name - Description 49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 0000 None - no reserved entry 51f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 0001 ReserveRel - reserve an dynamic relocation entry 52f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 0010 ReserveGOT - reserve an GOT entry 53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 0011 GOTandRel - For different relocation, we've reserved GOT and 54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * Rel for different location. 55f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 0100 GOTRel - reserve an GOT entry and the corresponding Dyncamic 56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * relocation entry which relocate this GOT entry 57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 0101 GOTRelandRel - For different relocation, we've reserved GOTRel 58f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * and relocation entry for different location. 59f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 1000 ReservePLT - reserve an PLT entry and the corresponding GOT, 60f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * Dynamic relocation entries 61f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 1001 PLTandRel - For different relocation, we've reserved PLT and 62f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * Rel for different location. 63f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines */ 64f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines enum ReservedEntryType { 65f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines None = 0, 66f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ReserveRel = 1, 67f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ReserveGOT = 2, 68f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines GOTandRel = 3, 69f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines GOTRel = 4, 70f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines GOTRelandRel = 5, 71f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ReservePLT = 8, 72f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines PLTandRel = 9 73f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines }; 74f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic: 76f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ARMRelocator(ARMGNULDBackend& pParent, const LinkerConfig& pConfig); 77d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao ~ARMRelocator(); 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Result applyRelocation(Relocation& pRelocation); 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ARMGNULDBackend& getTarget() 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Target; } 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const ARMGNULDBackend& getTarget() const 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Target; } 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao const char* getName(Relocation::Type pType) const; 8867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao 896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Size getSize(Relocation::Type pType) const; 906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const SymGOTMap& getSymGOTMap() const { return m_SymGOTMap; } 9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SymGOTMap& getSymGOTMap() { return m_SymGOTMap; } 9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const SymPLTMap& getSymPLTMap() const { return m_SymPLTMap; } 9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SymPLTMap& getSymPLTMap() { return m_SymPLTMap; } 9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const SymGOTMap& getSymGOTPLTMap() const { return m_SymGOTPLTMap; } 9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SymGOTMap& getSymGOTPLTMap() { return m_SymGOTPLTMap; } 9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 100f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// scanRelocation - determine the empty entries are needed or not and create 101f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// the empty entries if needed. 102f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// For ARM, following entries are check to create: 103f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// - GOT entry (for .got section) 104f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// - PLT entry (for .plt section) 105f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// - dynamin relocation entries (for .rel.plt and .rel.dyn sections) 106f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void scanRelocation(Relocation& pReloc, 107f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder& pBuilder, 108f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 109f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection& pSection); 110f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 111f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprivate: 112f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void scanLocalReloc(Relocation& pReloc, const LDSection& pSection); 113f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 114f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void scanGlobalReloc(Relocation& pReloc, 115f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder& pBuilder, 116f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const LDSection& pSection); 117f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 118f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void checkValidReloc(Relocation& pReloc) const; 119f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 120f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// addCopyReloc - add a copy relocation into .rel.dyn for pSym 121f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pSym - A resolved copy symbol that defined in BSS section 122f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void addCopyReloc(ResolveInfo& pSym); 123f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 124f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// defineSymbolforCopyReloc - allocate a space in BSS section and 125f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// and force define the copy of pSym to BSS section 126f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return the output LDSymbol of the copy symbol 127f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSymbol& defineSymbolforCopyReloc(IRBuilder& pLinker, 128f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const ResolveInfo& pSym); 129f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ARMGNULDBackend& m_Target; 13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SymGOTMap m_SymGOTMap; 13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SymPLTMap m_SymPLTMap; 13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SymGOTMap m_SymGOTPLTMap; 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 140affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 141