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