C++程序  |  87行  |  2 KB

//===- AArch64PLT.h -------------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef TARGET_AARCH64_AARCH64PLT_H
#define TARGET_AARCH64_AARCH64PLT_H

#include <mcld/Target/GOT.h>
#include <mcld/Target/PLT.h>
#include <mcld/Support/MemoryRegion.h>

namespace {

const uint8_t aarch64_plt0[] = {
  0xf0, 0x7b, 0xbf, 0xa9,  /* stp x16, x30, [sp, #-16]!  */
  0x10, 0x00, 0x00, 0x90,  /* adrp x16, (GOT+16)  */
  0x11, 0x0A, 0x40, 0xf9,  /* ldr x17, [x16, #PLT_GOT+0x10]  */
  0x10, 0x42, 0x00, 0x91,  /* add x16, x16,#PLT_GOT+0x10   */
  0x20, 0x02, 0x1f, 0xd6,  /* br x17  */
  0x1f, 0x20, 0x03, 0xd5,  /* nop */
  0x1f, 0x20, 0x03, 0xd5,  /* nop */
  0x1f, 0x20, 0x03, 0xd5   /* nop */
};

const uint8_t aarch64_plt1[] = {
  0x10, 0x00, 0x00, 0x90,  /* adrp x16, PLTGOT + n * 8  */
  0x11, 0x02, 0x40, 0xf9,  /* ldr x17, [x16, PLTGOT + n * 8] */
  0x10, 0x02, 0x00, 0x91,  /* add x16, x16, :lo12:PLTGOT + n * 8  */
  0x20, 0x02, 0x1f, 0xd6   /* br x17.  */
};

} // anonymous namespace

namespace mcld {

class AArch64GOT;

class AArch64PLT0 : public PLT::Entry<sizeof(aarch64_plt0)>
{
public:
  AArch64PLT0(SectionData& pParent);
};

class AArch64PLT1 : public PLT::Entry<sizeof(aarch64_plt1)>
{
public:
  AArch64PLT1(SectionData& pParent);
};

/** \class AArch64PLT
 *  \brief AArch64 Procedure Linkage Table
 */
class AArch64PLT : public PLT
{
public:
  AArch64PLT(LDSection& pSection, AArch64GOT& pGOTPLT);
  ~AArch64PLT();

  // finalizeSectionSize - set LDSection size
  void finalizeSectionSize();

  // hasPLT1 - return if this plt section has any plt1 entry
  bool hasPLT1() const;

  AArch64PLT1* create();

  AArch64PLT0* getPLT0() const;

  void applyPLT0();

  void applyPLT1();

  uint64_t emit(MemoryRegion& pRegion);

private:
  AArch64GOT& m_GOT;
};

} // namespace of mcld

#endif