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