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