1/*
2 * Copyright 2011, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ELF_SECTION_HEADER_H
18#define ELF_SECTION_HEADER_H
19
20#include "ELFTypes.h"
21
22#include <llvm/ADT/OwningPtr.h>
23#include <stdint.h>
24
25class ELFSectionHeaderHelperMixin {
26protected:
27  static char const *getSectionTypeStr(uint32_t type);
28};
29
30template <unsigned Bitwidth>
31class ELFSectionHeader_CRTP : private ELFSectionHeaderHelperMixin {
32public:
33  ELF_TYPE_INTRO_TO_TEMPLATE_SCOPE(Bitwidth);
34
35protected:
36  ELFObjectTy const *owner;
37
38  size_t index;
39
40  word_t sh_name;
41  word_t sh_type;
42  addr_t sh_addr;
43  offset_t sh_offset;
44  word_t sh_link;
45  word_t sh_info;
46
47protected:
48  ELFSectionHeader_CRTP() { }
49  ~ELFSectionHeader_CRTP() { }
50
51public:
52  size_t getIndex() const {
53    return index;
54  }
55
56  word_t getNameIndex() const {
57    return sh_name;
58  }
59
60  char const *getName() const;
61
62  word_t getType() const {
63    return sh_type;
64  }
65
66  addr_t getAddress() const {
67    return sh_addr;
68  }
69
70  offset_t getOffset() const {
71    return sh_offset;
72  }
73
74  word_t getLink() const {
75    return sh_link;
76  }
77
78  word_t getExtraInfo() const {
79    return sh_info;
80  }
81
82  bool isValid() const {
83    // FIXME: Should check the correctness of the section header.
84    return true;
85  }
86
87  template <typename Archiver>
88  static ELFSectionHeaderTy *
89  read(Archiver &AR, ELFObjectTy const *owner, size_t index = 0);
90
91  void print(bool shouldPrintHeader = false) const;
92
93private:
94  ELFSectionHeaderTy *concrete() {
95    return static_cast<ELFSectionHeaderTy *>(this);
96  }
97
98  ELFSectionHeaderTy const *concrete() const {
99    return static_cast<ELFSectionHeaderTy const *>(this);
100  }
101};
102
103
104#include "impl/ELFSectionHeader.hxx"
105
106template <>
107class ELFSectionHeader<32> : public ELFSectionHeader_CRTP<32> {
108  friend class ELFSectionHeader_CRTP<32>;
109
110private:
111  word_t sh_flags;
112  word_t sh_size;
113  word_t sh_addralign;
114  word_t sh_entsize;
115
116private:
117  ELFSectionHeader() {
118  }
119
120  template <typename Archiver>
121  bool serialize(Archiver &AR) {
122    AR.prologue(TypeTraits<ELFSectionHeader>::size);
123
124    AR & sh_name;
125    AR & sh_type;
126    AR & sh_flags;
127    AR & sh_addr;
128    AR & sh_offset;
129    AR & sh_size;
130    AR & sh_link;
131    AR & sh_info;
132    AR & sh_addralign;
133    AR & sh_entsize;
134
135    AR.epilogue(TypeTraits<ELFSectionHeader>::size);
136    return AR;
137  }
138
139public:
140  word_t getFlags() const {
141    return sh_flags;
142  }
143
144  word_t getSize() const {
145    return sh_size;
146  }
147
148  word_t getAddressAlign() const {
149    return sh_addralign;
150  }
151
152  word_t getEntrySize() const {
153    return sh_entsize;
154  }
155};
156
157template <>
158class ELFSectionHeader<64> : public ELFSectionHeader_CRTP<64> {
159  friend class ELFSectionHeader_CRTP<64>;
160
161private:
162  xword_t sh_flags;
163  xword_t sh_size;
164  xword_t sh_addralign;
165  xword_t sh_entsize;
166
167private:
168  ELFSectionHeader() {
169  }
170
171  template <typename Archiver>
172  bool serialize(Archiver &AR) {
173    AR.prologue(TypeTraits<ELFSectionHeader>::size);
174
175    AR & sh_name;
176    AR & sh_type;
177    AR & sh_flags;
178    AR & sh_addr;
179    AR & sh_offset;
180    AR & sh_size;
181    AR & sh_link;
182    AR & sh_info;
183    AR & sh_addralign;
184    AR & sh_entsize;
185
186    AR.epilogue(TypeTraits<ELFSectionHeader>::size);
187    return AR;
188  }
189
190public:
191  xword_t getFlags() const {
192    return sh_flags;
193  }
194
195  xword_t getSize() const {
196    return sh_size;
197  }
198
199  xword_t getAddressAlign() const {
200    return sh_addralign;
201  }
202
203  xword_t getEntrySize() const {
204    return sh_entsize;
205  }
206};
207
208#endif // ELF_SECTION_HEADER_H
209