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