blob: 5bb664cdbff0ceb6853a247e6d898152ee96166a [file] [log] [blame]
//===- 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_