• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
18 namespace mcld
19 {
20 
21 class MCLinker;
22 class LDSection;
23 
24 /** \class LDFileFormat
25  *  \brief LDFileFormat describes the common file formats.
26  */
27 class LDFileFormat
28 {
29 public:
30   enum Kind {
31     Null,
32     Regular,
33     BSS,
34     NamePool,
35     Relocation,
36     Debug,
37     Target,
38     Exception,
39     Version,
40     Note,
41     MetaData,
42     Group,
43   };
44 
45 protected:
46   LDFileFormat();
47 
48 public:
49   virtual ~LDFileFormat();
50 
51   /// initStdSections - initialize all standard sections.
52   void initStdSections(MCLinker& pLinker);
53 
54   /// initObjectFormat - different format, such as ELF and MachO, should
55   /// implement this
56   virtual void initObjectFormat(MCLinker& pLinker) = 0;
57 
58   /// initObjectType - different types, such as shared object, executable
59   /// files, should implement this
60   virtual void initObjectType(MCLinker& pLinker) = 0;
61 
62   // -----  access functions  ----- //
getText()63   LDSection& getText() {
64     assert(NULL != f_pTextSection);
65     return *f_pTextSection;
66   }
67 
getText()68   const LDSection& getText() const {
69     assert(NULL != f_pTextSection);
70     return *f_pTextSection;
71   }
72 
getData()73   LDSection& getData() {
74     assert(NULL != f_pDataSection);
75     return *f_pDataSection;
76   }
77 
getData()78   const LDSection& getData() const {
79     assert(NULL != f_pDataSection);
80     return *f_pDataSection;
81   }
82 
getBSS()83   LDSection& getBSS() {
84     assert(NULL != f_pBSSSection);
85     return *f_pBSSSection;
86   }
87 
getBSS()88   const LDSection& getBSS() const {
89     assert(NULL != f_pBSSSection);
90     return *f_pBSSSection;
91   }
92 
getReadOnly()93   LDSection& getReadOnly() {
94     assert(NULL != f_pReadOnlySection);
95     return *f_pReadOnlySection;
96   }
97 
getReadOnly()98   const LDSection& getReadOnly() const {
99     assert(NULL != f_pReadOnlySection);
100     return *f_pReadOnlySection;
101   }
102 protected:
103   //         variable name         :  ELF               MachO
104   LDSection* f_pTextSection;       // .text             __text
105   LDSection* f_pDataSection;       // .data             __data
106   LDSection* f_pBSSSection;        // .bss              __bss
107   LDSection* f_pReadOnlySection;   // .rodata           __const
108 };
109 
110 } // namespace of mcld
111 
112 #endif
113