1e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao/* 2e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * Copyright 2011, The Android Open Source Project 3e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * 4e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License"); 5e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * you may not use this file except in compliance with the License. 6e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * You may obtain a copy of the License at 7e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * 8e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * http://www.apache.org/licenses/LICENSE-2.0 9e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * 10e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * Unless required by applicable law or agreed to in writing, software 11e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS, 12e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * See the License for the specific language governing permissions and 14e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * limitations under the License. 15e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao */ 16e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao 1761dfca9e892597db79889addb7a3abf54cd50588Logan Chien#ifndef ELF_SECTION_HEADER_H 1861dfca9e892597db79889addb7a3abf54cd50588Logan Chien#define ELF_SECTION_HEADER_H 1961dfca9e892597db79889addb7a3abf54cd50588Logan Chien 2061dfca9e892597db79889addb7a3abf54cd50588Logan Chien#include "ELFTypes.h" 2161dfca9e892597db79889addb7a3abf54cd50588Logan Chien 221f100419d794fa433336190aa47bb0862f93f978TDYa#include <llvm/ADT/OwningPtr.h> 2361dfca9e892597db79889addb7a3abf54cd50588Logan Chien#include <stdint.h> 2461dfca9e892597db79889addb7a3abf54cd50588Logan Chien 2561dfca9e892597db79889addb7a3abf54cd50588Logan Chienclass ELFSectionHeaderHelperMixin { 2661dfca9e892597db79889addb7a3abf54cd50588Logan Chienprotected: 2761dfca9e892597db79889addb7a3abf54cd50588Logan Chien static char const *getSectionTypeStr(uint32_t type); 2861dfca9e892597db79889addb7a3abf54cd50588Logan Chien}; 2961dfca9e892597db79889addb7a3abf54cd50588Logan Chien 30a9ab5889e842a49ff16d06594efe96b0210fe1f7Logan Chientemplate <unsigned Bitwidth> 3161dfca9e892597db79889addb7a3abf54cd50588Logan Chienclass ELFSectionHeader_CRTP : private ELFSectionHeaderHelperMixin { 3261dfca9e892597db79889addb7a3abf54cd50588Logan Chienpublic: 3361dfca9e892597db79889addb7a3abf54cd50588Logan Chien ELF_TYPE_INTRO_TO_TEMPLATE_SCOPE(Bitwidth); 3461dfca9e892597db79889addb7a3abf54cd50588Logan Chien 3561dfca9e892597db79889addb7a3abf54cd50588Logan Chienprotected: 3658611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien ELFObjectTy const *owner; 3755b5e7c242e599b88f5727352758808461483000Logan Chien 381e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa size_t index; 3961dfca9e892597db79889addb7a3abf54cd50588Logan Chien 4061dfca9e892597db79889addb7a3abf54cd50588Logan Chien word_t sh_name; 4161dfca9e892597db79889addb7a3abf54cd50588Logan Chien word_t sh_type; 4261dfca9e892597db79889addb7a3abf54cd50588Logan Chien addr_t sh_addr; 4361dfca9e892597db79889addb7a3abf54cd50588Logan Chien offset_t sh_offset; 4461dfca9e892597db79889addb7a3abf54cd50588Logan Chien word_t sh_link; 4561dfca9e892597db79889addb7a3abf54cd50588Logan Chien word_t sh_info; 4661dfca9e892597db79889addb7a3abf54cd50588Logan Chien 4761dfca9e892597db79889addb7a3abf54cd50588Logan Chienprotected: 4861dfca9e892597db79889addb7a3abf54cd50588Logan Chien ELFSectionHeader_CRTP() { } 4961dfca9e892597db79889addb7a3abf54cd50588Logan Chien ~ELFSectionHeader_CRTP() { } 5061dfca9e892597db79889addb7a3abf54cd50588Logan Chien 5161dfca9e892597db79889addb7a3abf54cd50588Logan Chienpublic: 521e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa size_t getIndex() const { 53155058b23a2df32644f493d0a28817047e222a50TDYa return index; 54155058b23a2df32644f493d0a28817047e222a50TDYa } 55155058b23a2df32644f493d0a28817047e222a50TDYa 5661dfca9e892597db79889addb7a3abf54cd50588Logan Chien word_t getNameIndex() const { 5761dfca9e892597db79889addb7a3abf54cd50588Logan Chien return sh_name; 5861dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 5961dfca9e892597db79889addb7a3abf54cd50588Logan Chien 60efae30af6a2d9deedf961942e4834163f686871cLogan Chien char const *getName() const; 6155b5e7c242e599b88f5727352758808461483000Logan Chien 6261dfca9e892597db79889addb7a3abf54cd50588Logan Chien word_t getType() const { 6361dfca9e892597db79889addb7a3abf54cd50588Logan Chien return sh_type; 6461dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 6561dfca9e892597db79889addb7a3abf54cd50588Logan Chien 6661dfca9e892597db79889addb7a3abf54cd50588Logan Chien addr_t getAddress() const { 6761dfca9e892597db79889addb7a3abf54cd50588Logan Chien return sh_addr; 6861dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 6961dfca9e892597db79889addb7a3abf54cd50588Logan Chien 7061dfca9e892597db79889addb7a3abf54cd50588Logan Chien offset_t getOffset() const { 7161dfca9e892597db79889addb7a3abf54cd50588Logan Chien return sh_offset; 7261dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 7361dfca9e892597db79889addb7a3abf54cd50588Logan Chien 7461dfca9e892597db79889addb7a3abf54cd50588Logan Chien word_t getLink() const { 7561dfca9e892597db79889addb7a3abf54cd50588Logan Chien return sh_link; 7661dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 7761dfca9e892597db79889addb7a3abf54cd50588Logan Chien 7861dfca9e892597db79889addb7a3abf54cd50588Logan Chien word_t getExtraInfo() const { 7961dfca9e892597db79889addb7a3abf54cd50588Logan Chien return sh_info; 8061dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 8161dfca9e892597db79889addb7a3abf54cd50588Logan Chien 8261dfca9e892597db79889addb7a3abf54cd50588Logan Chien bool isValid() const { 8361dfca9e892597db79889addb7a3abf54cd50588Logan Chien // FIXME: Should check the correctness of the section header. 8461dfca9e892597db79889addb7a3abf54cd50588Logan Chien return true; 8561dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 8661dfca9e892597db79889addb7a3abf54cd50588Logan Chien 8761dfca9e892597db79889addb7a3abf54cd50588Logan Chien template <typename Archiver> 8858611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien static ELFSectionHeaderTy * 8958611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien read(Archiver &AR, ELFObjectTy const *owner, size_t index = 0); 9061dfca9e892597db79889addb7a3abf54cd50588Logan Chien 91efae30af6a2d9deedf961942e4834163f686871cLogan Chien void print(bool shouldPrintHeader = false) const; 9261dfca9e892597db79889addb7a3abf54cd50588Logan Chien 9361dfca9e892597db79889addb7a3abf54cd50588Logan Chienprivate: 9458611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien ELFSectionHeaderTy *concrete() { 9558611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien return static_cast<ELFSectionHeaderTy *>(this); 9661dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 9761dfca9e892597db79889addb7a3abf54cd50588Logan Chien 9858611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien ELFSectionHeaderTy const *concrete() const { 9958611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien return static_cast<ELFSectionHeaderTy const *>(this); 10061dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 10161dfca9e892597db79889addb7a3abf54cd50588Logan Chien}; 10261dfca9e892597db79889addb7a3abf54cd50588Logan Chien 10361dfca9e892597db79889addb7a3abf54cd50588Logan Chien 104efae30af6a2d9deedf961942e4834163f686871cLogan Chien#include "impl/ELFSectionHeader.hxx" 105efae30af6a2d9deedf961942e4834163f686871cLogan Chien 10661dfca9e892597db79889addb7a3abf54cd50588Logan Chientemplate <> 10761dfca9e892597db79889addb7a3abf54cd50588Logan Chienclass ELFSectionHeader<32> : public ELFSectionHeader_CRTP<32> { 10861dfca9e892597db79889addb7a3abf54cd50588Logan Chien friend class ELFSectionHeader_CRTP<32>; 10961dfca9e892597db79889addb7a3abf54cd50588Logan Chien 11061dfca9e892597db79889addb7a3abf54cd50588Logan Chienprivate: 11161dfca9e892597db79889addb7a3abf54cd50588Logan Chien word_t sh_flags; 11261dfca9e892597db79889addb7a3abf54cd50588Logan Chien word_t sh_size; 11361dfca9e892597db79889addb7a3abf54cd50588Logan Chien word_t sh_addralign; 11461dfca9e892597db79889addb7a3abf54cd50588Logan Chien word_t sh_entsize; 11561dfca9e892597db79889addb7a3abf54cd50588Logan Chien 11661dfca9e892597db79889addb7a3abf54cd50588Logan Chienprivate: 11761dfca9e892597db79889addb7a3abf54cd50588Logan Chien ELFSectionHeader() { 11861dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 11961dfca9e892597db79889addb7a3abf54cd50588Logan Chien 12061dfca9e892597db79889addb7a3abf54cd50588Logan Chien template <typename Archiver> 12161dfca9e892597db79889addb7a3abf54cd50588Logan Chien bool serialize(Archiver &AR) { 12261dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR.prologue(TypeTraits<ELFSectionHeader>::size); 12361dfca9e892597db79889addb7a3abf54cd50588Logan Chien 12461dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_name; 12561dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_type; 12661dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_flags; 12761dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_addr; 12861dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_offset; 12961dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_size; 13061dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_link; 13161dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_info; 13261dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_addralign; 13361dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_entsize; 13461dfca9e892597db79889addb7a3abf54cd50588Logan Chien 13561dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR.epilogue(TypeTraits<ELFSectionHeader>::size); 13661dfca9e892597db79889addb7a3abf54cd50588Logan Chien return AR; 13761dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 13861dfca9e892597db79889addb7a3abf54cd50588Logan Chien 13961dfca9e892597db79889addb7a3abf54cd50588Logan Chienpublic: 14061dfca9e892597db79889addb7a3abf54cd50588Logan Chien word_t getFlags() const { 14161dfca9e892597db79889addb7a3abf54cd50588Logan Chien return sh_flags; 14261dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 14361dfca9e892597db79889addb7a3abf54cd50588Logan Chien 14461dfca9e892597db79889addb7a3abf54cd50588Logan Chien word_t getSize() const { 14561dfca9e892597db79889addb7a3abf54cd50588Logan Chien return sh_size; 14661dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 14761dfca9e892597db79889addb7a3abf54cd50588Logan Chien 14861dfca9e892597db79889addb7a3abf54cd50588Logan Chien word_t getAddressAlign() const { 14961dfca9e892597db79889addb7a3abf54cd50588Logan Chien return sh_addralign; 15061dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 15161dfca9e892597db79889addb7a3abf54cd50588Logan Chien 15261dfca9e892597db79889addb7a3abf54cd50588Logan Chien word_t getEntrySize() const { 15361dfca9e892597db79889addb7a3abf54cd50588Logan Chien return sh_entsize; 15461dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 15561dfca9e892597db79889addb7a3abf54cd50588Logan Chien}; 15661dfca9e892597db79889addb7a3abf54cd50588Logan Chien 15761dfca9e892597db79889addb7a3abf54cd50588Logan Chientemplate <> 15861dfca9e892597db79889addb7a3abf54cd50588Logan Chienclass ELFSectionHeader<64> : public ELFSectionHeader_CRTP<64> { 15961dfca9e892597db79889addb7a3abf54cd50588Logan Chien friend class ELFSectionHeader_CRTP<64>; 16061dfca9e892597db79889addb7a3abf54cd50588Logan Chien 16161dfca9e892597db79889addb7a3abf54cd50588Logan Chienprivate: 16261dfca9e892597db79889addb7a3abf54cd50588Logan Chien xword_t sh_flags; 16361dfca9e892597db79889addb7a3abf54cd50588Logan Chien xword_t sh_size; 16461dfca9e892597db79889addb7a3abf54cd50588Logan Chien xword_t sh_addralign; 16561dfca9e892597db79889addb7a3abf54cd50588Logan Chien xword_t sh_entsize; 16661dfca9e892597db79889addb7a3abf54cd50588Logan Chien 16761dfca9e892597db79889addb7a3abf54cd50588Logan Chienprivate: 16861dfca9e892597db79889addb7a3abf54cd50588Logan Chien ELFSectionHeader() { 16961dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 17061dfca9e892597db79889addb7a3abf54cd50588Logan Chien 17161dfca9e892597db79889addb7a3abf54cd50588Logan Chien template <typename Archiver> 17261dfca9e892597db79889addb7a3abf54cd50588Logan Chien bool serialize(Archiver &AR) { 17361dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR.prologue(TypeTraits<ELFSectionHeader>::size); 17461dfca9e892597db79889addb7a3abf54cd50588Logan Chien 17561dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_name; 17661dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_type; 17761dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_flags; 17861dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_addr; 17961dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_offset; 18061dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_size; 18161dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_link; 18261dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_info; 18361dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_addralign; 18461dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR & sh_entsize; 18561dfca9e892597db79889addb7a3abf54cd50588Logan Chien 18661dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR.epilogue(TypeTraits<ELFSectionHeader>::size); 18761dfca9e892597db79889addb7a3abf54cd50588Logan Chien return AR; 18861dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 18961dfca9e892597db79889addb7a3abf54cd50588Logan Chien 19061dfca9e892597db79889addb7a3abf54cd50588Logan Chienpublic: 19161dfca9e892597db79889addb7a3abf54cd50588Logan Chien xword_t getFlags() const { 19261dfca9e892597db79889addb7a3abf54cd50588Logan Chien return sh_flags; 19361dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 19461dfca9e892597db79889addb7a3abf54cd50588Logan Chien 19561dfca9e892597db79889addb7a3abf54cd50588Logan Chien xword_t getSize() const { 19661dfca9e892597db79889addb7a3abf54cd50588Logan Chien return sh_size; 19761dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 19861dfca9e892597db79889addb7a3abf54cd50588Logan Chien 19961dfca9e892597db79889addb7a3abf54cd50588Logan Chien xword_t getAddressAlign() const { 20061dfca9e892597db79889addb7a3abf54cd50588Logan Chien return sh_addralign; 20161dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 20261dfca9e892597db79889addb7a3abf54cd50588Logan Chien 20361dfca9e892597db79889addb7a3abf54cd50588Logan Chien xword_t getEntrySize() const { 20461dfca9e892597db79889addb7a3abf54cd50588Logan Chien return sh_entsize; 20561dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 20661dfca9e892597db79889addb7a3abf54cd50588Logan Chien}; 20761dfca9e892597db79889addb7a3abf54cd50588Logan Chien 20861dfca9e892597db79889addb7a3abf54cd50588Logan Chien#endif // ELF_SECTION_HEADER_H 209