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