1cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root//===- LDFileFormat.h -----------------------------------------------------===// 2cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root// 3cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root// The MCLinker Project 4cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root// 5cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root// This file is distributed under the University of Illinois Open Source 6cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root// License. See LICENSE.TXT for details. 7cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root// 8cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root//===----------------------------------------------------------------------===// 9cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root#ifndef MCLD_LDFILE_FORMAT_H 10cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root#define MCLD_LDFILE_FORMAT_H 11cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root#ifdef ENABLE_UNITTEST 12cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root#include <gtest.h> 13cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root#endif 14cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 15cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root#include <cstdio> 16cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root#include <cassert> 17cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 18cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootnamespace mcld 19cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root{ 20cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 21cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootclass MCLinker; 22cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootclass LDSection; 23cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 24cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root/** \class LDFileFormat 25cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * \brief LDFileFormat describes the common file formats. 26cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */ 27cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootclass LDFileFormat 28cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root{ 29cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootpublic: 30cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root enum Kind { 31cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Null, 32cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Regular, 33cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root BSS, 34cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root NamePool, 35cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Relocation, 36a3f133afe885f9e005dfc0584cb7b3b90f75f665Amith Yamasani Debug, 37cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Target, 38cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root EhFrame, 39cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root EhFrameHdr, 40cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root GCCExceptTable, 41cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Version, 42cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Note, 43cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root MetaData, 44cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Group, 45cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root }; 46cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 47cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootprotected: 48cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root LDFileFormat(); 49cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 50cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootpublic: 51cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root virtual ~LDFileFormat(); 52a3f133afe885f9e005dfc0584cb7b3b90f75f665Amith Yamasani 53cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root /// initStdSections - initialize all standard sections. 54cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root void initStdSections(MCLinker& pLinker); 55cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 56cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root /// initObjectFormat - different format, such as ELF and MachO, should 57cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root /// implement this 58cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root virtual void initObjectFormat(MCLinker& pLinker) = 0; 59cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 60cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root /// initObjectType - different types, such as shared object, executable 61cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root /// files, should implement this 62cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root virtual void initObjectType(MCLinker& pLinker) = 0; 63cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 64cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // ----- access functions ----- // 65cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root LDSection& getText() { 66cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root assert(NULL != f_pTextSection); 67cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return *f_pTextSection; 68cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 69cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 70cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root const LDSection& getText() const { 71cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root assert(NULL != f_pTextSection); 72cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return *f_pTextSection; 73cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 74cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 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