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