1cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===- X86PLT.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//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef TARGET_X86_X86PLT_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define TARGET_X86_X86PLT_H_ 11cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/PLT.h" 13d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesconst uint8_t x86_32_dyn_plt0[] = { 1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xff, 0xb3, 0x04, 0, 0, 0, // pushl 0x4(%ebx) 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xff, 0xa3, 0x08, 0, 0, 0, // jmp *0x8(%ebx) 1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x0f, 0x1f, 0x4, 0 // nopl 0(%eax) 18d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 19d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesconst uint8_t x86_32_dyn_plt1[] = { 2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xff, 0xa3, 0, 0, 0, 0, // jmp *sym@GOT(%ebx) 2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x68, 0, 0, 0, 0, // pushl $offset 2337b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xe9, 0, 0, 0, 0 // jmp plt0 24d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 25d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesconst uint8_t x86_32_exec_plt0[] = { 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xff, 0x35, 0, 0, 0, 0, // pushl .got + 4 2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xff, 0x25, 0, 0, 0, 0, // jmp *(.got + 8) 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x0f, 0x1f, 0x4, 0 // nopl 0(%eax) 30d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 31d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesconst uint8_t x86_32_exec_plt1[] = { 3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xff, 0x25, 0, 0, 0, 0, // jmp *(sym in .got) 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x68, 0, 0, 0, 0, // pushl $offset 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xe9, 0, 0, 0, 0 // jmp plt0 36d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 37d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesconst uint8_t x86_64_plt0[] = { 3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xff, 0x35, 0x8, 0, 0, 0, // pushq GOT + 8(%rip) 4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xff, 0x25, 0x16, 0, 0, 0, // jmq *GOT + 16(%rip) 4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x0f, 0x1f, 0x40, 0 // nopl 0(%rax) 426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}; 436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesconst uint8_t x86_64_plt1[] = { 4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xff, 0x25, 0, 0, 0, 0, // jmpq *sym@GOTPCREL(%rip) 4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x68, 0, 0, 0, 0, // pushq $index 4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xe9, 0, 0, 0, 0 // jmpq plt0 486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}; 496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld { 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass X86_32GOTPLT; 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass GOTEntry; 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LinkerConfig; 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 56d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===----------------------------------------------------------------------===// 576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// X86_32PLT Entry 58d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===----------------------------------------------------------------------===// 5937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass X86_32DynPLT0 : public PLT::Entry<sizeof(x86_32_dyn_plt0)> { 6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_32DynPLT0(SectionData& pParent); 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass X86_32DynPLT1 : public PLT::Entry<sizeof(x86_32_dyn_plt1)> { 6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_32DynPLT1(SectionData& pParent); 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 6937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass X86_32ExecPLT0 : public PLT::Entry<sizeof(x86_32_exec_plt0)> { 7037b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_32ExecPLT0(SectionData& pParent); 72d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 73d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 7437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass X86_32ExecPLT1 : public PLT::Entry<sizeof(x86_32_exec_plt1)> { 7537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_32ExecPLT1(SectionData& pParent); 776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}; 786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// X86_64PLT Entry 816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 8237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass X86_64PLT0 : public PLT::Entry<sizeof(x86_64_plt0)> { 8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_64PLT0(SectionData& pParent); 856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}; 866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 8737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass X86_64PLT1 : public PLT::Entry<sizeof(x86_64_plt1)> { 8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_64PLT1(SectionData& pParent); 90d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 91d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 92d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===----------------------------------------------------------------------===// 93d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao// X86PLT 94d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===----------------------------------------------------------------------===// 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class X86PLT 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief X86 Procedure Linkage Table 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 9837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass X86PLT : public PLT { 9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines X86PLT(LDSection& pSection, const LinkerConfig& pConfig, int got_size); 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ~X86PLT(); 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // finalizeSectionSize - set LDSection size 10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void finalizeSectionSize(); 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // hasPLT1 - return if this PLT has any PLT1 entry 10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool hasPLT1() const; 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines PLTEntryBase* create(); 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual void applyPLT0() = 0; 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual void applyPLT1() = 0; 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao unsigned int getPLT0Size() const { return m_PLT0Size; } 11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao unsigned int getPLT1Size() const { return m_PLT1Size; } 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 11837b74a387bb3993387029859c2d9d051c41c724eStephen Hines protected: 119d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao PLTEntryBase* getPLT0() const; 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12137b74a387bb3993387029859c2d9d051c41c724eStephen Hines protected: 12237b74a387bb3993387029859c2d9d051c41c724eStephen Hines const uint8_t* m_PLT0; 12337b74a387bb3993387029859c2d9d051c41c724eStephen Hines const uint8_t* m_PLT1; 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int m_PLT0Size; 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int m_PLT1Size; 126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const LinkerConfig& m_Config; 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 1316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// X86_32PLT 1326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 1336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/** \class X86_32PLT 1346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * \brief X86_32 Procedure Linkage Table 1356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines */ 13637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass X86_32PLT : public X86PLT { 13737b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 1386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_32PLT(LDSection& pSection, 139551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines X86_32GOTPLT& pGOTPLT, 140551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines const LinkerConfig& pConfig); 1416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void applyPLT0(); 1436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void applyPLT1(); 1456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 14637b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 1476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_32GOTPLT& m_GOTPLT; 1486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}; 1496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 1516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// X86_64PLT 1526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 1536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/** \class X86_64PLT 1546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * \brief X86_64 Procedure Linkage Table 1556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines */ 15637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass X86_64PLT : public X86PLT { 15737b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 1586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_64PLT(LDSection& pSection, 159551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines X86_64GOTPLT& pGOTPLT, 160551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines const LinkerConfig& pConfig); 1616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void applyPLT0(); 1636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void applyPLT1(); 1656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 16637b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 1676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_64GOTPLT& m_GOTPLT; 1686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}; 1696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 17037b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 171d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 17237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // TARGET_X86_X86PLT_H_ 173