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