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