GNULDBackend.h revision affc150dc44fab1911775a49636d0ce85333b634
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- GNULDBackend.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_TARGET_GNU_LDBACKEND_H
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_TARGET_GNU_LDBACKEND_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/ADT/HashTable.h>
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/ADT/HashEntry.h>
18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/EhFrameHdr.h>
19affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/ELFDynObjFileFormat.h>
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/ELFDynObjReader.h>
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/ELFDynObjWriter.h>
22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/ELFExecFileFormat.h>
23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/ELFExecWriter.h>
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/ELFObjectReader.h>
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/ELFObjectWriter.h>
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/ELFSegment.h>
27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/ELFSegmentFactory.h>
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/GNUArchiveReader.h>
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Support/GCFactory.h>
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Target/ELFDynamic.h>
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Target/TargetLDBackend.h>
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostruct SymCompare
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool operator()(const LDSymbol* X, const LDSymbol* Y) const
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return (X==Y); }
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostruct PtrHash
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t operator()(const LDSymbol* pKey) const
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  {
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return (unsigned((uintptr_t)pKey) >> 4) ^
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           (unsigned((uintptr_t)pKey) >> 9);
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MCLDInfo;
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Layout;
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass SymbolCategory;
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class GNULDBackend
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief GNULDBackend provides a common interface for all GNU Unix-OS
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  LDBackend.
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass GNULDBackend : public TargetLDBackend
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprotected:
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  GNULDBackend();
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual ~GNULDBackend();
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // -----  readers/writers  ----- //
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool initArchiveReader(MCLinker& pLinker, MCLDInfo& pInfo);
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool initObjectReader(MCLinker& pLinker);
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool initDynObjReader(MCLinker& pLinker);
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool initObjectWriter(MCLinker& pLinker);
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool initDynObjWriter(MCLinker& pLinker);
73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool initExecWriter(MCLinker& pLinker);
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  GNUArchiveReader *getArchiveReader();
76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  const GNUArchiveReader *getArchiveReader() const;
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ELFObjectReader *getObjectReader();
79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  const ELFObjectReader *getObjectReader() const;
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ELFDynObjReader *getDynObjReader();
82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  const ELFDynObjReader *getDynObjReader() const;
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ELFObjectWriter *getObjectWriter();
85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  const ELFObjectWriter *getObjectWriter() const;
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ELFDynObjWriter *getDynObjWriter();
88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  const ELFDynObjWriter *getDynObjWriter() const;
89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ELFExecWriter *getExecWriter();
91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  const ELFExecWriter *getExecWriter() const;
92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // -----  output sections  ----- //
94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// initExecSections - initialize sections of the output executable file.
95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool initExecSections(MCLinker& pMCLinker);
96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// initDynObjSections - initialize sections of the output shared object.
98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool initDynObjSections(MCLinker& pMCLinker);
99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// getOutputFormat - get the sections of the output file.
101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ELFFileFormat* getOutputFormat(const Output& pOutput);
102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  const ELFFileFormat* getOutputFormat(const Output& pOutput) const;
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ELFDynObjFileFormat* getDynObjFileFormat();
105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  const ELFDynObjFileFormat* getDynObjFileFormat() const;
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ELFExecFileFormat* getExecFileFormat();
108affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  const ELFExecFileFormat* getExecFileFormat() const;
109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
110affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // -----  target symbols ----- //
111affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// initStandardSymbols - initialize standard symbols.
112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// Some section symbols is undefined in input object, and linkers must set
113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// up its value. Take __init_array_begin for example. This symbol is an
114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// undefined symbol in input objects. MCLinker must finalize its value
115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// to the begin of the .init_array section, then relocation enties to
116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// __init_array_begin can be applied without emission of "undefined
117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// reference to `__init_array_begin'".
118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool initStandardSymbols(MCLinker& pLinker, const Output& pOutput);
119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
120affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// finalizeSymbol - Linker checks pSymbol.reserved() if it's not zero,
121affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// then it will ask backend to finalize the symbol value.
122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// @return ture - if backend set the symbol value sucessfully
123affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// @return false - if backend do not recognize the symbol
124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool finalizeSymbols(MCLinker& pLinker, const Output& pOutput) {
125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return (finalizeStandardSymbols(pLinker, pOutput) &&
126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang            finalizeTargetSymbols(pLinker, pOutput));
127affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
128affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
129affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// finalizeStandardSymbols - set the value of standard symbols
130affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  virtual bool finalizeStandardSymbols(MCLinker& pLinker,
131affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                       const Output& pOutput);
132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
133affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// finalizeTargetSymbols - set the value of target symbols
134affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  virtual bool finalizeTargetSymbols(MCLinker& pLinker,
135affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                     const Output& pOutput) = 0;
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t sectionStartOffset() const;
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// The return value of machine() it the same as e_machine in the ELF header*/
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual uint32_t machine() const = 0;
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// ELFVersion - the value of e_ident[EI_VERSION]
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual uint8_t ELFVersion() const
1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return llvm::ELF::EV_CURRENT; }
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// OSABI - the value of e_ident[EI_OSABI]
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual uint8_t OSABI() const = 0;
1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// ABIVersion - the value of e_ident[EI_ABIVRESION]
1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual uint8_t ABIVersion() const = 0;
1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// flags - the value of ElfXX_Ehdr::e_flags
1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual uint64_t flags() const = 0;
1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// entry - the symbol name of the entry point
1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual const char* entry() const
1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return "_start"; }
1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
159affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// dyld - the name of the default dynamic linker
160affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// target may override this function if needed.
161affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// @ref gnu ld, bfd/elf32-i386.c:521
162affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  virtual const char* dyld() const
163affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return "/usr/lib/libc.so.1"; }
164affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
165affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// defaultTextSegmentAddr - target should specify its own default start address
166affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// of the text segment. esp. for exec.
167affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  virtual uint64_t defaultTextSegmentAddr() const
168affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return 0x0; }
169affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
170affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// segmentStartAddr - this function returns the start address of the segment
171affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  uint64_t segmentStartAddr(const Output& pOutput,
172affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                            const MCLDInfo& pInfo) const;
173affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// sizeNamePools - compute the size of regular name pools
1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// In ELF executable files, regular name pools are .symtab, .strtab.,
1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// .dynsym, .dynstr, and .hash
1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual void sizeNamePools(const Output& pOutput,
1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                             const SymbolCategory& pSymbols,
1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                             const MCLDInfo& pLDInfo);
1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// emitSectionData - emit target-dependent section data
1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual uint64_t emitSectionData(const Output& pOutput,
1835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   const LDSection& pSection,
1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   const MCLDInfo& pInfo,
185affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                   const Layout& pLayout,
1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   MemoryRegion& pRegion) const = 0;
1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// emitRegNamePools - emit regular name pools - .symtab, .strtab
1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual void emitRegNamePools(Output& pOutput,
1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                SymbolCategory& pSymbols,
1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                const Layout& pLayout,
1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                const MCLDInfo& pLDInfo);
1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// emitNamePools - emit dynamic name pools - .dyntab, .dynstr, .hash
1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual void emitDynNamePools(Output& pOutput,
1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                SymbolCategory& pSymbols,
1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                const Layout& pLayout,
1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                const MCLDInfo& pLDInfo);
1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
200affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// sizeInterp - compute the size of program interpreter's name
201affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// In ELF executables, this is the length of dynamic linker's path name
202affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  virtual void sizeInterp(const Output& pOutput, const MCLDInfo& pLDInfo);
203affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
204affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// emitInterp - emit the .interp
205affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  virtual void emitInterp(Output& pOutput, const MCLDInfo& pLDInfo);
206affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// getSectionOrder - compute the layout order of the section
2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// Layout calls this function to get the default order of the pSectHdr.
2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// If the pSectHdr.type() is LDFileFormat::Target, then getSectionOrder()
2105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// will call getTargetSectionOrder().
2115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// If targets favors certain order for general sections, please override
2135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// this function.
2145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
2155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @see getTargetSectionOrder
2165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual unsigned int getSectionOrder(const Output& pOutput,
217affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                       const LDSection& pSectHdr,
218affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                       const MCLDInfo& pInfo) const;
2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// getTargetSectionOrder - compute the layout order of target section
2215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// If the target favors certain order for the given gSectHdr, please
2225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// override this function.
2235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
2245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// By default, this function returns the maximun order, and pSectHdr
2255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// will be the last section to be laid out.
2265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual unsigned int
227affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  getTargetSectionOrder(const Output& pOutput,
228affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                        const LDSection& pSectHdr,
229affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                        const MCLDInfo& pInfo) const
2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return (unsigned int)-1; }
2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// numOfSegments - return the number of segments
2335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// if the target favors other ways to emit program header, please override
2345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// this function
2355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual unsigned int numOfSegments() const
2365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_ELFSegmentTable.size(); }
2375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
238affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// elfSegmentTable - return the reference of the elf segment table
239affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ELFSegmentFactory& elfSegmentTable()
240affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return m_ELFSegmentTable; }
241affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
242affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// elfSegmentTable - return the reference of the elf segment table
243affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  const ELFSegmentFactory& elfSegmentTable() const
244affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return m_ELFSegmentTable; }
245affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
246affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// commonPageSize - the common page size of the target machine, and we set it
247affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// to 4K here. If target favors the different size, please override this
248affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// function
249affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  virtual uint64_t commonPageSize(const MCLDInfo& pInfo) const;
250affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
251affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// abiPageSize - the abi page size of the target machine, and we set it to 4K
252affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// here. If target favors the different size, please override this function
253affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  virtual uint64_t abiPageSize(const MCLDInfo& pInfo) const;
2545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// getSymbolIdx - get the symbol index of ouput symbol table
2565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t getSymbolIdx(LDSymbol* pSymbol) const;
2575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
258affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// isDefaultExecStack - target should specify whether the stack is default
259affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// executable. If target favors another choice, please override this function
260affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  virtual bool isDefaultExecStack() const
261affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return true; }
262affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
263affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// allocateCommonSymbols - allocate common symbols in the corresponding
264affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// sections.
265affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// Different concrete target backend may overlap this function.
266affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  virtual bool allocateCommonSymbols(const MCLDInfo& pLDInfo, MCLinker& pLinker) const;
267affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
268affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// isSymbolPreemtible - whether the symbol can be preemted by other
269affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// link unit
270affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// @ref Google gold linker, symtab.h:551
271affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool isSymbolPreemptible(const ResolveInfo& pSym,
272affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                           const MCLDInfo& pLDInfo,
273affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                           const Output& pOutput) const;
274affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
275affc150dc44fab1911775a49636d0ce85333b634Zonr Changprotected:
276affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  uint64_t getSymbolSize(const LDSymbol& pSymbol) const;
277affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
278affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  uint64_t getSymbolInfo(const LDSymbol& pSymbol) const;
279affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
280affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  uint64_t getSymbolValue(const LDSymbol& pSymbol) const;
281affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
282affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  uint64_t getSymbolShndx(const LDSymbol& pSymbol, const Layout& pLayout) const;
283affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
284affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// getHashBucketCount - calculate hash bucket count.
285affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// @ref Google gold linker, dynobj.cc:791
286affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  static unsigned getHashBucketCount(unsigned pNumOfSymbols, bool pIsGNUStyle);
287affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
288affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// isDynamicSymbol
289affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// @ref Google gold linker: symtab.cc:311
290affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  static bool isDynamicSymbol(const LDSymbol& pSymbol, const Output& pOutput);
291affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
292affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// isOutputPIC - return whether the output is position-independent
293affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool isOutputPIC(const Output& pOutput, const MCLDInfo& pInfo) const;
294affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
295affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// isStaticLink - return whether we're doing static link
296affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool isStaticLink(const Output& pOutput, const MCLDInfo& pInfo) const;
297affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
298affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
299affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// symbolNeedsPLT - return whether the symbol needs a PLT entry
300affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// @ref Google gold linker, symtab.h:596
301affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool symbolNeedsPLT(const ResolveInfo& pSym,
302affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                      const MCLDInfo& pLDInfo,
303affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                      const Output& pOutput) const;
304affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
305affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// symbolNeedsDynRel - return whether the symbol needs a dynamic relocation
306affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// @ref Google gold linker, symtab.h:645
307affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool symbolNeedsDynRel(const ResolveInfo& pSym,
308affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                         bool pSymHasPLT,
309affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                         const MCLDInfo& pLDInfo,
310affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                         const Output& pOutput,
311affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                         bool isAbsReloc) const;
312affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
313affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// symbolNeedsCopyReloc - return whether the symbol needs a copy relocation
314affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool symbolNeedsCopyReloc(const Layout& pLayout,
315affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                            const Relocation& pReloc,
316affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                            const ResolveInfo& pSym,
317affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                            const MCLDInfo& pLDInfo,
318affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                            const Output& pOutput) const;
319affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
3205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
3215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// createProgramHdrs - base on output sections to create the program headers
322affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void createProgramHdrs(Output& pOutput,
323affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                         const MCLDInfo& pInfo);
3245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
325affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// setupProgramHdrs - set up the attributes of segments
326affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ///  (i.e., offset, addresses, file/mem size, flag,  and alignment)
327affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void setupProgramHdrs(const Output& pOutput, const MCLDInfo& pInfo);
3285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// getSegmentFlag - give a section flag and return the corresponding segment
3305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// flag
3315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  inline uint32_t getSegmentFlag(const uint32_t pSectionFlag)
3325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  {
3335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    uint32_t flag = llvm::ELF::PF_R;
3345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (0 != (pSectionFlag & llvm::ELF::SHF_WRITE))
3355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      flag |= llvm::ELF::PF_W;
3365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (0 != (pSectionFlag & llvm::ELF::SHF_EXECINSTR))
3375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      flag |= llvm::ELF::PF_X;
3385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return flag;
3395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
3405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
341affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// createGNUStackInfo - create an output GNU stack section or segment if needed
342affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void createGNUStackInfo(const Output& pOutput,
343affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                          const MCLDInfo& pInfo,
344affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                          MCLinker& pLinker);
345affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
3465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// preLayout - Backend can do any needed modification before layout
3475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void preLayout(const Output& pOutput,
3485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                 const MCLDInfo& pInfo,
3495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                 MCLinker& pLinker);
3505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// postLayout -Backend can do any needed modification after layout
3525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void postLayout(const Output& pOutput,
3535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                 const MCLDInfo& pInfo,
3545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                 MCLinker& pLinker);
3555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// preLayout - Backend can do any needed modification before layout
3575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual void doPreLayout(const Output& pOutput,
3585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         const MCLDInfo& pInfo,
3595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         MCLinker& pLinker) = 0;
3605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// postLayout -Backend can do any needed modification after layout
3625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual void doPostLayout(const Output& pOutput,
3635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                          const MCLDInfo& pInfo,
3645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                          MCLinker& pLinker) = 0;
3655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
366affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// postProcessing - Backend can do any needed modification in the final stage
367affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void postProcessing(const Output& pOutput,
368affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                      const MCLDInfo& pInfo,
369affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                      MCLinker& pLinker);
370affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
3715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// dynamic - the dynamic section of the target machine.
3725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual ELFDynamic& dynamic() = 0;
3735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// dynamic - the dynamic section of the target machine.
3755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual const ELFDynamic& dynamic() const = 0;
3765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprotected:
378affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // Based on Kind in LDFileFormat to define basic section orders for ELF, and
379affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // refer gold linker to add more enumerations to handle Regular and BSS kind
380affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  enum SectionOrder {
381affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_INTERP = 1,          // .interp
382affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_RO_NOTE,             // .note.ABI-tag, .note.gnu.build-id
383affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_NAMEPOOL,            // *.hash, .dynsym, .dynstr
384affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_RELOCATION,          // .rel.*, .rela.*
385affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_REL_PLT,             // .rel.plt should come after other .rel.*
386affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_INIT,                // .init
387affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_PLT,                 // .plt
388affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_TEXT,                // .text
389affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_FINI,                // .fini
390affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_RO,                  // .rodata
391affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_EXCEPTION,           // .eh_frame_hdr, .eh_frame, .gcc_except_table
392affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_TLS_DATA,            // .tdata
393affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_TLS_BSS,             // .tbss
394affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_RELRO_LOCAL,         // .data.rel.ro.local
395affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_RELRO,               // .data.rel.ro,
396affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_RELRO_LAST,          // for x86 to adjust .got if needed
397affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_NON_RELRO_FIRST,     // for x86 to adjust .got.plt if needed
398affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_DATA,                // .data
399affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_LARGE_DATA,          // .ldata
400affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_RW_NOTE,             //
401affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_SMALL_DATA,          // .sdata
402affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_SMALL_BSS,           // .sbss
403affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_BSS,                 // .bss
404affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_LARGE_BSS,           // .lbss
405affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    SHO_UNDEFINED = ~(0U)    // default order
406affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  };
407affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
408affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typedef HashEntry<LDSymbol*, size_t, SymCompare> HashEntryType;
409affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typedef HashTable<HashEntryType, PtrHash, EntryFactory<HashEntryType> > HashTableType;
410affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
411affc150dc44fab1911775a49636d0ce85333b634Zonr Changprotected:
4125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // ----- readers and writers ----- //
4135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  GNUArchiveReader* m_pArchiveReader;
4145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ELFObjectReader* m_pObjectReader;
4155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ELFDynObjReader* m_pDynObjReader;
4165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ELFObjectWriter* m_pObjectWriter;
4175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ELFDynObjWriter* m_pDynObjWriter;
418affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ELFExecWriter*   m_pExecWriter;
4195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  file formats  ----- //
4215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ELFDynObjFileFormat* m_pDynObjFileFormat;
4225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ELFExecFileFormat* m_pExecFileFormat;
4235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
424affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // ELF segment factory
4255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ELFSegmentFactory m_ELFSegmentTable;
4265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
427affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // map the LDSymbol to its index in the output symbol table
4285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  HashTableType* m_pSymIndexMap;
429affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
430affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // section .eh_frame_hdr
431affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EhFrameHdr* m_pEhFrameHdr;
432affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
433affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // -----  standard symbols  ----- //
434affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // section symbols
435affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol* f_pPreInitArrayStart;
436affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol* f_pPreInitArrayEnd;
437affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol* f_pInitArrayStart;
438affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol* f_pInitArrayEnd;
439affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol* f_pFiniArrayStart;
440affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol* f_pFiniArrayEnd;
441affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol* f_pStack;
442affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
443affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // segment symbols
444affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol* f_pExecutableStart;
445affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol* f_pEText;
446affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol* f_p_EText;
447affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol* f_p__EText;
448affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol* f_pEData;
449affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol* f_p_EData;
450affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol* f_pBSSStart;
451affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol* f_pEnd;
452affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol* f_p_End;
4535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
4545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
4565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
4585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
459