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