15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- X86GOTPLT.cpp ------------------------------------------------------===// 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//===----------------------------------------------------------------------===// 95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "X86GOTPLT.h" 1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include "X86PLT.h" 11cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSection.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDFileFormat.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MsgHandling.h" 15cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <llvm/Support/Casting.h> 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld { 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// X86_32GOTPLT 22cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===// 2337b74a387bb3993387029859c2d9d051c41c724eStephen HinesX86_32GOTPLT::X86_32GOTPLT(LDSection& pSection) : X86_32GOT(pSection) { 24f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // create GOT0 entries 25f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines for (size_t i = 0; i < X86GOTPLT0Num; ++i) 26f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines create(); 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2937b74a387bb3993387029859c2d9d051c41c724eStephen HinesX86_32GOTPLT::~X86_32GOTPLT() { 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool X86_32GOTPLT::hasGOT1() const { 336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return (m_SectionData->size() > X86GOTPLT0Num); 346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 3637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid X86_32GOTPLT::applyGOT0(uint64_t pAddress) { 3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::cast<X86_32GOTEntry>(*(m_SectionData->getFragmentList().begin())) 3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines .setValue(pAddress); 396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 4137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid X86_32GOTPLT::applyAllGOTPLT(const X86PLT& pPLT) { 426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines iterator it = begin(); 436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // skip GOT0 446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines for (size_t i = 0; i < X86GOTPLT0Num; ++i) 456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines ++it; 466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // address of corresponding plt entry 476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines uint64_t plt_addr = pPLT.addr() + pPLT.getPLT0Size(); 4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines for (; it != end(); ++it) { 496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines llvm::cast<X86_32GOTEntry>(*it).setValue(plt_addr + 6); 506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines plt_addr += pPLT.getPLT1Size(); 51d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao } 52d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao} 53d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// X86_64GOTPLT 566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 5737b74a387bb3993387029859c2d9d051c41c724eStephen HinesX86_64GOTPLT::X86_64GOTPLT(LDSection& pSection) : X86_64GOT(pSection) { 58f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines for (size_t i = 0; i < X86GOTPLT0Num; ++i) 59f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines create(); 606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 61d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 6237b74a387bb3993387029859c2d9d051c41c724eStephen HinesX86_64GOTPLT::~X86_64GOTPLT() { 63d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao} 64d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 6537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool X86_64GOTPLT::hasGOT1() const { 6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return (m_SectionData->size() > X86GOTPLT0Num); 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 6937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid X86_64GOTPLT::applyGOT0(uint64_t pAddress) { 7037b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::cast<X86_64GOTEntry>(*(m_SectionData->getFragmentList().begin())) 7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines .setValue(pAddress); 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 7437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid X86_64GOTPLT::applyAllGOTPLT(const X86PLT& pPLT) { 75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang iterator it = begin(); 76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // skip GOT0 77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang for (size_t i = 0; i < X86GOTPLT0Num; ++i) 78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ++it; 79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // address of corresponding plt entry 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint64_t plt_addr = pPLT.addr() + pPLT.getPLT0Size(); 8137b74a387bb3993387029859c2d9d051c41c724eStephen Hines for (; it != end(); ++it) { 826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines llvm::cast<X86_64GOTEntry>(*it).setValue(plt_addr + 6); 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao plt_addr += pPLT.getPLT1Size(); 84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 88