1 //===- ARMPLT.h -----------------------------------------------------===// 2 // 3 // The MCLinker Project 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 #ifndef TARGET_ARM_ARMPLT_H 10 #define TARGET_ARM_ARMPLT_H 11 12 #include <mcld/Target/GOT.h> 13 #include <mcld/Target/PLT.h> 14 #include <mcld/Support/MemoryRegion.h> 15 16 namespace { 17 18 const uint32_t arm_plt0[] = { 19 0xe52de004, // str lr, [sp, #-4]! 20 0xe59fe004, // ldr lr, [pc, #4] 21 0xe08fe00e, // add lr, pc, lr 22 0xe5bef008, // ldr pc, [lr, #8]! 23 0x00000000 // &GOT[0] - . 24 }; 25 26 const uint32_t arm_plt1[] = { 27 0xe28fc600, // add ip, pc, #0xNN00000 28 0xe28cca00, // add ip, ip, #0xNN000 29 0xe5bcf000 // ldr pc, [ip, #0xNNN]! 30 }; 31 32 } // anonymous namespace 33 34 namespace mcld { 35 36 class ARMGOT; 37 38 class ARMPLT0 : public PLT::Entry<sizeof(arm_plt0)> 39 { 40 public: 41 ARMPLT0(SectionData& pParent); 42 }; 43 44 class ARMPLT1 : public PLT::Entry<sizeof(arm_plt1)> 45 { 46 public: 47 ARMPLT1(SectionData& pParent); 48 }; 49 50 /** \class ARMPLT 51 * \brief ARM Procedure Linkage Table 52 */ 53 class ARMPLT : public PLT 54 { 55 public: 56 ARMPLT(LDSection& pSection, ARMGOT& pGOTPLT); 57 ~ARMPLT(); 58 59 // finalizeSectionSize - set LDSection size 60 void finalizeSectionSize(); 61 62 // hasPLT1 - return if this plt section has any plt1 entry 63 bool hasPLT1() const; 64 65 ARMPLT1* create(); 66 67 ARMPLT0* getPLT0() const; 68 69 void applyPLT0(); 70 71 void applyPLT1(); 72 73 uint64_t emit(MemoryRegion& pRegion); 74 75 private: 76 ARMGOT& m_GOT; 77 }; 78 79 } // namespace of mcld 80 81 #endif 82 83