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