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