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