ELFSectionHeaderTable.h revision 921465005aca46a100d137c9608a0aedd846e290
161dfca9e892597db79889addb7a3abf54cd50588Logan Chien#ifndef ELF_SECTION_HEADER_TABLE_H 261dfca9e892597db79889addb7a3abf54cd50588Logan Chien#define ELF_SECTION_HEADER_TABLE_H 361dfca9e892597db79889addb7a3abf54cd50588Logan Chien 45b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYa#include "ELFSectionHeader.h" 55b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYa#include "ELFSectionTable_CRTP.h" 65b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYa 71f100419d794fa433336190aa47bb0862f93f978TDYa#include <llvm/ADT/OwningPtr.h> 8921465005aca46a100d137c9608a0aedd846e290Logan Chien 961dfca9e892597db79889addb7a3abf54cd50588Logan Chien#include <vector> 10541763d9f2395cf4170d6f8fad0b58098f35c70cTDYa#include <string> 1161dfca9e892597db79889addb7a3abf54cd50588Logan Chien 1261dfca9e892597db79889addb7a3abf54cd50588Logan Chien#include <assert.h> 1361dfca9e892597db79889addb7a3abf54cd50588Logan Chien 1461dfca9e892597db79889addb7a3abf54cd50588Logan Chientemplate <size_t Bitwidth> class ELFObject; 1561dfca9e892597db79889addb7a3abf54cd50588Logan Chien 1661dfca9e892597db79889addb7a3abf54cd50588Logan Chientemplate <size_t Bitwidth> 175b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYaclass ELFSectionHeaderTable : 185b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYa public ELFSectionTable_CRTP<Bitwidth, 195b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYa ELFSectionHeaderTable<Bitwidth>, 205b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYa ELFSectionHeader<Bitwidth> > { 215b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYa friend class ELFSectionTable_CRTP<Bitwidth, 225b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYa ELFSectionHeaderTable<Bitwidth>, 235b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYa ELFSectionHeader<Bitwidth> >; 2461dfca9e892597db79889addb7a3abf54cd50588Logan Chienprivate: 25d3bebd86ee3e1e3d637bbc909968e53bf5153897TDYa static char const *TABLE_NAME; 26d3bebd86ee3e1e3d637bbc909968e53bf5153897TDYa 275b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYaprivate: 281f100419d794fa433336190aa47bb0862f93f978TDYa //std::vector<ELFSectionHeader<Bitwidth> *> table; 2961dfca9e892597db79889addb7a3abf54cd50588Logan Chien 3061dfca9e892597db79889addb7a3abf54cd50588Logan Chienprivate: 3161dfca9e892597db79889addb7a3abf54cd50588Logan Chien ELFSectionHeaderTable() { 3261dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 3361dfca9e892597db79889addb7a3abf54cd50588Logan Chien 3461dfca9e892597db79889addb7a3abf54cd50588Logan Chienpublic: 3561dfca9e892597db79889addb7a3abf54cd50588Logan Chien template <typename Archiver> 361f100419d794fa433336190aa47bb0862f93f978TDYa static ELFSectionHeaderTable<Bitwidth> * 3761dfca9e892597db79889addb7a3abf54cd50588Logan Chien read(Archiver &AR, ELFObject<Bitwidth> *owner); 3861dfca9e892597db79889addb7a3abf54cd50588Logan Chien 395b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYa //ELFSectionHeader<Bitwidth> const *operator[](size_t i) const; 405b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYa //ELFSectionHeader<Bitwidth> *operator[](size_t i); 41af521b05a143c96604dbb7488e155c5248e34462Logan Chien 425b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYa ELFSectionHeader<Bitwidth> const *getByName(const std::string &str) const; 435b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYa ELFSectionHeader<Bitwidth> *getByName(const std::string &str); 44541763d9f2395cf4170d6f8fad0b58098f35c70cTDYa 455b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYa //virtual void print() const; 4661dfca9e892597db79889addb7a3abf54cd50588Logan Chien}; 4761dfca9e892597db79889addb7a3abf54cd50588Logan Chien 48af521b05a143c96604dbb7488e155c5248e34462Logan Chien 4961dfca9e892597db79889addb7a3abf54cd50588Logan Chien#include "ELFObject.h" 5061dfca9e892597db79889addb7a3abf54cd50588Logan Chien#include "ELFHeader.h" 5161dfca9e892597db79889addb7a3abf54cd50588Logan Chien 5261dfca9e892597db79889addb7a3abf54cd50588Logan Chientemplate <size_t Bitwidth> 5361dfca9e892597db79889addb7a3abf54cd50588Logan Chientemplate <typename Archiver> 541f100419d794fa433336190aa47bb0862f93f978TDYainline ELFSectionHeaderTable<Bitwidth> * 5561dfca9e892597db79889addb7a3abf54cd50588Logan ChienELFSectionHeaderTable<Bitwidth>::read(Archiver &AR, 5661dfca9e892597db79889addb7a3abf54cd50588Logan Chien ELFObject<Bitwidth> *owner) { 5761dfca9e892597db79889addb7a3abf54cd50588Logan Chien if (!AR) { 5861dfca9e892597db79889addb7a3abf54cd50588Logan Chien // Archiver is in bad state before calling read function. 5961dfca9e892597db79889addb7a3abf54cd50588Logan Chien // Return NULL and do nothing. 601f100419d794fa433336190aa47bb0862f93f978TDYa return 0; 6161dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 6261dfca9e892597db79889addb7a3abf54cd50588Logan Chien 6361dfca9e892597db79889addb7a3abf54cd50588Logan Chien // Allocate a new section header table and assign the owner. 641f100419d794fa433336190aa47bb0862f93f978TDYa llvm::OwningPtr<ELFSectionHeaderTable> tab(new ELFSectionHeaderTable()); 6561dfca9e892597db79889addb7a3abf54cd50588Logan Chien 6661dfca9e892597db79889addb7a3abf54cd50588Logan Chien // Get ELF header 6761dfca9e892597db79889addb7a3abf54cd50588Logan Chien ELFHeader<Bitwidth> const *header = owner->getHeader(); 6861dfca9e892597db79889addb7a3abf54cd50588Logan Chien 6961dfca9e892597db79889addb7a3abf54cd50588Logan Chien assert(header->getSectionHeaderEntrySize() >= 7061dfca9e892597db79889addb7a3abf54cd50588Logan Chien TypeTraits<ELFSectionHeader<Bitwidth> >::size); 7161dfca9e892597db79889addb7a3abf54cd50588Logan Chien 7261dfca9e892597db79889addb7a3abf54cd50588Logan Chien size_t pending = TypeTraits<ELFSectionHeader<Bitwidth> >::size - 7361dfca9e892597db79889addb7a3abf54cd50588Logan Chien header->getSectionHeaderEntrySize(); 7461dfca9e892597db79889addb7a3abf54cd50588Logan Chien 7561dfca9e892597db79889addb7a3abf54cd50588Logan Chien // Seek to the address of section header 7661dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR.seek(header->getSectionHeaderTableOffset(), true); 7761dfca9e892597db79889addb7a3abf54cd50588Logan Chien 7861dfca9e892597db79889addb7a3abf54cd50588Logan Chien for (size_t i = 0; i < header->getSectionHeaderNum(); ++i) { 791f100419d794fa433336190aa47bb0862f93f978TDYa llvm::OwningPtr<ELFSectionHeader<Bitwidth> > sh( 8055b5e7c242e599b88f5727352758808461483000Logan Chien ELFSectionHeader<Bitwidth>::read(AR, owner, i)); 8161dfca9e892597db79889addb7a3abf54cd50588Logan Chien 8261dfca9e892597db79889addb7a3abf54cd50588Logan Chien if (!sh) { 8361dfca9e892597db79889addb7a3abf54cd50588Logan Chien // Something wrong while reading the section header. 841f100419d794fa433336190aa47bb0862f93f978TDYa return 0; 8561dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 8661dfca9e892597db79889addb7a3abf54cd50588Logan Chien 8761dfca9e892597db79889addb7a3abf54cd50588Logan Chien AR.seek(pending); 881f100419d794fa433336190aa47bb0862f93f978TDYa tab->table.push_back(sh.take()); 8961dfca9e892597db79889addb7a3abf54cd50588Logan Chien } 9061dfca9e892597db79889addb7a3abf54cd50588Logan Chien 911f100419d794fa433336190aa47bb0862f93f978TDYa return tab.take(); 9261dfca9e892597db79889addb7a3abf54cd50588Logan Chien} 9361dfca9e892597db79889addb7a3abf54cd50588Logan Chien 9461dfca9e892597db79889addb7a3abf54cd50588Logan Chientemplate <size_t Bitwidth> 95d3bebd86ee3e1e3d637bbc909968e53bf5153897TDYachar const *ELFSectionHeaderTable<Bitwidth>:: 96d3bebd86ee3e1e3d637bbc909968e53bf5153897TDYa TABLE_NAME = "ELF Section Header Table"; 9761dfca9e892597db79889addb7a3abf54cd50588Logan Chien 98541763d9f2395cf4170d6f8fad0b58098f35c70cTDYatemplate <size_t Bitwidth> 99541763d9f2395cf4170d6f8fad0b58098f35c70cTDYainline ELFSectionHeader<Bitwidth> const * 1005b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYaELFSectionHeaderTable<Bitwidth>::getByName(const std::string &str) const { 101541763d9f2395cf4170d6f8fad0b58098f35c70cTDYa // TODO: Use map 1025b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYa for (size_t i = 0; i < this->table.size(); ++i) { 1035b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYa if (str == std::string(this->table[i]->getName())) { 1042956c0e06b1c51f521645a076802686976c4b2f6TDYa return this->table[i]; 105541763d9f2395cf4170d6f8fad0b58098f35c70cTDYa } 106541763d9f2395cf4170d6f8fad0b58098f35c70cTDYa } 107541763d9f2395cf4170d6f8fad0b58098f35c70cTDYa // Return SHN_UNDEF section header; 1082956c0e06b1c51f521645a076802686976c4b2f6TDYa return this->table[0]; 109541763d9f2395cf4170d6f8fad0b58098f35c70cTDYa} 110541763d9f2395cf4170d6f8fad0b58098f35c70cTDYa 111541763d9f2395cf4170d6f8fad0b58098f35c70cTDYatemplate <size_t Bitwidth> 112541763d9f2395cf4170d6f8fad0b58098f35c70cTDYainline ELFSectionHeader<Bitwidth> * 1135b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYaELFSectionHeaderTable<Bitwidth>::getByName(const std::string &str) { 1145c543a0761c5a7f72565351bc16ec31d6f675602TDYa ELFSectionHeaderTable<Bitwidth> const *const_this = this; 1155c543a0761c5a7f72565351bc16ec31d6f675602TDYa ELFSectionHeader<Bitwidth> const *shptr = const_this->getByName(str); 116541763d9f2395cf4170d6f8fad0b58098f35c70cTDYa // Const cast for the same API's const and non-const versions. 117541763d9f2395cf4170d6f8fad0b58098f35c70cTDYa return const_cast<ELFSectionHeader<Bitwidth> *>(shptr); 118541763d9f2395cf4170d6f8fad0b58098f35c70cTDYa} 11961dfca9e892597db79889addb7a3abf54cd50588Logan Chien#endif // ELF_SECTION_HEADER_TABLE_H 120