X86PLT.cpp revision 22add6ff3426df1a85089fe6a6e1597ee3b6f300
1cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===- X86PLT.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//===----------------------------------------------------------------------===// 9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include "X86GOTPLT.h" 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "X86PLT.h" 11cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/ELF.h> 13cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <llvm/Support/Casting.h> 14cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/LDSection.h> 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LinkerConfig.h> 17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MsgHandling.h> 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 19cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===// 20cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao// PLT entry data 21cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===// 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace { 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoconst uint8_t x86_dyn_plt0[] = { 25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 0xff, 0xb3, 0x04, 0, 0, 0, // pushl 0x4(%ebx) 26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 0xff, 0xa3, 0x08, 0, 0, 0, // jmp *0x8(%ebx) 27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 0x0f, 0x1f, 0x4, 0 // nopl 0(%eax) 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoconst uint8_t x86_dyn_plt1[] = { 31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 0xff, 0xa3, 0, 0, 0, 0, // jmp *sym@GOT(%ebx) 32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 0x68, 0, 0, 0, 0, // pushl $offset 33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 0xe9, 0, 0, 0, 0 // jmp plt0 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoconst uint8_t x86_exec_plt0[] = { 37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 0xff, 0x35, 0, 0, 0, 0, // pushl .got + 4 38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 0xff, 0x25, 0, 0, 0, 0, // jmp *(.got + 8) 39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 0x0f, 0x1f, 0x4, 0 // nopl 0(%eax) 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoconst uint8_t x86_exec_plt1[] = { 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 0xff, 0x25, 0, 0, 0, 0, // jmp *(sym in .got) 44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 0x68, 0, 0, 0, 0, // pushl $offset 45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 0xe9, 0, 0, 0, 0 // jmp plt0 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld { 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoX86PLT0::X86PLT0(SectionData& pParent, unsigned int pSize) 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao : PLT::Entry(pSize, pParent) { } 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoX86PLT1::X86PLT1(SectionData& pParent, unsigned int pSize) 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao : PLT::Entry(pSize, pParent) { } 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// X86PLT 60cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===// 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoX86PLT::X86PLT(LDSection& pSection, 62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang X86GOTPLT &pGOTPLT, 6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const LinkerConfig& pConfig) 6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao : PLT(pSection), 65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_GOTPLT(pGOTPLT), 6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Config(pConfig) 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(LinkerConfig::DynObj == m_Config.codeGenType() || 6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LinkerConfig::Exec == m_Config.codeGenType()); 7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (LinkerConfig::DynObj == m_Config.codeGenType()) { 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PLT0 = x86_dyn_plt0; 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PLT1 = x86_dyn_plt1; 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PLT0Size = sizeof (x86_dyn_plt0); 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PLT1Size = sizeof (x86_dyn_plt1); 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else { 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PLT0 = x86_exec_plt0; 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PLT1 = x86_exec_plt1; 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PLT0Size = sizeof (x86_exec_plt0); 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PLT1Size = sizeof (x86_exec_plt1); 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao new X86PLT0(*m_SectionData, m_PLT0Size); 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Last = m_SectionData->begin(); 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoX86PLT::~X86PLT() 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid X86PLT::finalizeSectionSize() 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint64_t size = 0; 9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // plt0 size 9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao size = getPLT0()->getEntrySize(); 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // get first plt1 entry 9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao X86PLT::iterator it = begin(); 10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ++it; 10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (end() != it) { 10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // plt1 size 10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao X86PLT1* plt1 = &(llvm::cast<X86PLT1>(*it)); 10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao size += (m_SectionData->size() - 1) * plt1->getEntrySize(); 10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Section.setSize(size); 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint32_t offset = 0; 10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SectionData::iterator frag, fragEnd = m_SectionData->end(); 11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao for (frag = m_SectionData->begin(); frag != fragEnd; ++frag) { 11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao frag->setOffset(offset); 11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao offset += frag->size(); 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool X86PLT::hasPLT1() const 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 11822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return (m_SectionData->size() > 1); 11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid X86PLT::reserveEntry(size_t pNum) 12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 12322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao X86PLT1* plt1_entry = 0; 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao for (size_t i = 0; i < pNum; ++i) { 12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao plt1_entry = new (std::nothrow) X86PLT1(*m_SectionData, m_PLT1Size); 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!plt1_entry) 12922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao fatal(diag::fail_allocate_memory_plt); 13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoPLT::Entry* X86PLT::consume() 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 13522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // This will skip PLT0. 13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ++m_Last; 13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(m_Last != m_SectionData->end() && 13822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao "The number of PLT Entries and ResolveInfo doesn't match"); 13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return llvm::cast<X86PLT1>(&(*m_Last)); 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoX86PLT0* X86PLT::getPLT0() const 14322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao iterator first = m_SectionData->getFragmentList().begin(); 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 14722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(first != m_SectionData->getFragmentList().end() && 14867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao "FragmentList is empty, getPLT0 failed!"); 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao X86PLT0* plt0 = &(llvm::cast<X86PLT0>(*first)); 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return plt0; 1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// FIXME: It only works on little endian machine. 15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid X86PLT::applyPLT0() 15722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 15822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao X86PLT0* plt0 = getPLT0(); 1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned char* data = 0; 1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao data = static_cast<unsigned char*>(malloc(plt0->getEntrySize())); 1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (!data) 164cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao fatal(diag::fail_allocate_memory_plt); 1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao memcpy(data, m_PLT0, plt0->getEntrySize()); 1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (m_PLT0 == x86_exec_plt0) { 1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t *offset = reinterpret_cast<uint32_t*>(data + 2); 17022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *offset = m_GOTPLT.addr() + 4; 1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao offset = reinterpret_cast<uint32_t*>(data + 8); 17222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *offset = m_GOTPLT.addr() + 8; 1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao plt0->setContent(data); 1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// FIXME: It only works on little endian machine. 17922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid X86PLT::applyPLT1() 18022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 18122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(m_Section.addr() && ".plt base address is NULL!"); 1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao X86PLT::iterator it = m_SectionData->begin(); 18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao X86PLT::iterator ie = m_SectionData->end(); 18567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao assert(it != ie && "FragmentList is empty, applyPLT1 failed!"); 1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 187affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t GOTEntrySize = m_GOTPLT.getEntrySize(); 1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // Skip GOT0 190affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t GOTEntryOffset = GOTEntrySize * X86GOTPLT0Num; 19122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (LinkerConfig::Exec == m_Config.codeGenType()) 19222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao GOTEntryOffset += m_GOTPLT.addr(); 1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao //skip PLT0 1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t PLTEntryOffset = m_PLT0Size; 1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ++it; 1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao X86PLT1* plt1 = 0; 1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t PLTRelOffset = 0; 2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao while (it != ie) { 2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao plt1 = &(llvm::cast<X86PLT1>(*it)); 2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned char *data; 2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao data = static_cast<unsigned char*>(malloc(plt1->getEntrySize())); 2065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (!data) 208cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao fatal(diag::fail_allocate_memory_plt); 2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao memcpy(data, m_PLT1, plt1->getEntrySize()); 2115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t* offset; 2135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao offset = reinterpret_cast<uint32_t*>(data + 2); 21522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *offset = GOTEntryOffset; 2165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao GOTEntryOffset += GOTEntrySize; 2175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao offset = reinterpret_cast<uint32_t*>(data + 7); 2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *offset = PLTRelOffset; 2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao PLTRelOffset += sizeof (llvm::ELF::Elf32_Rel); 2215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao offset = reinterpret_cast<uint32_t*>(data + 12); 2235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *offset = -(PLTEntryOffset + 12 + 4); 2245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao PLTEntryOffset += m_PLT1Size; 2255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao plt1->setContent(data); 2275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ++it; 2285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 2295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // end namespace mcld 232affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 233