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//===----------------------------------------------------------------------===// 9551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#ifndef TARGET_X86_X86PLT_H 10551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#define TARGET_X86_X86PLT_H 11cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Target/PLT.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 14d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaonamespace { 15d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesconst uint8_t x86_32_dyn_plt0[] = { 17d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0xff, 0xb3, 0x04, 0, 0, 0, // pushl 0x4(%ebx) 18d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0xff, 0xa3, 0x08, 0, 0, 0, // jmp *0x8(%ebx) 19d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0x0f, 0x1f, 0x4, 0 // nopl 0(%eax) 20d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 21d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesconst uint8_t x86_32_dyn_plt1[] = { 23d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0xff, 0xa3, 0, 0, 0, 0, // jmp *sym@GOT(%ebx) 24d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0x68, 0, 0, 0, 0, // pushl $offset 25d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0xe9, 0, 0, 0, 0 // jmp plt0 26d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 27d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesconst uint8_t x86_32_exec_plt0[] = { 29d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0xff, 0x35, 0, 0, 0, 0, // pushl .got + 4 30d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0xff, 0x25, 0, 0, 0, 0, // jmp *(.got + 8) 31d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0x0f, 0x1f, 0x4, 0 // nopl 0(%eax) 32d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 33d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesconst uint8_t x86_32_exec_plt1[] = { 35d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0xff, 0x25, 0, 0, 0, 0, // jmp *(sym in .got) 36d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0x68, 0, 0, 0, 0, // pushl $offset 37d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0xe9, 0, 0, 0, 0 // jmp plt0 38d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 39d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesconst uint8_t x86_64_plt0[] = { 416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 0xff, 0x35, 0x8, 0, 0, 0, // pushq GOT + 8(%rip) 426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 0xff, 0x25, 0x16, 0, 0, 0, // jmq *GOT + 16(%rip) 436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 0x0f, 0x1f, 0x40, 0 // nopl 0(%rax) 446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}; 456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesconst uint8_t x86_64_plt1[] = { 476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 0xff, 0x25, 0, 0, 0, 0, // jmpq *sym@GOTPCREL(%rip) 486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 0x68, 0, 0, 0, 0, // pushq $index 496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 0xe9, 0, 0, 0, 0 // jmpq plt0 506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}; 516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 52d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao} // anonymous namespace 53d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld { 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass X86_32GOTPLT; 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass GOTEntry; 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LinkerConfig; 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 60d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===----------------------------------------------------------------------===// 616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// X86_32PLT Entry 62d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===----------------------------------------------------------------------===// 636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass X86_32DynPLT0 : public PLT::Entry<sizeof(x86_32_dyn_plt0)> 64cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{ 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_32DynPLT0(SectionData& pParent); 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass X86_32DynPLT1 : public PLT::Entry<sizeof(x86_32_dyn_plt1)> 70cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{ 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_32DynPLT1(SectionData& pParent); 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass X86_32ExecPLT0 : public PLT::Entry<sizeof(x86_32_exec_plt0)> 76d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{ 77d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic: 786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_32ExecPLT0(SectionData& pParent); 79d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 80d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass X86_32ExecPLT1 : public PLT::Entry<sizeof(x86_32_exec_plt1)> 82d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{ 83d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic: 846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_32ExecPLT1(SectionData& pParent); 856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}; 866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// X86_64PLT Entry 896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass X86_64PLT0 : public PLT::Entry<sizeof(x86_64_plt0)> 916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic: 936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_64PLT0(SectionData& pParent); 946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}; 956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass X86_64PLT1 : public PLT::Entry<sizeof(x86_64_plt1)> 976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic: 996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_64PLT1(SectionData& pParent); 100d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 101d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 102d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===----------------------------------------------------------------------===// 103d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao// X86PLT 104d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===----------------------------------------------------------------------===// 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class X86PLT 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief X86 Procedure Linkage Table 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass X86PLT : public PLT 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao X86PLT(LDSection& pSection, 1126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const LinkerConfig& pConfig, 113551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines int got_size); 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ~X86PLT(); 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // finalizeSectionSize - set LDSection size 11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void finalizeSectionSize(); 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // hasPLT1 - return if this PLT has any PLT1 entry 12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool hasPLT1() const; 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines PLTEntryBase* create(); 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual void applyPLT0() = 0; 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual void applyPLT1() = 0; 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao unsigned int getPLT0Size() const { return m_PLT0Size; } 12922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao unsigned int getPLT1Size() const { return m_PLT1Size; } 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprotected: 132d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao PLTEntryBase* getPLT0() const; 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprotected: 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const uint8_t *m_PLT0; 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const uint8_t *m_PLT1; 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int m_PLT0Size; 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int m_PLT1Size; 139affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 14022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const LinkerConfig& m_Config; 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 1446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// X86_32PLT 1456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 1466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/** \class X86_32PLT 1476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * \brief X86_32 Procedure Linkage Table 1486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines */ 1496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass X86_32PLT : public X86PLT 1506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 1516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic: 1526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_32PLT(LDSection& pSection, 153551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines X86_32GOTPLT& pGOTPLT, 154551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines const LinkerConfig& pConfig); 1556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void applyPLT0(); 1576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void applyPLT1(); 1596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate: 1616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_32GOTPLT& m_GOTPLT; 1626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}; 1636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 1656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// X86_64PLT 1666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 1676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/** \class X86_64PLT 1686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * \brief X86_64 Procedure Linkage Table 1696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines */ 1706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass X86_64PLT : public X86PLT 1716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 1726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic: 1736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_64PLT(LDSection& pSection, 174551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines X86_64GOTPLT& pGOTPLT, 175551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines const LinkerConfig& pConfig); 1766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void applyPLT0(); 1786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void applyPLT1(); 1806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate: 1826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_64GOTPLT& m_GOTPLT; 1836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}; 1846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 188d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 189