• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
25 class ELFSectionHeaderHelperMixin {
26 protected:
27   static char const *getSectionTypeStr(uint32_t type);
28 };
29 
30 template <unsigned Bitwidth>
31 class ELFSectionHeader_CRTP : private ELFSectionHeaderHelperMixin {
32 public:
33   ELF_TYPE_INTRO_TO_TEMPLATE_SCOPE(Bitwidth);
34 
35 protected:
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 
47 protected:
ELFSectionHeader_CRTP()48   ELFSectionHeader_CRTP() { }
~ELFSectionHeader_CRTP()49   ~ELFSectionHeader_CRTP() { }
50 
51 public:
getIndex()52   size_t getIndex() const {
53     return index;
54   }
55 
getNameIndex()56   word_t getNameIndex() const {
57     return sh_name;
58   }
59 
60   char const *getName() const;
61 
getType()62   word_t getType() const {
63     return sh_type;
64   }
65 
getAddress()66   addr_t getAddress() const {
67     return sh_addr;
68   }
69 
getOffset()70   offset_t getOffset() const {
71     return sh_offset;
72   }
73 
getLink()74   word_t getLink() const {
75     return sh_link;
76   }
77 
getExtraInfo()78   word_t getExtraInfo() const {
79     return sh_info;
80   }
81 
isValid()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 
93 private:
concrete()94   ELFSectionHeaderTy *concrete() {
95     return static_cast<ELFSectionHeaderTy *>(this);
96   }
97 
concrete()98   ELFSectionHeaderTy const *concrete() const {
99     return static_cast<ELFSectionHeaderTy const *>(this);
100   }
101 };
102 
103 
104 #include "impl/ELFSectionHeader.hxx"
105 
106 template <>
107 class ELFSectionHeader<32> : public ELFSectionHeader_CRTP<32> {
108   friend class ELFSectionHeader_CRTP<32>;
109 
110 private:
111   word_t sh_flags;
112   word_t sh_size;
113   word_t sh_addralign;
114   word_t sh_entsize;
115 
116 private:
ELFSectionHeader()117   ELFSectionHeader() {
118   }
119 
120   template <typename Archiver>
serialize(Archiver & AR)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 
139 public:
getFlags()140   word_t getFlags() const {
141     return sh_flags;
142   }
143 
getSize()144   word_t getSize() const {
145     return sh_size;
146   }
147 
getAddressAlign()148   word_t getAddressAlign() const {
149     return sh_addralign;
150   }
151 
getEntrySize()152   word_t getEntrySize() const {
153     return sh_entsize;
154   }
155 };
156 
157 template <>
158 class ELFSectionHeader<64> : public ELFSectionHeader_CRTP<64> {
159   friend class ELFSectionHeader_CRTP<64>;
160 
161 private:
162   xword_t sh_flags;
163   xword_t sh_size;
164   xword_t sh_addralign;
165   xword_t sh_entsize;
166 
167 private:
ELFSectionHeader()168   ELFSectionHeader() {
169   }
170 
171   template <typename Archiver>
serialize(Archiver & AR)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 
190 public:
getFlags()191   xword_t getFlags() const {
192     return sh_flags;
193   }
194 
getSize()195   xword_t getSize() const {
196     return sh_size;
197   }
198 
getAddressAlign()199   xword_t getAddressAlign() const {
200     return sh_addralign;
201   }
202 
getEntrySize()203   xword_t getEntrySize() const {
204     return sh_entsize;
205   }
206 };
207 
208 #endif // ELF_SECTION_HEADER_H
209