ELFDynamic.h revision 22add6ff3426df1a85089fe6a6e1597ee3b6f300
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- ELFDynamic.h -------------------------------------------------------===// 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#ifndef MCLD_ELF_DYNAMIC_SECTION_H 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_ELF_DYNAMIC_SECTION_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/ELF.h> 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDSection.h> 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <vector> 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <cstring> 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass GNULDBackend; 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ELFFileFormat; 2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LinkerConfig; 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MemoryRegion; 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace elf_dynamic { 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class EntryIF 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao* \brief EntryIF provides a common interface for one entry in the dynamic 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao* section 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao*/ 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass EntryIF 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprotected: 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao EntryIF(); 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual ~EntryIF(); 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual EntryIF* clone() const = 0; 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual size_t size() const = 0; 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual size_t symbolSize() const = 0; 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual size_t relSize() const = 0; 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual size_t relaSize() const = 0; 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual size_t emit(uint8_t* pAddress) const = 0; 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual void setValue(uint64_t pTag, uint64_t pValue) = 0; 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<size_t BITNUMBER, bool LITTLEENDIAN> 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Entry 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ }; 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<> 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Entry<32, true> : public EntryIF 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef llvm::ELF::Elf32_Dyn Pair; 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef llvm::ELF::Elf32_Sym Symbol; 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef llvm::ELF::Elf32_Rel Rel; 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef llvm::ELF::Elf32_Rela Rela; 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao inline Entry(); 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao inline ~Entry(); 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Entry* clone() const 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return new Entry(); } 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t size() const 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return sizeof(Pair); } 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t symbolSize() const 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return sizeof(Symbol); } 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t relSize() const 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return sizeof(Rel); } 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t relaSize() const 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return sizeof(Rela); } 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao inline void setValue(uint64_t pTag, uint64_t pValue); 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao inline size_t emit(uint8_t* pAddress) const; 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Pair m_Pair; 9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}; 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "ELFDynamic.tcc" 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of elf_dynamic 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class ELFDynamic 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief ELFDynamic is the .dynamic section in ELF shared and executable 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * files. 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ELFDynamic 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef std::vector<elf_dynamic::EntryIF*> EntryListType; 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef EntryListType::iterator iterator; 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef EntryListType::const_iterator const_iterator; 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ELFDynamic(const GNULDBackend& pParent); 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual ~ELFDynamic(); 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t size() const; 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t entrySize() const; 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t numOfBytes() const; 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// reserveEntries - reserve entries 11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void reserveEntries(const LinkerConfig& pConfig, 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const ELFFileFormat& pFormat); 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// reserveNeedEntry - reserve on DT_NEED entry. 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void reserveNeedEntry(); 12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// applyEntries - apply entries 12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void applyEntries(const LinkerConfig& pConfig, 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const ELFFileFormat& pFormat); 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void applySoname(uint64_t pStrTabIdx); 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator needBegin() 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_NeedList.begin(); } 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator needEnd() 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_NeedList.end(); } 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator needBegin() const 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_NeedList.begin(); } 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator needEnd() const 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_NeedList.end(); } 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// emit 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void emit(const LDSection& pSection, MemoryRegion& pRegion) const; 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprotected: 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// reserveTargetEntries - reserve target dependent entries 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual void reserveTargetEntries(const ELFFileFormat& pFormat) = 0; 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// applyTargetEntries - apply target-dependant 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual void applyTargetEntries(const ELFFileFormat& pFormat) = 0; 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprotected: 1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void reserveOne(uint64_t pTag); 1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void applyOne(uint64_t pTag, uint64_t pValue); 1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t symbolSize() const; 1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao EntryListType m_EntryList; 1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao EntryListType m_NeedList; 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao elf_dynamic::EntryIF* m_pEntryFactory; 16422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const GNULDBackend& m_Backend; 1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // The entry reserved and the entry being applied are not must matched. 1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // For better performance, we use a simple counter and apply entry one-by-one 1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // by the counter. m_Idx is the counter indicating to the entry being applied. 1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t m_Idx; 1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 176