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_SECTION_HEADER_H 18b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#define ELF_SECTION_HEADER_H 19b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 20b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include "ELFTypes.h" 21b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 22b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include <stdint.h> 23b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 24b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesclass ELFSectionHeaderHelperMixin { 25b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprotected: 26b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines static char const *getSectionTypeStr(uint32_t type); 27b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines}; 28b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 29b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> 30b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesclass ELFSectionHeader_CRTP : private ELFSectionHeaderHelperMixin { 31b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinespublic: 32b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELF_TYPE_INTRO_TO_TEMPLATE_SCOPE(Bitwidth); 33b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 34b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprotected: 35b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFObjectTy const *owner; 36b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 37b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines size_t index; 38b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 39b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines word_t sh_name; 40b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines word_t sh_type; 41b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines addr_t sh_addr; 42b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines offset_t sh_offset; 43b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines word_t sh_link; 44b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines word_t sh_info; 45b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 46b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprotected: 47b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFSectionHeader_CRTP() { } 48b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ~ELFSectionHeader_CRTP() { } 49b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 50b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinespublic: 51b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines size_t getIndex() const { 52b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return index; 53b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 54b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 55b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines word_t getNameIndex() const { 56b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return sh_name; 57b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 58b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 59b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines char const *getName() const; 60b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 61b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines word_t getType() const { 62b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return sh_type; 63b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 64b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 65b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines addr_t getAddress() const { 66b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return sh_addr; 67b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 68b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 69b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines offset_t getOffset() const { 70b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return sh_offset; 71b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 72b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 73b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines word_t getLink() const { 74b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return sh_link; 75b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 76b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 77b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines word_t getExtraInfo() const { 78b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return sh_info; 79b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 80b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 81b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines bool isValid() const { 82b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines // FIXME: Should check the correctness of the section header. 83b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return true; 84b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 85b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 86b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines template <typename Archiver> 87b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines static ELFSectionHeaderTy * 88b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines read(Archiver &AR, ELFObjectTy const *owner, size_t index = 0); 89b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 90b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines void print(bool shouldPrintHeader = false) const; 91b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 92b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprivate: 93b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFSectionHeaderTy *concrete() { 94b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return static_cast<ELFSectionHeaderTy *>(this); 95b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 96b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 97b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFSectionHeaderTy const *concrete() const { 98b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return static_cast<ELFSectionHeaderTy const *>(this); 99b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 100b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines}; 101b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 102b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 103b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include "impl/ELFSectionHeader.hxx" 104b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 105b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <> 106b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesclass ELFSectionHeader<32> : public ELFSectionHeader_CRTP<32> { 107b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines friend class ELFSectionHeader_CRTP<32>; 108b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 109b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprivate: 110b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines word_t sh_flags; 111b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines word_t sh_size; 112b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines word_t sh_addralign; 113b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines word_t sh_entsize; 114b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 115b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprivate: 116b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFSectionHeader() { 117b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 118b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 119b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines template <typename Archiver> 120b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines bool serialize(Archiver &AR) { 121b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR.prologue(TypeTraits<ELFSectionHeader>::size); 122b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 123b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_name; 124b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_type; 125b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_flags; 126b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_addr; 127b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_offset; 128b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_size; 129b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_link; 130b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_info; 131b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_addralign; 132b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_entsize; 133b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 134b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR.epilogue(TypeTraits<ELFSectionHeader>::size); 135b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return AR; 136b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 137b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 138b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinespublic: 139b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines word_t getFlags() const { 140b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return sh_flags; 141b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 142b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 143b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines word_t getSize() const { 144b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return sh_size; 145b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 146b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 147b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines word_t getAddressAlign() const { 148b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return sh_addralign; 149b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 150b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 151b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines word_t getEntrySize() const { 152b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return sh_entsize; 153b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 154b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines}; 155b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 156b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <> 157b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesclass ELFSectionHeader<64> : public ELFSectionHeader_CRTP<64> { 158b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines friend class ELFSectionHeader_CRTP<64>; 159b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 160b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprivate: 161b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines xword_t sh_flags; 162b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines xword_t sh_size; 163b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines xword_t sh_addralign; 164b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines xword_t sh_entsize; 165b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 166b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprivate: 167b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFSectionHeader() { 168b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 169b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 170b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines template <typename Archiver> 171b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines bool serialize(Archiver &AR) { 172b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR.prologue(TypeTraits<ELFSectionHeader>::size); 173b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 174b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_name; 175b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_type; 176b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_flags; 177b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_addr; 178b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_offset; 179b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_size; 180b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_link; 181b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_info; 182b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_addralign; 183b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR & sh_entsize; 184b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 185b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines AR.epilogue(TypeTraits<ELFSectionHeader>::size); 186b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return AR; 187b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 188b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 189b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinespublic: 190b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines xword_t getFlags() const { 191b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return sh_flags; 192b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 193b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 194b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines xword_t getSize() const { 195b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return sh_size; 196b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 197b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 198b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines xword_t getAddressAlign() const { 199b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return sh_addralign; 200b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 201b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 202b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines xword_t getEntrySize() const { 203b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return sh_entsize; 204b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 205b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines}; 206b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 207b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#endif // ELF_SECTION_HEADER_H 208