//===- LDFileFormat.h -----------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_ELF_FILE_FORMAT_H #define MCLD_ELF_FILE_FORMAT_H #ifdef ENABLE_UNITTEST #include <gtest.h> #endif #include <mcld/LD/LDFileFormat.h> #include <mcld/LD/LDSection.h> namespace mcld { class GNULDBackend; class MCLinker; /** \class ELFFileFormat * \brief ELFFileFormat describes the common file formats in ELF. * LDFileFormats control the formats of the output file. * * @ref "Object Files," Ch. 4, in System V Application Binary Interface, * Fourth Edition. * * @ref "Object Format," Ch. 10, in ISO/IEC 23360 Part 1:2010(E), Linux * Standard Base Core Specification 4.1. */ class ELFFileFormat : public LDFileFormat { public: ELFFileFormat(GNULDBackend& pBackend); virtual ~ELFFileFormat(); virtual void initObjectFormat(MCLinker& pLinker); virtual void initObjectType(MCLinker& pLinker) = 0; // ----- capacity ----- // /// @ref Special Sections, Ch. 4.17, System V ABI, 4th edition. bool hasNULLSection() const { return (NULL != f_pNULLSection) && (0 != f_pNULLSection->size()); } bool hasGOT() const { return (NULL != f_pGOT) && (0 != f_pGOT->size()); } bool hasPLT() const { return (NULL != f_pPLT) && (0 != f_pPLT->size()); } bool hasRelDyn() const { return (NULL != f_pRelDyn) && (0 != f_pRelDyn->size()); } bool hasRelPlt() const { return (NULL != f_pRelPlt) && (0 != f_pRelPlt->size()); } bool hasRelaDyn() const { return (NULL != f_pRelaDyn) && (0 != f_pRelaDyn->size()); } bool hasRelaPlt() const { return (NULL != f_pRelaPlt) && (0 != f_pRelaPlt->size()); } /// @ref 10.3.1.1, ISO/IEC 23360, Part 1:2010(E), p. 21. bool hasComment() const { return (NULL != f_pComment) && (0 != f_pComment->size()); } bool hasData1() const { return (NULL != f_pData1) && (0 != f_pData1->size()); } bool hasDebug() const { return (NULL != f_pDebug) && (0 != f_pDebug->size()); } bool hasDynamic() const { return (NULL != f_pDynamic) && (0 != f_pDynamic->size()); } bool hasDynStrTab() const { return (NULL != f_pDynStrTab) && (0 != f_pDynStrTab->size()); } bool hasDynSymTab() const { return (NULL != f_pDynSymTab) && (0 != f_pDynSymTab->size()); } bool hasFini() const { return (NULL != f_pFini) && (0 != f_pFini->size()); } bool hasFiniArray() const { return (NULL != f_pFiniArray) && (0 != f_pFiniArray->size()); } bool hasHashTab() const { return (NULL != f_pHashTab) && (0 != f_pHashTab->size()); } bool hasInit() const { return (NULL != f_pInit) && (0 != f_pInit->size()); } bool hasInitArray() const { return (NULL != f_pInitArray) && (0 != f_pInitArray->size()); } bool hasInterp() const { return (NULL != f_pInterp) && (0 != f_pInterp->size()); } bool hasLine() const { return (NULL != f_pLine) && (0 != f_pLine->size()); } bool hasNote() const { return (NULL != f_pNote) && (0 != f_pNote->size()); } bool hasPreInitArray() const { return (NULL != f_pPreInitArray) && (0 != f_pPreInitArray->size()); } bool hasROData1() const { return (NULL != f_pROData1) && (0 != f_pROData1->size()); } bool hasShStrTab() const { return (NULL != f_pShStrTab) && (0 != f_pShStrTab->size()); } bool hasStrTab() const { return (NULL != f_pStrTab) && (0 != f_pStrTab->size()); } bool hasSymTab() const { return (NULL != f_pSymTab) && (0 != f_pSymTab->size()); } bool hasTBSS() const { return (NULL != f_pTBSS) && (0 != f_pTBSS->size()); } bool hasTData() const { return (NULL != f_pTData) && (0 != f_pTData->size()); } /// @ref 10.3.1.2, ISO/IEC 23360, Part 1:2010(E), p. 24. bool hasCtors() const { return (NULL != f_pCtors) && (0 != f_pCtors->size()); } bool hasDataRelRo() const { return (NULL != f_pDataRelRo) && (0 != f_pDataRelRo->size()); } bool hasDtors() const { return (NULL != f_pDtors) && (0 != f_pDtors->size()); } bool hasEhFrame() const { return (NULL != f_pEhFrame) && (0 != f_pEhFrame->size()); } bool hasEhFrameHdr() const { return (NULL != f_pEhFrameHdr) && (0 != f_pEhFrameHdr->size()); } bool hasGCCExceptTable() const { return (NULL != f_pGCCExceptTable) && (0 != f_pGCCExceptTable->size()); } bool hasGNUVersion() const { return (NULL != f_pGNUVersion) && (0 != f_pGNUVersion->size()); } bool hasGNUVersionD() const { return (NULL != f_pGNUVersionD) && (0 != f_pGNUVersionD->size()); } bool hasGNUVersionR() const { return (NULL != f_pGNUVersionR) && (0 != f_pGNUVersionR->size()); } bool hasGOTPLT() const { return (NULL != f_pGOTPLT) && (0 != f_pGOTPLT->size()); } bool hasJCR() const { return (NULL != f_pJCR) && (0 != f_pJCR->size()); } bool hasNoteABITag() const { return (NULL != f_pNoteABITag) && (0 != f_pNoteABITag->size()); } bool hasStab() const { return (NULL != f_pStab) && (0 != f_pStab->size()); } bool hasStabStr() const { return (NULL != f_pStabStr) && (0 != f_pStabStr->size()); } bool hasStack() const { return (NULL != f_pStack) && (0 != f_pStack->size()); } // ----- access functions ----- // /// @ref Special Sections, Ch. 4.17, System V ABI, 4th edition. LDSection& getNULLSection() { assert(NULL != f_pNULLSection); return *f_pNULLSection; } const LDSection& getNULLSection() const { assert(NULL != f_pNULLSection); return *f_pNULLSection; } LDSection& getGOT() { assert(NULL != f_pGOT); return *f_pGOT; } const LDSection& getGOT() const { assert(NULL != f_pGOT); return *f_pGOT; } LDSection& getPLT() { assert(NULL != f_pPLT); return *f_pPLT; } const LDSection& getPLT() const { assert(NULL != f_pPLT); return *f_pPLT; } LDSection& getRelDyn() { assert(NULL != f_pRelDyn); return *f_pRelDyn; } const LDSection& getRelDyn() const { assert(NULL != f_pRelDyn); return *f_pRelDyn; } LDSection& getRelPlt() { assert(NULL != f_pRelPlt); return *f_pRelPlt; } const LDSection& getRelPlt() const { assert(NULL != f_pRelPlt); return *f_pRelPlt; } LDSection& getRelaDyn() { assert(NULL != f_pRelaDyn); return *f_pRelaDyn; } const LDSection& getRelaDyn() const { assert(NULL != f_pRelaDyn); return *f_pRelaDyn; } LDSection& getRelaPlt() { assert(NULL != f_pRelaPlt); return *f_pRelaPlt; } const LDSection& getRelaPlt() const { assert(NULL != f_pRelaPlt); return *f_pRelaPlt; } LDSection& getComment() { assert(NULL != f_pComment); return *f_pComment; } /// @ref 10.3.1.1, ISO/IEC 23360, Part 1:2010(E), p. 21. const LDSection& getComment() const { assert(NULL != f_pComment); return *f_pComment; } LDSection& getData1() { assert(NULL != f_pData1); return *f_pData1; } const LDSection& getData1() const { assert(NULL != f_pData1); return *f_pData1; } LDSection& getDebug() { assert(NULL != f_pDebug); return *f_pDebug; } const LDSection& getDebug() const { assert(NULL != f_pDebug); return *f_pDebug; } LDSection& getDynamic() { assert(NULL != f_pDynamic); return *f_pDynamic; } const LDSection& getDynamic() const { assert(NULL != f_pDynamic); return *f_pDynamic; } LDSection& getDynStrTab() { assert(NULL != f_pDynStrTab); return *f_pDynStrTab; } const LDSection& getDynStrTab() const { assert(NULL != f_pDynStrTab); return *f_pDynStrTab; } LDSection& getDynSymTab() { assert(NULL != f_pDynSymTab); return *f_pDynSymTab; } const LDSection& getDynSymTab() const { assert(NULL != f_pDynSymTab); return *f_pDynSymTab; } LDSection& getFini() { assert(NULL != f_pFini); return *f_pFini; } const LDSection& getFini() const { assert(NULL != f_pFini); return *f_pFini; } LDSection& getFiniArray() { assert(NULL != f_pFiniArray); return *f_pFiniArray; } const LDSection& getFiniArray() const { assert(NULL != f_pFiniArray); return *f_pFiniArray; } LDSection& getHashTab() { assert(NULL != f_pHashTab); return *f_pHashTab; } const LDSection& getHashTab() const { assert(NULL != f_pHashTab); return *f_pHashTab; } LDSection& getInit() { assert(NULL != f_pInit); return *f_pInit; } const LDSection& getInit() const { assert(NULL != f_pInit); return *f_pInit; } LDSection& getInitArray() { assert(NULL != f_pInitArray); return *f_pInitArray; } const LDSection& getInitArray() const { assert(NULL != f_pInitArray); return *f_pInitArray; } LDSection& getInterp() { assert(NULL != f_pInterp); return *f_pInterp; } const LDSection& getInterp() const { assert(NULL != f_pInterp); return *f_pInterp; } LDSection& getLine() { assert(NULL != f_pLine); return *f_pLine; } const LDSection& getLine() const { assert(NULL != f_pLine); return *f_pLine; } LDSection& getNote() { assert(NULL != f_pNote); return *f_pNote; } const LDSection& getNote() const { assert(NULL != f_pNote); return *f_pNote; } LDSection& getPreInitArray() { assert(NULL != f_pPreInitArray); return *f_pPreInitArray; } const LDSection& getPreInitArray() const { assert(NULL != f_pPreInitArray); return *f_pPreInitArray; } LDSection& getROData1() { assert(NULL != f_pROData1); return *f_pROData1; } const LDSection& getROData1() const { assert(NULL != f_pROData1); return *f_pROData1; } LDSection& getShStrTab() { assert(NULL != f_pShStrTab); return *f_pShStrTab; } const LDSection& getShStrTab() const { assert(NULL != f_pShStrTab); return *f_pShStrTab; } LDSection& getStrTab() { assert(NULL != f_pStrTab); return *f_pStrTab; } const LDSection& getStrTab() const { assert(NULL != f_pStrTab); return *f_pStrTab; } LDSection& getSymTab() { assert(NULL != f_pSymTab); return *f_pSymTab; } const LDSection& getSymTab() const { assert(NULL != f_pSymTab); return *f_pSymTab; } LDSection& getTBSS() { assert(NULL != f_pTBSS); return *f_pTBSS; } const LDSection& getTBSS() const { assert(NULL != f_pTBSS); return *f_pTBSS; } LDSection& getTData() { assert(NULL != f_pTData); return *f_pTData; } const LDSection& getTData() const { assert(NULL != f_pTData); return *f_pTData; } /// @ref 10.3.1.2, ISO/IEC 23360, Part 1:2010(E), p. 24. LDSection& getCtors() { assert(NULL != f_pCtors); return *f_pCtors; } const LDSection& getCtors() const { assert(NULL != f_pCtors); return *f_pCtors; } LDSection& getDataRelRo() { assert(NULL != f_pDataRelRo); return *f_pDataRelRo; } const LDSection& getDataRelRo() const { assert(NULL != f_pDataRelRo); return *f_pDataRelRo; } LDSection& getDtors() { assert(NULL != f_pDtors); return *f_pDtors; } const LDSection& getDtors() const { assert(NULL != f_pDtors); return *f_pDtors; } LDSection& getEhFrame() { assert(NULL != f_pEhFrame); return *f_pEhFrame; } const LDSection& getEhFrame() const { assert(NULL != f_pEhFrame); return *f_pEhFrame; } LDSection& getEhFrameHdr() { assert(NULL != f_pEhFrameHdr); return *f_pEhFrameHdr; } const LDSection& getEhFrameHdr() const { assert(NULL != f_pEhFrameHdr); return *f_pEhFrameHdr; } LDSection& getGCCExceptTable() { assert(NULL != f_pGCCExceptTable); return *f_pGCCExceptTable; } const LDSection& getGCCExceptTable() const { assert(NULL != f_pGCCExceptTable); return *f_pGCCExceptTable; } LDSection& getGNUVersion() { assert(NULL != f_pGNUVersion); return *f_pGNUVersion; } const LDSection& getGNUVersion() const { assert(NULL != f_pGNUVersion); return *f_pGNUVersion; } LDSection& getGNUVersionD() { assert(NULL != f_pGNUVersionD); return *f_pGNUVersionD; } const LDSection& getGNUVersionD() const { assert(NULL != f_pGNUVersionD); return *f_pGNUVersionD; } LDSection& getGNUVersionR() { assert(NULL != f_pGNUVersionR); return *f_pGNUVersionR; } const LDSection& getGNUVersionR() const { assert(NULL != f_pGNUVersionR); return *f_pGNUVersionR; } LDSection& getGOTPLT() { assert(NULL != f_pGOTPLT); return *f_pGOTPLT; } const LDSection& getGOTPLT() const { assert(NULL != f_pGOTPLT); return *f_pGOTPLT; } LDSection& getJCR() { assert(NULL != f_pJCR); return *f_pJCR; } const LDSection& getJCR() const { assert(NULL != f_pJCR); return *f_pJCR; } LDSection& getNoteABITag() { assert(NULL != f_pNoteABITag); return *f_pNoteABITag; } const LDSection& getNoteABITag() const { assert(NULL != f_pNoteABITag); return *f_pNoteABITag; } LDSection& getStab() { assert(NULL != f_pStab); return *f_pStab; } const LDSection& getStab() const { assert(NULL != f_pStab); return *f_pStab; } LDSection& getStabStr() { assert(NULL != f_pStabStr); return *f_pStabStr; } const LDSection& getStabStr() const { assert(NULL != f_pStabStr); return *f_pStabStr; } LDSection& getStack() { assert(NULL != f_pStack); return *f_pStack; } const LDSection& getStack() const { assert(NULL != f_pStack); return *f_pStack; } protected: GNULDBackend& f_Backend; // variable name : ELF /// @ref Special Sections, Ch. 4.17, System V ABI, 4th edition. LDSection* f_pNULLSection; LDSection* f_pGOT; // .got LDSection* f_pPLT; // .plt LDSection* f_pRelDyn; // .rel.dyn LDSection* f_pRelPlt; // .rel.plt LDSection* f_pRelaDyn; // .rela.dyn LDSection* f_pRelaPlt; // .rela.plt /// @ref 10.3.1.1, ISO/IEC 23360, Part 1:2010(E), p. 21. LDSection* f_pComment; // .comment LDSection* f_pData1; // .data1 LDSection* f_pDebug; // .debug LDSection* f_pDynamic; // .dynamic LDSection* f_pDynStrTab; // .dynstr LDSection* f_pDynSymTab; // .dynsym LDSection* f_pFini; // .fini LDSection* f_pFiniArray; // .fini_array LDSection* f_pHashTab; // .hash LDSection* f_pInit; // .init LDSection* f_pInitArray; // .init_array LDSection* f_pInterp; // .interp LDSection* f_pLine; // .line LDSection* f_pNote; // .note LDSection* f_pPreInitArray; // .preinit_array LDSection* f_pROData1; // .rodata1 LDSection* f_pShStrTab; // .shstrtab LDSection* f_pStrTab; // .strtab LDSection* f_pSymTab; // .symtab LDSection* f_pTBSS; // .tbss LDSection* f_pTData; // .tdata /// @ref 10.3.1.2, ISO/IEC 23360, Part 1:2010(E), p. 24. LDSection* f_pCtors; // .ctors LDSection* f_pDataRelRo; // .data.rel.ro LDSection* f_pDtors; // .dtors LDSection* f_pEhFrame; // .eh_frame LDSection* f_pEhFrameHdr; // .eh_frame_hdr LDSection* f_pGCCExceptTable; // .gcc_except_table LDSection* f_pGNUVersion; // .gnu.version LDSection* f_pGNUVersionD; // .gnu.version_d LDSection* f_pGNUVersionR; // .gnu.version_r LDSection* f_pGOTPLT; // .got.plt LDSection* f_pJCR; // .jcr LDSection* f_pNoteABITag; // .note.ABI-tag LDSection* f_pStab; // .stab LDSection* f_pStabStr; // .stabstr /// practical LDSection* f_pStack; // .stack }; } // namespace of mcld #endif