ELFHeader.h revision d282991c78d1fd79a222c5f114e623da255ba8a0
1b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines/*
2b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * Copyright 2011, The Android Open Source Project
3b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines *
4b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
5b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * you may not use this file except in compliance with the License.
6b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * You may obtain a copy of the License at
7b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines *
8b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines *     http://www.apache.org/licenses/LICENSE-2.0
9b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines *
10b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * Unless required by applicable law or agreed to in writing, software
11b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
12b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * See the License for the specific language governing permissions and
14b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * limitations under the License.
15b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines */
16b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
17b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#ifndef ELF_HEADER_H
18b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#define ELF_HEADER_H
19b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
20b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include "ELFTypes.h"
21b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include "ELF.h"
22b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
23b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include <string.h>
24b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
25b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesclass ELFHeaderHelperMixin {
26b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprotected:
27b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  static char const *getClassStr(int clazz);
28b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  static char const *getEndiannessStr(int endianness);
29b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  static char const *getOSABIStr(int abi);
30b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  static char const *getObjectTypeStr(uint16_t type);
31b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  static char const *getMachineStr(uint16_t machine);
32b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  static char const *getVersionStr(uint32_t version);
33b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines};
34b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
35b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth>
36b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesclass ELFHeader : private ELFHeaderHelperMixin {
37b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinespublic:
38b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELF_TYPE_INTRO_TO_TEMPLATE_SCOPE(Bitwidth);
39b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
40b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprotected:
41b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  byte_t   e_ident[EI_NIDENT];
42b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  half_t   e_type;
43b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  half_t   e_machine;
44b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t   e_version;
45b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  addr_t   e_entry;
46b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  offset_t e_phoff;
47b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  offset_t e_shoff;
48b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t   e_flags;
49b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  half_t   e_ehsize;
50b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  half_t   e_phentsize;
51b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  half_t   e_phnum;
52b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  half_t   e_shentsize;
53b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  half_t   e_shnum;
54b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  half_t   e_shstrndx;
55b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
56b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprotected:
57b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELFHeader() { }
58b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
59b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinespublic:
60b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  byte_t getClass() const {
61b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_ident[EI_CLASS];
62b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
63b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
64b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  byte_t getEndianness() const {
65b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_ident[EI_DATA];
66b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
67b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
68b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  byte_t getVersionFromIdent() const {
69b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_ident[EI_VERSION];
70b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
71b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
72b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  byte_t getOSABI() const {
73b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_ident[EI_OSABI];
74b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
75b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
76b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  byte_t getABIVersion() const {
77b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_ident[EI_ABIVERSION];
78b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
79b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
80b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  bool is32bit() const {
81b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_ident[EI_CLASS] == ELFCLASS32;
82b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
83b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
84b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  bool is64bit() const {
85b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_ident[EI_CLASS] == ELFCLASS64;
86b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
87b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
88b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  bool isBigEndian() const {
89b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_ident[EI_DATA] == ELFDATA2MSB;
90b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
91b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
92b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  bool isLittleEndian() const {
93b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_ident[EI_DATA] == ELFDATA2LSB;
94b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
95b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
96b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  half_t getObjectType() const {
97b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_type;
98b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
99b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
100b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  half_t getMachine() const {
101b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_machine;
102b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
103b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
104b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t getVersion() const {
105b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_version;
106b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
107b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
108b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  addr_t getEntryAddress() const {
109b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_entry;
110b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
111b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
112b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  offset_t getProgramHeaderTableOffset() const {
113b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_phoff;
114b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
115b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
116b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  offset_t getSectionHeaderTableOffset() const {
117b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_shoff;
118b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
119b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
120b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t getFlags() const {
121b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_flags;
122b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
123b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
124b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  half_t getELFHeaderSize() const {
125b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_ehsize;
126b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
127b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
128b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  half_t getProgramHeaderEntrySize() const {
129b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_phentsize;
130b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
131b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
132b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  half_t getProgramHeaderNum() const {
133b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_phnum;
134b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
135b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
136b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  half_t getSectionHeaderEntrySize() const {
137b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_shentsize;
138b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
139b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
140b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  half_t getSectionHeaderNum() const {
141b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_shnum;
142b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
143b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
144b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  half_t getStringSectionIndex() const {
145b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return e_shstrndx;
146b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
147b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
148b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  template <typename Archiver>
149b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  static ELFHeader *read(Archiver &AR) {
150b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    if (!AR) {
151b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines      // Archiver is in bad state before calling read function.
152b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines      // Return NULL and do nothing.
153b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines      return 0;
154b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    }
155b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
156d282991c78d1fd79a222c5f114e623da255ba8a0Stephen Hines    std::unique_ptr<ELFHeader> header(new ELFHeader());
157b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    if (!header->serialize(AR)) {
158b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines      // Unable to read the structure.  Return NULL.
159b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines      return 0;
160b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    }
161b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
162b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    if (!header->isValid()) {
163b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines      // Header read from archiver is not valid.  Return NULL.
164b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines      return 0;
165b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    }
166b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
167d282991c78d1fd79a222c5f114e623da255ba8a0Stephen Hines    return header.release();
168b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
169b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
170b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  void print();
171b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
172b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  bool isValid() const {
173b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return (isValidELFIdent() && isCompatibleHeaderSize());
174b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
175b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
176b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprivate:
177b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  template <typename Archiver>
178b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  bool serialize(Archiver &AR) {
179b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR.prologue(TypeTraits<ELFHeaderTy>::size);
180b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
181b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & e_ident;
182b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & e_type;
183b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & e_machine;
184b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & e_version;
185b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & e_entry;
186b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & e_phoff;
187b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & e_shoff;
188b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & e_flags;
189b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & e_ehsize;
190b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & e_phentsize;
191b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & e_phnum;
192b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & e_shentsize;
193b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & e_shnum;
194b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & e_shstrndx;
195b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
196b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR.epilogue(TypeTraits<ELFHeaderTy>::size);
197b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return AR;
198b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
199b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
200b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  bool isValidMagicWord() const {
201b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return (memcmp(e_ident, "\x7f" "ELF", 4) == 0);
202b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
203b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
204b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  bool isValidClass() const {
205b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return ((Bitwidth == 32 && is32bit()) ||
206b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines            (Bitwidth == 64 && is64bit()));
207b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
208b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
209b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  bool isValidEndianness() const {
210b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return (isBigEndian() || isLittleEndian());
211b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
212b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
213b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  bool isValidHeaderVersion() const {
214b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return (getVersion() == EV_CURRENT);
215b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
216b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
217b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  bool isUnusedZeroedPadding() const {
218b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    for (size_t i = EI_PAD; i < EI_NIDENT; ++i) {
219b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines      if (e_ident[i] != 0) {
220b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines        return false;
221b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines      }
222b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    }
223b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return true;
224b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
225b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
226b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  bool isValidELFIdent() const {
227b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return (isValidMagicWord() &&
228b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines            isValidClass() &&
229b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines            isValidEndianness() &&
230b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines            isValidHeaderVersion() &&
231b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines            isUnusedZeroedPadding());
232b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
233b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
234b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  bool isCompatibleHeaderSize() const {
235b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return (
236b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines      (e_ehsize == TypeTraits<ELFHeaderTy>::size) &&
237b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines      (e_phnum == 0 || e_phentsize == TypeTraits<ELFProgramHeaderTy>::size) &&
238b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines      (e_shnum == 0 || e_shentsize == TypeTraits<ELFSectionHeaderTy>::size));
239b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
240b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines};
241b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
242b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include "impl/ELFHeader.hxx"
243b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
244b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#endif // ELF_HEADER_H
245