LDFileFormat.h revision affc150dc44fab1911775a49636d0ce85333b634
1//===- LDFileFormat.h -----------------------------------------------------===// 2// 3// The MCLinker Project 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9#ifndef MCLD_LDFILE_FORMAT_H 10#define MCLD_LDFILE_FORMAT_H 11#ifdef ENABLE_UNITTEST 12#include <gtest.h> 13#endif 14 15#include <cstdio> 16#include <cassert> 17 18namespace mcld 19{ 20 21class MCLinker; 22class LDSection; 23 24/** \class LDFileFormat 25 * \brief LDFileFormat describes the common file formats. 26 */ 27class LDFileFormat 28{ 29public: 30 enum Kind { 31 Null, 32 Regular, 33 BSS, 34 NamePool, 35 Relocation, 36 Debug, 37 Target, 38 EhFrame, 39 EhFrameHdr, 40 GCCExceptTable, 41 Version, 42 Note, 43 MetaData, 44 Group, 45 }; 46 47protected: 48 LDFileFormat(); 49 50public: 51 virtual ~LDFileFormat(); 52 53 /// initStdSections - initialize all standard sections. 54 void initStdSections(MCLinker& pLinker); 55 56 /// initObjectFormat - different format, such as ELF and MachO, should 57 /// implement this 58 virtual void initObjectFormat(MCLinker& pLinker) = 0; 59 60 /// initObjectType - different types, such as shared object, executable 61 /// files, should implement this 62 virtual void initObjectType(MCLinker& pLinker) = 0; 63 64 // ----- access functions ----- // 65 LDSection& getText() { 66 assert(NULL != f_pTextSection); 67 return *f_pTextSection; 68 } 69 70 const LDSection& getText() const { 71 assert(NULL != f_pTextSection); 72 return *f_pTextSection; 73 } 74 75 LDSection& getData() { 76 assert(NULL != f_pDataSection); 77 return *f_pDataSection; 78 } 79 80 const LDSection& getData() const { 81 assert(NULL != f_pDataSection); 82 return *f_pDataSection; 83 } 84 85 LDSection& getBSS() { 86 assert(NULL != f_pBSSSection); 87 return *f_pBSSSection; 88 } 89 90 const LDSection& getBSS() const { 91 assert(NULL != f_pBSSSection); 92 return *f_pBSSSection; 93 } 94 95 LDSection& getReadOnly() { 96 assert(NULL != f_pReadOnlySection); 97 return *f_pReadOnlySection; 98 } 99 100 const LDSection& getReadOnly() const { 101 assert(NULL != f_pReadOnlySection); 102 return *f_pReadOnlySection; 103 } 104protected: 105 // variable name : ELF MachO 106 LDSection* f_pTextSection; // .text __text 107 LDSection* f_pDataSection; // .data __data 108 LDSection* f_pBSSSection; // .bss __bss 109 LDSection* f_pReadOnlySection; // .rodata __const 110}; 111 112} // namespace of mcld 113 114#endif 115 116