X86GOTPLT.cpp revision 37b74a387bb3993387029859c2d9d051c41c724e
1//===- X86GOTPLT.cpp ------------------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#include "X86GOTPLT.h"
10#include "X86PLT.h"
11
12#include "mcld/LD/LDSection.h"
13#include "mcld/LD/LDFileFormat.h"
14#include "mcld/Support/MsgHandling.h"
15
16#include <llvm/Support/Casting.h>
17
18namespace mcld {
19
20//===----------------------------------------------------------------------===//
21// X86_32GOTPLT
22//===----------------------------------------------------------------------===//
23X86_32GOTPLT::X86_32GOTPLT(LDSection& pSection) : X86_32GOT(pSection) {
24  // create GOT0 entries
25  for (size_t i = 0; i < X86GOTPLT0Num; ++i)
26    create();
27}
28
29X86_32GOTPLT::~X86_32GOTPLT() {
30}
31
32bool X86_32GOTPLT::hasGOT1() const {
33  return (m_SectionData->size() > X86GOTPLT0Num);
34}
35
36void X86_32GOTPLT::applyGOT0(uint64_t pAddress) {
37  llvm::cast<X86_32GOTEntry>(*(m_SectionData->getFragmentList().begin()))
38      .setValue(pAddress);
39}
40
41void X86_32GOTPLT::applyAllGOTPLT(const X86PLT& pPLT) {
42  iterator it = begin();
43  // skip GOT0
44  for (size_t i = 0; i < X86GOTPLT0Num; ++i)
45    ++it;
46  // address of corresponding plt entry
47  uint64_t plt_addr = pPLT.addr() + pPLT.getPLT0Size();
48  for (; it != end(); ++it) {
49    llvm::cast<X86_32GOTEntry>(*it).setValue(plt_addr + 6);
50    plt_addr += pPLT.getPLT1Size();
51  }
52}
53
54//===----------------------------------------------------------------------===//
55// X86_64GOTPLT
56//===----------------------------------------------------------------------===//
57X86_64GOTPLT::X86_64GOTPLT(LDSection& pSection) : X86_64GOT(pSection) {
58  for (size_t i = 0; i < X86GOTPLT0Num; ++i)
59    create();
60}
61
62X86_64GOTPLT::~X86_64GOTPLT() {
63}
64
65bool X86_64GOTPLT::hasGOT1() const {
66  return (m_SectionData->size() > X86GOTPLT0Num);
67}
68
69void X86_64GOTPLT::applyGOT0(uint64_t pAddress) {
70  llvm::cast<X86_64GOTEntry>(*(m_SectionData->getFragmentList().begin()))
71      .setValue(pAddress);
72}
73
74void X86_64GOTPLT::applyAllGOTPLT(const X86PLT& pPLT) {
75  iterator it = begin();
76  // skip GOT0
77  for (size_t i = 0; i < X86GOTPLT0Num; ++i)
78    ++it;
79  // address of corresponding plt entry
80  uint64_t plt_addr = pPLT.addr() + pPLT.getPLT0Size();
81  for (; it != end(); ++it) {
82    llvm::cast<X86_64GOTEntry>(*it).setValue(plt_addr + 6);
83    plt_addr += pPLT.getPLT1Size();
84  }
85}
86
87}  // namespace mcld
88