Home | History | Annotate | Download | only in Mips
      1 //===- MipsELFDynamic.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 "MipsELFDynamic.h"
     10 
     11 #include "MipsLDBackend.h"
     12 #include <mcld/LD/ELFFileFormat.h>
     13 #include <mcld/Target/GNULDBackend.h>
     14 
     15 using namespace mcld;
     16 
     17 // MIPS mandatory dynamic section entries
     18 enum {
     19   MIPS_RLD_VERSION  = 0x70000001,
     20   MIPS_FLAGS        = 0x70000005,
     21   MIPS_BASE_ADDRESS = 0x70000006,
     22   MIPS_LOCAL_GOTNO  = 0x7000000a,
     23   MIPS_SYMTABNO     = 0x70000011,
     24   MIPS_GOTSYM       = 0x70000013
     25 };
     26 
     27 MipsELFDynamic::MipsELFDynamic(const MipsGNULDBackend& pParent,
     28                                const LinkerConfig& pConfig)
     29   : ELFDynamic(pParent, pConfig),
     30     m_pParent(pParent)
     31 {
     32 }
     33 
     34 MipsELFDynamic::~MipsELFDynamic()
     35 {
     36 }
     37 
     38 void MipsELFDynamic::reserveTargetEntries(const ELFFileFormat& pFormat)
     39 {
     40   // reservePLTGOT
     41   if (pFormat.hasGOT())
     42     reserveOne(llvm::ELF::DT_PLTGOT);
     43 
     44   reserveOne(MIPS_RLD_VERSION);
     45   reserveOne(MIPS_FLAGS);
     46   reserveOne(MIPS_BASE_ADDRESS);
     47   reserveOne(MIPS_LOCAL_GOTNO);
     48   reserveOne(MIPS_SYMTABNO);
     49   reserveOne(MIPS_GOTSYM);
     50 }
     51 
     52 void MipsELFDynamic::applyTargetEntries(const ELFFileFormat& pFormat)
     53 {
     54   // applyPLTGOT
     55   if (pFormat.hasGOT())
     56     applyOne(llvm::ELF::DT_PLTGOT, pFormat.getGOT().addr());
     57 
     58   applyOne(MIPS_RLD_VERSION, 1);
     59   applyOne(MIPS_FLAGS, 0);
     60   applyOne(MIPS_BASE_ADDRESS, 0);
     61   applyOne(MIPS_LOCAL_GOTNO, getLocalGotNum(pFormat));
     62   applyOne(MIPS_SYMTABNO, getSymTabNum(pFormat));
     63   applyOne(MIPS_GOTSYM, getGotSym(pFormat));
     64 }
     65 
     66 size_t MipsELFDynamic::getSymTabNum(const ELFFileFormat& pFormat) const
     67 {
     68   if (!pFormat.hasDynSymTab())
     69     return 0;
     70 
     71   const LDSection& dynsym = pFormat.getDynSymTab();
     72   return dynsym.size() / symbolSize();
     73 }
     74 
     75 size_t MipsELFDynamic::getGotSym(const ELFFileFormat& pFormat) const
     76 {
     77   if (!pFormat.hasGOT())
     78     return 0;
     79 
     80   return getSymTabNum(pFormat) -
     81          m_pParent.getGOT().getTotalNum() +
     82          m_pParent.getGOT().getLocalNum();
     83 }
     84 
     85 size_t MipsELFDynamic::getLocalGotNum(const ELFFileFormat& pFormat) const
     86 {
     87   if (!pFormat.hasGOT())
     88     return 0;
     89 
     90   return m_pParent.getGOT().getLocalNum();
     91 }
     92