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