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