ELFFileFormat.h revision 5460a1f25d9ddecb5c70667267d66d51af177a99
18240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber//===- LDFileFormat.h -----------------------------------------------------===// 28240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber// 38240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber// The MCLinker Project 48240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber// 58240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber// This file is distributed under the University of Illinois Open Source 68240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber// License. See LICENSE.TXT for details. 78240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber// 88240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber//===----------------------------------------------------------------------===// 98240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber#ifndef MCLD_ELF_FILE_FORMAT_H 108240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber#define MCLD_ELF_FILE_FORMAT_H 118240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber#ifdef ENABLE_UNITTEST 128240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber#include <gtest.h> 138240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber#endif 148240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber#include <mcld/LD/LDFileFormat.h> 158240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber#include <mcld/LD/LDSection.h> 168240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 178240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Hubernamespace mcld 188240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber{ 198240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 208240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huberclass GNULDBackend; 218240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huberclass MCLinker; 228240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 238240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber/** \class ELFFileFormat 248240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber * \brief ELFFileFormat describes the common file formats in ELF. 258240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber * LDFileFormats control the formats of the output file. 268240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber * 278240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber * @ref "Object Files," Ch. 4, in System V Application Binary Interface, 288240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber * Fourth Edition. 298240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber * 308240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber * @ref "Object Format," Ch. 10, in ISO/IEC 23360 Part 1:2010(E), Linux 318240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber * Standard Base Core Specification 4.1. 328240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber */ 338240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huberclass ELFFileFormat : public LDFileFormat 348240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber{ 358240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huberpublic: 368240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber ELFFileFormat(GNULDBackend& pBackend); 378240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 388240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber virtual ~ELFFileFormat(); 398240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 408240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber virtual void initObjectFormat(MCLinker& pLinker); 418240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 428240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber virtual void initObjectType(MCLinker& pLinker) = 0; 438240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 448240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber // ----- capacity ----- // 458240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber /// @ref Special Sections, Ch. 4.17, System V ABI, 4th edition. 468240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasNULLSection() const 478240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pNULLSection) && (0 != f_pNULLSection->size()); } 488240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 498240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasGOT() const 508240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pGOT) && (0 != f_pGOT->size()); } 518240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 528240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasPLT() const 538240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pPLT) && (0 != f_pPLT->size()); } 548240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 558240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasRelDyn() const 568240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pRelDyn) && (0 != f_pRelDyn->size()); } 578240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 588240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasRelPlt() const 598240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pRelPlt) && (0 != f_pRelPlt->size()); } 608240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 618240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasRelaDyn() const 628240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pRelaDyn) && (0 != f_pRelaDyn->size()); } 638240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 648240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasRelaPlt() const 658240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pRelaPlt) && (0 != f_pRelaPlt->size()); } 668240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 678240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber /// @ref 10.3.1.1, ISO/IEC 23360, Part 1:2010(E), p. 21. 688240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasComment() const 698240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pComment) && (0 != f_pComment->size()); } 708240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 718240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasData1() const 728240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pData1) && (0 != f_pData1->size()); } 738240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 748240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasDebug() const 758240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pDebug) && (0 != f_pDebug->size()); } 768240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 778240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasDynamic() const 788240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pDynamic) && (0 != f_pDynamic->size()); } 798240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 808240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasDynStrTab() const 818240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pDynStrTab) && (0 != f_pDynStrTab->size()); } 828240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 838240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasDynSymTab() const 848240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pDynSymTab) && (0 != f_pDynSymTab->size()); } 858240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 868240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasFini() const 878240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pFini) && (0 != f_pFini->size()); } 888240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 898240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasFiniArray() const 908240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pFiniArray) && (0 != f_pFiniArray->size()); } 918240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 928240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasHashTab() const 938240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pHashTab) && (0 != f_pHashTab->size()); } 948240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 958240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasInit() const 968240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pInit) && (0 != f_pInit->size()); } 978240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 988240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasInitArray() const 998240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pInitArray) && (0 != f_pInitArray->size()); } 1008240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1018240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasInterp() const 1028240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pInterp) && (0 != f_pInterp->size()); } 1038240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1048240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasLine() const 1058240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pLine) && (0 != f_pLine->size()); } 1068240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1078240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasNote() const 1088240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pNote) && (0 != f_pNote->size()); } 1098240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1108240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasPreInitArray() const 1118240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pPreInitArray) && (0 != f_pPreInitArray->size()); } 1128240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1138240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasROData1() const 1148240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pROData1) && (0 != f_pROData1->size()); } 1158240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1168240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasShStrTab() const 1178240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pShStrTab) && (0 != f_pShStrTab->size()); } 1188240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1198240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasStrTab() const 1208240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pStrTab) && (0 != f_pStrTab->size()); } 1218240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1228240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasSymTab() const 1238240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pSymTab) && (0 != f_pSymTab->size()); } 1248240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1258240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasTBSS() const 1268240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pTBSS) && (0 != f_pTBSS->size()); } 1278240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1288240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasTData() const 1298240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pTData) && (0 != f_pTData->size()); } 1308240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1318240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber /// @ref 10.3.1.2, ISO/IEC 23360, Part 1:2010(E), p. 24. 1328240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasCtors() const 1338240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pCtors) && (0 != f_pCtors->size()); } 1348240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1358240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasDataRelRo() const 1368240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pDataRelRo) && (0 != f_pDataRelRo->size()); } 1378240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1388240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasDtors() const 1398240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pDtors) && (0 != f_pDtors->size()); } 1408240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1418240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasEhFrame() const 1428240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pEhFrame) && (0 != f_pEhFrame->size()); } 1438240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1448240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasEhFrameHdr() const 1458240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pEhFrameHdr) && (0 != f_pEhFrameHdr->size()); } 1468240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1478240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasGCCExceptTable() const 1488240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pGCCExceptTable) && (0 != f_pGCCExceptTable->size()); } 1498240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1508240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasGNUVersion() const 1518240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pGNUVersion) && (0 != f_pGNUVersion->size()); } 1528240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1538240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasGNUVersionD() const 1548240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pGNUVersionD) && (0 != f_pGNUVersionD->size()); } 1558240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1568240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasGNUVersionR() const 1578240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pGNUVersionR) && (0 != f_pGNUVersionR->size()); } 1588240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1598240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasGOTPLT() const 1608240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pGOTPLT) && (0 != f_pGOTPLT->size()); } 1618240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1628240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasJCR() const 1638240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pJCR) && (0 != f_pJCR->size()); } 1648240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1658240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasNoteABITag() const 1668240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pNoteABITag) && (0 != f_pNoteABITag->size()); } 1678240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1688240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasStab() const 1698240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pStab) && (0 != f_pStab->size()); } 1708240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1718240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber bool hasStabStr() const 1728240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber { return (NULL != f_pStabStr) && (0 != f_pStabStr->size()); } 1738240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1748240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber // ----- access functions ----- // 1758240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber /// @ref Special Sections, Ch. 4.17, System V ABI, 4th edition. 1768240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber LDSection& getNULLSection() { 1778240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pNULLSection); 1788240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pNULLSection; 1798240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 1808240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1818240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber const LDSection& getNULLSection() const { 1828240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pNULLSection); 1838240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pNULLSection; 1848240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 1858240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1868240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber LDSection& getGOT() { 1878240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pGOT); 1888240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pGOT; 1898240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 1908240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1918240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber const LDSection& getGOT() const { 1928240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pGOT); 1938240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pGOT; 1948240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 1958240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 1968240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber LDSection& getPLT() { 1978240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pPLT); 1988240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pPLT; 1998240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2008240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 2018240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber const LDSection& getPLT() const { 2028240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pPLT); 2038240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pPLT; 2048240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2058240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 2068240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber LDSection& getRelDyn() { 2078240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pRelDyn); 2088240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pRelDyn; 2098240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2108240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 2118240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber const LDSection& getRelDyn() const { 2128240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pRelDyn); 2138240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pRelDyn; 2148240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2158240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 2168240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber LDSection& getRelPlt() { 2178240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pRelPlt); 2188240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pRelPlt; 2198240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2208240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 2218240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber const LDSection& getRelPlt() const { 2228240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pRelPlt); 2238240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pRelPlt; 2248240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2258240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 2268240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber LDSection& getRelaDyn() { 2278240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pRelaDyn); 2288240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pRelaDyn; 2298240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2308240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 2318240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber const LDSection& getRelaDyn() const { 2328240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pRelaDyn); 2338240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pRelaDyn; 2348240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2358240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 2368240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber LDSection& getRelaPlt() { 2378240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pRelaPlt); 2388240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pRelaPlt; 2398240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2408240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 2418240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber const LDSection& getRelaPlt() const { 2428240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pRelaPlt); 2438240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pRelaPlt; 2448240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2458240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 2468240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber LDSection& getComment() { 2478240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pComment); 2488240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pComment; 2498240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2508240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 2518240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber /// @ref 10.3.1.1, ISO/IEC 23360, Part 1:2010(E), p. 21. 2528240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber const LDSection& getComment() const { 2538240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pComment); 2548240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pComment; 2558240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2568240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 2578240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber LDSection& getData1() { 2588240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pData1); 2598240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pData1; 2608240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2618240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 2628240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber const LDSection& getData1() const { 2638240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pData1); 2648240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pData1; 2658240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2668240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 2678240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber LDSection& getDebug() { 2688240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pDebug); 2698240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pDebug; 2708240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2718240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 2728240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber const LDSection& getDebug() const { 2738240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pDebug); 2748240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pDebug; 2758240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2768240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 2778240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber LDSection& getDynamic() { 2788240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pDynamic); 2798240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pDynamic; 2808240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2818240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 2828240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber const LDSection& getDynamic() const { 2838240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pDynamic); 2848240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pDynamic; 2858240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2868240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 2878240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber LDSection& getDynStrTab() { 2888240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber assert(NULL != f_pDynStrTab); 2898240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber return *f_pDynStrTab; 2908240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 2918240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 292 const LDSection& getDynStrTab() const { 293 assert(NULL != f_pDynStrTab); 294 return *f_pDynStrTab; 295 } 296 297 LDSection& getDynSymTab() { 298 assert(NULL != f_pDynSymTab); 299 return *f_pDynSymTab; 300 } 301 302 const LDSection& getDynSymTab() const { 303 assert(NULL != f_pDynSymTab); 304 return *f_pDynSymTab; 305 } 306 307 LDSection& getFini() { 308 assert(NULL != f_pFini); 309 return *f_pFini; 310 } 311 312 const LDSection& getFini() const { 313 assert(NULL != f_pFini); 314 return *f_pFini; 315 } 316 317 LDSection& getFiniArray() { 318 assert(NULL != f_pFiniArray); 319 return *f_pFiniArray; 320 } 321 322 const LDSection& getFiniArray() const { 323 assert(NULL != f_pFiniArray); 324 return *f_pFiniArray; 325 } 326 327 LDSection& getHashTab() { 328 assert(NULL != f_pHashTab); 329 return *f_pHashTab; 330 } 331 332 const LDSection& getHashTab() const { 333 assert(NULL != f_pHashTab); 334 return *f_pHashTab; 335 } 336 337 LDSection& getInit() { 338 assert(NULL != f_pInit); 339 return *f_pInit; 340 } 341 342 const LDSection& getInit() const { 343 assert(NULL != f_pInit); 344 return *f_pInit; 345 } 346 347 LDSection& getInitArray() { 348 assert(NULL != f_pInitArray); 349 return *f_pInitArray; 350 } 351 352 const LDSection& getInitArray() const { 353 assert(NULL != f_pInitArray); 354 return *f_pInitArray; 355 } 356 357 LDSection& getInterp() { 358 assert(NULL != f_pInterp); 359 return *f_pInterp; 360 } 361 362 const LDSection& getInterp() const { 363 assert(NULL != f_pInterp); 364 return *f_pInterp; 365 } 366 367 LDSection& getLine() { 368 assert(NULL != f_pLine); 369 return *f_pLine; 370 } 371 372 const LDSection& getLine() const { 373 assert(NULL != f_pLine); 374 return *f_pLine; 375 } 376 377 LDSection& getNote() { 378 assert(NULL != f_pNote); 379 return *f_pNote; 380 } 381 382 const LDSection& getNote() const { 383 assert(NULL != f_pNote); 384 return *f_pNote; 385 } 386 387 LDSection& getPreInitArray() { 388 assert(NULL != f_pPreInitArray); 389 return *f_pPreInitArray; 390 } 391 392 const LDSection& getPreInitArray() const { 393 assert(NULL != f_pPreInitArray); 394 return *f_pPreInitArray; 395 } 396 397 LDSection& getROData1() { 398 assert(NULL != f_pROData1); 399 return *f_pROData1; 400 } 401 402 const LDSection& getROData1() const { 403 assert(NULL != f_pROData1); 404 return *f_pROData1; 405 } 406 407 LDSection& getShStrTab() { 408 assert(NULL != f_pShStrTab); 409 return *f_pShStrTab; 410 } 411 412 const LDSection& getShStrTab() const { 413 assert(NULL != f_pShStrTab); 414 return *f_pShStrTab; 415 } 416 417 LDSection& getStrTab() { 418 assert(NULL != f_pStrTab); 419 return *f_pStrTab; 420 } 421 422 const LDSection& getStrTab() const { 423 assert(NULL != f_pStrTab); 424 return *f_pStrTab; 425 } 426 427 LDSection& getSymTab() { 428 assert(NULL != f_pSymTab); 429 return *f_pSymTab; 430 } 431 432 const LDSection& getSymTab() const { 433 assert(NULL != f_pSymTab); 434 return *f_pSymTab; 435 } 436 437 LDSection& getTBSS() { 438 assert(NULL != f_pTBSS); 439 return *f_pTBSS; 440 } 441 442 const LDSection& getTBSS() const { 443 assert(NULL != f_pTBSS); 444 return *f_pTBSS; 445 } 446 447 LDSection& getTData() { 448 assert(NULL != f_pTData); 449 return *f_pTData; 450 } 451 452 const LDSection& getTData() const { 453 assert(NULL != f_pTData); 454 return *f_pTData; 455 } 456 457 /// @ref 10.3.1.2, ISO/IEC 23360, Part 1:2010(E), p. 24. 458 LDSection& getCtors() { 459 assert(NULL != f_pCtors); 460 return *f_pCtors; 461 } 462 463 const LDSection& getCtors() const { 464 assert(NULL != f_pCtors); 465 return *f_pCtors; 466 } 467 468 LDSection& getDataRelRo() { 469 assert(NULL != f_pDataRelRo); 470 return *f_pDataRelRo; 471 } 472 473 const LDSection& getDataRelRo() const { 474 assert(NULL != f_pDataRelRo); 475 return *f_pDataRelRo; 476 } 477 478 LDSection& getDtors() { 479 assert(NULL != f_pDtors); 480 return *f_pDtors; 481 } 482 483 const LDSection& getDtors() const { 484 assert(NULL != f_pDtors); 485 return *f_pDtors; 486 } 487 488 LDSection& getEhFrame() { 489 assert(NULL != f_pEhFrame); 490 return *f_pEhFrame; 491 } 492 493 const LDSection& getEhFrame() const { 494 assert(NULL != f_pEhFrame); 495 return *f_pEhFrame; 496 } 497 498 LDSection& getEhFrameHdr() { 499 assert(NULL != f_pEhFrameHdr); 500 return *f_pEhFrameHdr; 501 } 502 503 const LDSection& getEhFrameHdr() const { 504 assert(NULL != f_pEhFrameHdr); 505 return *f_pEhFrameHdr; 506 } 507 508 LDSection& getGCCExceptTable() { 509 assert(NULL != f_pGCCExceptTable); 510 return *f_pGCCExceptTable; 511 } 512 513 const LDSection& getGCCExceptTable() const { 514 assert(NULL != f_pGCCExceptTable); 515 return *f_pGCCExceptTable; 516 } 517 518 LDSection& getGNUVersion() { 519 assert(NULL != f_pGNUVersion); 520 return *f_pGNUVersion; 521 } 522 523 const LDSection& getGNUVersion() const { 524 assert(NULL != f_pGNUVersion); 525 return *f_pGNUVersion; 526 } 527 528 LDSection& getGNUVersionD() { 529 assert(NULL != f_pGNUVersionD); 530 return *f_pGNUVersionD; 531 } 532 533 const LDSection& getGNUVersionD() const { 534 assert(NULL != f_pGNUVersionD); 535 return *f_pGNUVersionD; 536 } 537 538 LDSection& getGNUVersionR() { 539 assert(NULL != f_pGNUVersionR); 540 return *f_pGNUVersionR; 541 } 542 543 const LDSection& getGNUVersionR() const { 544 assert(NULL != f_pGNUVersionR); 545 return *f_pGNUVersionR; 546 } 547 548 LDSection& getGOTPLT() { 549 assert(NULL != f_pGOTPLT); 550 return *f_pGOTPLT; 551 } 552 553 const LDSection& getGOTPLT() const { 554 assert(NULL != f_pGOTPLT); 555 return *f_pGOTPLT; 556 } 557 558 LDSection& getJCR() { 559 assert(NULL != f_pJCR); 560 return *f_pJCR; 561 } 562 563 const LDSection& getJCR() const { 564 assert(NULL != f_pJCR); 565 return *f_pJCR; 566 } 567 568 LDSection& getNoteABITag() { 569 assert(NULL != f_pNoteABITag); 570 return *f_pNoteABITag; 571 } 572 573 const LDSection& getNoteABITag() const { 574 assert(NULL != f_pNoteABITag); 575 return *f_pNoteABITag; 576 } 577 578 LDSection& getStab() { 579 assert(NULL != f_pStab); 580 return *f_pStab; 581 } 582 583 const LDSection& getStab() const { 584 assert(NULL != f_pStab); 585 return *f_pStab; 586 } 587 588 LDSection& getStabStr() { 589 assert(NULL != f_pStabStr); 590 return *f_pStabStr; 591 } 592 593 const LDSection& getStabStr() const { 594 assert(NULL != f_pStabStr); 595 return *f_pStabStr; 596 } 597 598protected: 599 GNULDBackend& f_Backend; 600 601 // variable name : ELF 602 /// @ref Special Sections, Ch. 4.17, System V ABI, 4th edition. 603 LDSection* f_pNULLSection; 604 LDSection* f_pGOT; // .got 605 LDSection* f_pPLT; // .plt 606 LDSection* f_pRelDyn; // .rel.dyn 607 LDSection* f_pRelPlt; // .rel.plt 608 LDSection* f_pRelaDyn; // .rela.dyn 609 LDSection* f_pRelaPlt; // .rela.plt 610 611 /// @ref 10.3.1.1, ISO/IEC 23360, Part 1:2010(E), p. 21. 612 LDSection* f_pComment; // .comment 613 LDSection* f_pData1; // .data1 614 LDSection* f_pDebug; // .debug 615 LDSection* f_pDynamic; // .dynamic 616 LDSection* f_pDynStrTab; // .dynstr 617 LDSection* f_pDynSymTab; // .dynsym 618 LDSection* f_pFini; // .fini 619 LDSection* f_pFiniArray; // .fini_array 620 LDSection* f_pHashTab; // .hash 621 LDSection* f_pInit; // .init 622 LDSection* f_pInitArray; // .init_array 623 LDSection* f_pInterp; // .interp 624 LDSection* f_pLine; // .line 625 LDSection* f_pNote; // .note 626 LDSection* f_pPreInitArray; // .preinit_array 627 LDSection* f_pROData1; // .rodata1 628 LDSection* f_pShStrTab; // .shstrtab 629 LDSection* f_pStrTab; // .strtab 630 LDSection* f_pSymTab; // .symtab 631 LDSection* f_pTBSS; // .tbss 632 LDSection* f_pTData; // .tdata 633 634 /// @ref 10.3.1.2, ISO/IEC 23360, Part 1:2010(E), p. 24. 635 LDSection* f_pCtors; // .ctors 636 LDSection* f_pDataRelRo; // .data.rel.ro 637 LDSection* f_pDtors; // .dtors 638 LDSection* f_pEhFrame; // .eh_frame 639 LDSection* f_pEhFrameHdr; // .eh_frame_hdr 640 LDSection* f_pGCCExceptTable; // .gcc_except_table 641 LDSection* f_pGNUVersion; // .gnu.version 642 LDSection* f_pGNUVersionD; // .gnu.version_d 643 LDSection* f_pGNUVersionR; // .gnu.version_r 644 LDSection* f_pGOTPLT; // .got.plt 645 LDSection* f_pJCR; // .jcr 646 LDSection* f_pNoteABITag; // .note.ABI-tag 647 LDSection* f_pStab; // .stab 648 LDSection* f_pStabStr; // .stabstr 649}; 650 651} // namespace of mcld 652 653#endif 654 655