//===- LDFileFormat.h -----------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_LD_ELFFILEFORMAT_H_ #define MCLD_LD_ELFFILEFORMAT_H_ #include "mcld/LD/LDFileFormat.h" #include "mcld/LD/LDSection.h" namespace mcld { class ObjectBuilder; /** \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 { private: /// initObjectFormat - initialize sections that are dependent on object /// formats. (executable, shared objects or relocatable objects). virtual void initObjectFormat(ObjectBuilder& pBuilder, unsigned int pBitClass) = 0; public: ELFFileFormat(); void initStdSections(ObjectBuilder& pBuilder, unsigned int pBitClass); // ----- capacity ----- // /// @ref Special Sections, Ch. 4.17, System V ABI, 4th edition. bool hasNULLSection() const { return (f_pNULLSection != NULL) && (f_pNULLSection->size() != 0); } bool hasGOT() const { return (f_pGOT != NULL) && (f_pGOT->size() != 0); } bool hasPLT() const { return (f_pPLT != NULL) && (f_pPLT->size() != 0); } bool hasRelDyn() const { return (f_pRelDyn != NULL) && (f_pRelDyn->size() != 0); } bool hasRelPlt() const { return (f_pRelPlt != NULL) && (f_pRelPlt->size() != 0); } bool hasRelaDyn() const { return (f_pRelaDyn != NULL) && (f_pRelaDyn->size() != 0); } bool hasRelaPlt() const { return (f_pRelaPlt != NULL) && (f_pRelaPlt->size() != 0); } /// @ref 10.3.1.1, ISO/IEC 23360, Part 1:2010(E), p. 21. bool hasComment() const { return (f_pComment != NULL) && (f_pComment->size() != 0); } bool hasData1() const { return (f_pData1 != NULL) && (f_pData1->size() != 0); } bool hasDebug() const { return (f_pDebug != NULL) && (f_pDebug->size() != 0); } bool hasDynamic() const { return (f_pDynamic != NULL) && (f_pDynamic->size() != 0); } bool hasDynStrTab() const { return (f_pDynStrTab != NULL) && (f_pDynStrTab->size() != 0); } bool hasDynSymTab() const { return (f_pDynSymTab != NULL) && (f_pDynSymTab->size() != 0); } bool hasFini() const { return (f_pFini != NULL) && (f_pFini->size() != 0); } bool hasFiniArray() const { return (f_pFiniArray != NULL) && (f_pFiniArray->size() != 0); } bool hasHashTab() const { return (f_pHashTab != NULL) && (f_pHashTab->size() != 0); } bool hasInit() const { return (f_pInit != NULL) && (f_pInit->size() != 0); } bool hasInitArray() const { return (f_pInitArray != NULL) && (f_pInitArray->size() != 0); } bool hasInterp() const { return (f_pInterp != NULL) && (f_pInterp->size() != 0); } bool hasLine() const { return (f_pLine != NULL) && (f_pLine->size() != 0); } bool hasNote() const { return (f_pNote != NULL) && (f_pNote->size() != 0); } bool hasPreInitArray() const { return (f_pPreInitArray != NULL) && (f_pPreInitArray->size() != 0); } bool hasROData1() const { return (f_pROData1 != NULL) && (f_pROData1->size() != 0); } bool hasShStrTab() const { return (f_pShStrTab != NULL) && (f_pShStrTab->size() != 0); } bool hasStrTab() const { return (f_pStrTab != NULL) && (f_pStrTab->size() != 0); } bool hasSymTab() const { return (f_pSymTab != NULL) && (f_pSymTab->size() != 0); } bool hasTBSS() const { return (f_pTBSS != NULL) && (f_pTBSS->size() != 0); } bool hasTData() const { return (f_pTData != NULL) && (f_pTData->size() != 0); } /// @ref 10.3.1.2, ISO/IEC 23360, Part 1:2010(E), p. 24. bool hasCtors() const { return (f_pCtors != NULL) && (f_pCtors->size() != 0); } bool hasDataRelRo() const { return (f_pDataRelRo != NULL) && (f_pDataRelRo->size() != 0); } bool hasDtors() const { return (f_pDtors != NULL) && (f_pDtors->size() != 0); } bool hasEhFrame() const { return (f_pEhFrame != NULL) && (f_pEhFrame->size() != 0); } bool hasEhFrameHdr() const { return (f_pEhFrameHdr != NULL) && (f_pEhFrameHdr->size() != 0); } bool hasGCCExceptTable() const { return (f_pGCCExceptTable != NULL) && (f_pGCCExceptTable->size() != 0); } bool hasGNUVersion() const { return (f_pGNUVersion != NULL) && (f_pGNUVersion->size() != 0); } bool hasGNUVersionD() const { return (f_pGNUVersionD != NULL) && (f_pGNUVersionD->size() != 0); } bool hasGNUVersionR() const { return (f_pGNUVersionR != NULL) && (f_pGNUVersionR->size() != 0); } bool hasGOTPLT() const { return (f_pGOTPLT != NULL) && (f_pGOTPLT->size() != 0); } bool hasJCR() const { return (f_pJCR != NULL) && (f_pJCR->size() != 0); } bool hasNoteABITag() const { return (f_pNoteABITag != NULL) && (f_pNoteABITag->size() != 0); } bool hasStab() const { return (f_pStab != NULL) && (f_pStab->size() != 0); } bool hasStabStr() const { return (f_pStabStr != NULL) && (f_pStabStr->size() != 0); } bool hasStack() const { return (f_pStack != NULL) && (f_pStack->size() != 0); } bool hasStackNote() const { return (f_pStackNote != NULL); } bool hasDataRelRoLocal() const { return (f_pDataRelRoLocal != NULL) && (f_pDataRelRoLocal->size() != 0); } bool hasGNUHashTab() const { return (f_pGNUHashTab != NULL) && (f_pGNUHashTab->size() != 0); } // ----- access functions ----- // /// @ref Special Sections, Ch. 4.17, System V ABI, 4th edition. LDSection& getNULLSection() { assert(f_pNULLSection != NULL); return *f_pNULLSection; } const LDSection& getNULLSection() const { assert(f_pNULLSection != NULL); return *f_pNULLSection; } LDSection& getGOT() { assert(f_pGOT != NULL); return *f_pGOT; } const LDSection& getGOT() const { assert(f_pGOT != NULL); return *f_pGOT; } LDSection& getPLT() { assert(f_pPLT != NULL); return *f_pPLT; } const LDSection& getPLT() const { assert(f_pPLT != NULL); return *f_pPLT; } LDSection& getRelDyn() { assert(f_pRelDyn != NULL); return *f_pRelDyn; } const LDSection& getRelDyn() const { assert(f_pRelDyn != NULL); return *f_pRelDyn; } LDSection& getRelPlt() { assert(f_pRelPlt != NULL); return *f_pRelPlt; } const LDSection& getRelPlt() const { assert(f_pRelPlt != NULL); return *f_pRelPlt; } LDSection& getRelaDyn() { assert(f_pRelaDyn != NULL); return *f_pRelaDyn; } const LDSection& getRelaDyn() const { assert(f_pRelaDyn != NULL); return *f_pRelaDyn; } LDSection& getRelaPlt() { assert(f_pRelaPlt != NULL); return *f_pRelaPlt; } const LDSection& getRelaPlt() const { assert(f_pRelaPlt != NULL); return *f_pRelaPlt; } LDSection& getComment() { assert(f_pComment != NULL); return *f_pComment; } /// @ref 10.3.1.1, ISO/IEC 23360, Part 1:2010(E), p. 21. const LDSection& getComment() const { assert(f_pComment != NULL); return *f_pComment; } LDSection& getData1() { assert(f_pData1 != NULL); return *f_pData1; } const LDSection& getData1() const { assert(f_pData1 != NULL); return *f_pData1; } LDSection& getDebug() { assert(f_pDebug != NULL); return *f_pDebug; } const LDSection& getDebug() const { assert(f_pDebug != NULL); return *f_pDebug; } LDSection& getDynamic() { assert(f_pDynamic != NULL); return *f_pDynamic; } const LDSection& getDynamic() const { assert(f_pDynamic != NULL); return *f_pDynamic; } LDSection& getDynStrTab() { assert(f_pDynStrTab != NULL); return *f_pDynStrTab; } const LDSection& getDynStrTab() const { assert(f_pDynStrTab != NULL); return *f_pDynStrTab; } LDSection& getDynSymTab() { assert(f_pDynSymTab != NULL); return *f_pDynSymTab; } const LDSection& getDynSymTab() const { assert(f_pDynSymTab != NULL); return *f_pDynSymTab; } LDSection& getFini() { assert(f_pFini != NULL); return *f_pFini; } const LDSection& getFini() const { assert(f_pFini != NULL); return *f_pFini; } LDSection& getFiniArray() { assert(f_pFiniArray != NULL); return *f_pFiniArray; } const LDSection& getFiniArray() const { assert(f_pFiniArray != NULL); return *f_pFiniArray; } LDSection& getHashTab() { assert(f_pHashTab != NULL); return *f_pHashTab; } const LDSection& getHashTab() const { assert(f_pHashTab != NULL); return *f_pHashTab; } LDSection& getInit() { assert(f_pInit != NULL); return *f_pInit; } const LDSection& getInit() const { assert(f_pInit != NULL); return *f_pInit; } LDSection& getInitArray() { assert(f_pInitArray != NULL); return *f_pInitArray; } const LDSection& getInitArray() const { assert(f_pInitArray != NULL); return *f_pInitArray; } LDSection& getInterp() { assert(f_pInterp != NULL); return *f_pInterp; } const LDSection& getInterp() const { assert(f_pInterp != NULL); return *f_pInterp; } LDSection& getLine() { assert(f_pLine != NULL); return *f_pLine; } const LDSection& getLine() const { assert(f_pLine != NULL); return *f_pLine; } LDSection& getNote() { assert(f_pNote != NULL); return *f_pNote; } const LDSection& getNote() const { assert(f_pNote != NULL); return *f_pNote; } LDSection& getPreInitArray() { assert(f_pPreInitArray != NULL); return *f_pPreInitArray; } const LDSection& getPreInitArray() const { assert(f_pPreInitArray != NULL); return *f_pPreInitArray; } LDSection& getROData1() { assert(f_pROData1 != NULL); return *f_pROData1; } const LDSection& getROData1() const { assert(f_pROData1 != NULL); return *f_pROData1; } LDSection& getShStrTab() { assert(f_pShStrTab != NULL); return *f_pShStrTab; } const LDSection& getShStrTab() const { assert(f_pShStrTab != NULL); return *f_pShStrTab; } LDSection& getStrTab() { assert(f_pStrTab != NULL); return *f_pStrTab; } const LDSection& getStrTab() const { assert(f_pStrTab != NULL); return *f_pStrTab; } LDSection& getSymTab() { assert(f_pSymTab != NULL); return *f_pSymTab; } const LDSection& getSymTab() const { assert(f_pSymTab != NULL); return *f_pSymTab; } LDSection& getTBSS() { assert(f_pTBSS != NULL); return *f_pTBSS; } const LDSection& getTBSS() const { assert(f_pTBSS != NULL); return *f_pTBSS; } LDSection& getTData() { assert(f_pTData != NULL); return *f_pTData; } const LDSection& getTData() const { assert(f_pTData != NULL); return *f_pTData; } /// @ref 10.3.1.2, ISO/IEC 23360, Part 1:2010(E), p. 24. LDSection& getCtors() { assert(f_pCtors != NULL); return *f_pCtors; } const LDSection& getCtors() const { assert(f_pCtors != NULL); return *f_pCtors; } LDSection& getDataRelRo() { assert(f_pDataRelRo != NULL); return *f_pDataRelRo; } const LDSection& getDataRelRo() const { assert(f_pDataRelRo != NULL); return *f_pDataRelRo; } LDSection& getDtors() { assert(f_pDtors != NULL); return *f_pDtors; } const LDSection& getDtors() const { assert(f_pDtors != NULL); return *f_pDtors; } LDSection& getEhFrame() { assert(f_pEhFrame != NULL); return *f_pEhFrame; } const LDSection& getEhFrame() const { assert(f_pEhFrame != NULL); return *f_pEhFrame; } LDSection& getEhFrameHdr() { assert(f_pEhFrameHdr != NULL); return *f_pEhFrameHdr; } const LDSection& getEhFrameHdr() const { assert(f_pEhFrameHdr != NULL); return *f_pEhFrameHdr; } LDSection& getGCCExceptTable() { assert(f_pGCCExceptTable != NULL); return *f_pGCCExceptTable; } const LDSection& getGCCExceptTable() const { assert(f_pGCCExceptTable != NULL); return *f_pGCCExceptTable; } LDSection& getGNUVersion() { assert(f_pGNUVersion != NULL); return *f_pGNUVersion; } const LDSection& getGNUVersion() const { assert(f_pGNUVersion != NULL); return *f_pGNUVersion; } LDSection& getGNUVersionD() { assert(f_pGNUVersionD != NULL); return *f_pGNUVersionD; } const LDSection& getGNUVersionD() const { assert(f_pGNUVersionD != NULL); return *f_pGNUVersionD; } LDSection& getGNUVersionR() { assert(f_pGNUVersionR != NULL); return *f_pGNUVersionR; } const LDSection& getGNUVersionR() const { assert(f_pGNUVersionR != NULL); return *f_pGNUVersionR; } LDSection& getGOTPLT() { assert(f_pGOTPLT != NULL); return *f_pGOTPLT; } const LDSection& getGOTPLT() const { assert(f_pGOTPLT != NULL); return *f_pGOTPLT; } LDSection& getJCR() { assert(f_pJCR != NULL); return *f_pJCR; } const LDSection& getJCR() const { assert(f_pJCR != NULL); return *f_pJCR; } LDSection& getNoteABITag() { assert(f_pNoteABITag != NULL); return *f_pNoteABITag; } const LDSection& getNoteABITag() const { assert(f_pNoteABITag != NULL); return *f_pNoteABITag; } LDSection& getStab() { assert(f_pStab != NULL); return *f_pStab; } const LDSection& getStab() const { assert(f_pStab != NULL); return *f_pStab; } LDSection& getStabStr() { assert(f_pStabStr != NULL); return *f_pStabStr; } const LDSection& getStabStr() const { assert(f_pStabStr != NULL); return *f_pStabStr; } LDSection& getStack() { assert(f_pStack != NULL); return *f_pStack; } const LDSection& getStack() const { assert(f_pStack != NULL); return *f_pStack; } LDSection& getStackNote() { assert(f_pStackNote != NULL); return *f_pStackNote; } const LDSection& getStackNote() const { assert(f_pStackNote != NULL); return *f_pStackNote; } LDSection& getDataRelRoLocal() { assert(f_pDataRelRoLocal != NULL); return *f_pDataRelRoLocal; } const LDSection& getDataRelRoLocal() const { assert(f_pDataRelRoLocal != NULL); return *f_pDataRelRoLocal; } LDSection& getGNUHashTab() { assert(f_pGNUHashTab != NULL); return *f_pGNUHashTab; } const LDSection& getGNUHashTab() const { assert(f_pGNUHashTab != NULL); return *f_pGNUHashTab; } protected: // 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 LDSection* f_pStackNote; // .note.GNU-stack LDSection* f_pDataRelRoLocal; // .data.rel.ro.local LDSection* f_pGNUHashTab; // .gnu.hash }; } // namespace mcld #endif // MCLD_LD_ELFFILEFORMAT_H_