15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- MipsELFDynamic.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 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/ELFFileFormat.h> 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Target/GNULDBackend.h> 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "MipsELFDynamic.h" 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "MipsLDBackend.h" 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld; 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// MIPS mandatory dynamic section entries 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoenum { 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MIPS_RLD_VERSION = 0x70000001, 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MIPS_FLAGS = 0x70000005, 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MIPS_BASE_ADDRESS = 0x70000006, 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MIPS_LOCAL_GOTNO = 0x7000000a, 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MIPS_SYMTABNO = 0x70000011, 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MIPS_GOTSYM = 0x70000013, 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMipsELFDynamic::MipsELFDynamic(const MipsGNULDBackend& pParent) 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao : ELFDynamic(pParent), 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pParent(pParent) 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMipsELFDynamic::~MipsELFDynamic() 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid MipsELFDynamic::reserveTargetEntries(const ELFFileFormat& pFormat) 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // reservePLTGOT 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pFormat.hasGOT()) 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao reserveOne(llvm::ELF::DT_PLTGOT); 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao reserveOne(MIPS_RLD_VERSION); 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao reserveOne(MIPS_FLAGS); 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao reserveOne(MIPS_BASE_ADDRESS); 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao reserveOne(MIPS_LOCAL_GOTNO); 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao reserveOne(MIPS_SYMTABNO); 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao reserveOne(MIPS_GOTSYM); 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid MipsELFDynamic::applyTargetEntries(const ELFFileFormat& pFormat) 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // applyPLTGOT 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pFormat.hasGOT()) 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao applyOne(llvm::ELF::DT_PLTGOT, pFormat.getGOT().addr()); 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao applyOne(MIPS_RLD_VERSION, 1); 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao applyOne(MIPS_FLAGS, 0); 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao applyOne(MIPS_BASE_ADDRESS, 0); 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao applyOne(MIPS_LOCAL_GOTNO, getLocalGotNum(pFormat)); 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao applyOne(MIPS_SYMTABNO, getSymTabNum(pFormat)); 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao applyOne(MIPS_GOTSYM, getGotSym(pFormat)); 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaosize_t MipsELFDynamic::getSymTabNum(const ELFFileFormat& pFormat) const 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (!pFormat.hasDynSymTab()) 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return 0; 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const LDSection& dynsym = pFormat.getDynSymTab(); 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return dynsym.size() / symbolSize(); 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaosize_t MipsELFDynamic::getGotSym(const ELFFileFormat& pFormat) const 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (!pFormat.hasGOT()) 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return 0; 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return getSymTabNum(pFormat) - 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pParent.getGOT().getTotalNum() + 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pParent.getGOT().getLocalNum(); 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaosize_t MipsELFDynamic::getLocalGotNum(const ELFFileFormat& pFormat) const 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (!pFormat.hasGOT()) 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return 0; 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pParent.getGOT().getLocalNum(); 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 91