//===- 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