ELFSectionHeaderTable.h revision af521b05a143c96604dbb7488e155c5248e34462
161dfca9e892597db79889addb7a3abf54cd50588Logan Chien#ifndef ELF_SECTION_HEADER_TABLE_H
261dfca9e892597db79889addb7a3abf54cd50588Logan Chien#define ELF_SECTION_HEADER_TABLE_H
361dfca9e892597db79889addb7a3abf54cd50588Logan Chien
461dfca9e892597db79889addb7a3abf54cd50588Logan Chien#include <boost/shared_ptr.hpp>
561dfca9e892597db79889addb7a3abf54cd50588Logan Chien#include <vector>
661dfca9e892597db79889addb7a3abf54cd50588Logan Chien
761dfca9e892597db79889addb7a3abf54cd50588Logan Chien#include <assert.h>
861dfca9e892597db79889addb7a3abf54cd50588Logan Chien
961dfca9e892597db79889addb7a3abf54cd50588Logan Chientemplate <size_t Bitwidth> class ELFObject;
1061dfca9e892597db79889addb7a3abf54cd50588Logan Chientemplate <size_t Bitwidth> class ELFSectionHeader;
1161dfca9e892597db79889addb7a3abf54cd50588Logan Chien
1261dfca9e892597db79889addb7a3abf54cd50588Logan Chientemplate <size_t Bitwidth>
1361dfca9e892597db79889addb7a3abf54cd50588Logan Chienclass ELFSectionHeaderTable {
1461dfca9e892597db79889addb7a3abf54cd50588Logan Chienprivate:
1561dfca9e892597db79889addb7a3abf54cd50588Logan Chien  ELFObject<Bitwidth> *owner;
1661dfca9e892597db79889addb7a3abf54cd50588Logan Chien  std::vector<boost::shared_ptr<ELFSectionHeader<Bitwidth> > > table;
1761dfca9e892597db79889addb7a3abf54cd50588Logan Chien
1861dfca9e892597db79889addb7a3abf54cd50588Logan Chienprivate:
1961dfca9e892597db79889addb7a3abf54cd50588Logan Chien  ELFSectionHeaderTable() {
2061dfca9e892597db79889addb7a3abf54cd50588Logan Chien  }
2161dfca9e892597db79889addb7a3abf54cd50588Logan Chien
2261dfca9e892597db79889addb7a3abf54cd50588Logan Chienpublic:
2361dfca9e892597db79889addb7a3abf54cd50588Logan Chien  template <typename Archiver>
2461dfca9e892597db79889addb7a3abf54cd50588Logan Chien  static boost::shared_ptr<ELFSectionHeaderTable<Bitwidth> >
2561dfca9e892597db79889addb7a3abf54cd50588Logan Chien  read(Archiver &AR, ELFObject<Bitwidth> *owner);
2661dfca9e892597db79889addb7a3abf54cd50588Logan Chien
27af521b05a143c96604dbb7488e155c5248e34462Logan Chien  ELFSectionHeader<Bitwidth> const *operator[](size_t i) const {
28af521b05a143c96604dbb7488e155c5248e34462Logan Chien    return table[i].get();
29af521b05a143c96604dbb7488e155c5248e34462Logan Chien  }
30af521b05a143c96604dbb7488e155c5248e34462Logan Chien
31af521b05a143c96604dbb7488e155c5248e34462Logan Chien  ELFSectionHeader<Bitwidth> *operator[](size_t i) {
32af521b05a143c96604dbb7488e155c5248e34462Logan Chien    return table[i].get();
33af521b05a143c96604dbb7488e155c5248e34462Logan Chien  }
34af521b05a143c96604dbb7488e155c5248e34462Logan Chien
3561dfca9e892597db79889addb7a3abf54cd50588Logan Chien  void print();
3661dfca9e892597db79889addb7a3abf54cd50588Logan Chien};
3761dfca9e892597db79889addb7a3abf54cd50588Logan Chien
38af521b05a143c96604dbb7488e155c5248e34462Logan Chien
3961dfca9e892597db79889addb7a3abf54cd50588Logan Chien#include "ELFObject.h"
4061dfca9e892597db79889addb7a3abf54cd50588Logan Chien#include "ELFHeader.h"
4161dfca9e892597db79889addb7a3abf54cd50588Logan Chien#include "ELFSectionHeader.h"
42af521b05a143c96604dbb7488e155c5248e34462Logan Chien#include "ELFSection.h"
4361dfca9e892597db79889addb7a3abf54cd50588Logan Chien#include "ELFTypes.h"
4461dfca9e892597db79889addb7a3abf54cd50588Logan Chien
4561dfca9e892597db79889addb7a3abf54cd50588Logan Chien
4661dfca9e892597db79889addb7a3abf54cd50588Logan Chientemplate <size_t Bitwidth>
4761dfca9e892597db79889addb7a3abf54cd50588Logan Chientemplate <typename Archiver>
4861dfca9e892597db79889addb7a3abf54cd50588Logan Chieninline boost::shared_ptr<ELFSectionHeaderTable<Bitwidth> >
4961dfca9e892597db79889addb7a3abf54cd50588Logan ChienELFSectionHeaderTable<Bitwidth>::read(Archiver &AR,
5061dfca9e892597db79889addb7a3abf54cd50588Logan Chien                                      ELFObject<Bitwidth> *owner) {
5161dfca9e892597db79889addb7a3abf54cd50588Logan Chien  if (!AR) {
5261dfca9e892597db79889addb7a3abf54cd50588Logan Chien    // Archiver is in bad state before calling read function.
5361dfca9e892597db79889addb7a3abf54cd50588Logan Chien    // Return NULL and do nothing.
5461dfca9e892597db79889addb7a3abf54cd50588Logan Chien    return boost::shared_ptr<ELFSectionHeaderTable>();
5561dfca9e892597db79889addb7a3abf54cd50588Logan Chien  }
5661dfca9e892597db79889addb7a3abf54cd50588Logan Chien
5761dfca9e892597db79889addb7a3abf54cd50588Logan Chien  // Allocate a new section header table and assign the owner.
5861dfca9e892597db79889addb7a3abf54cd50588Logan Chien  boost::shared_ptr<ELFSectionHeaderTable> tab(new ELFSectionHeaderTable());
5961dfca9e892597db79889addb7a3abf54cd50588Logan Chien  tab->owner = owner;
6061dfca9e892597db79889addb7a3abf54cd50588Logan Chien
6161dfca9e892597db79889addb7a3abf54cd50588Logan Chien  // Get ELF header
6261dfca9e892597db79889addb7a3abf54cd50588Logan Chien  ELFHeader<Bitwidth> const *header = owner->getHeader();
6361dfca9e892597db79889addb7a3abf54cd50588Logan Chien
6461dfca9e892597db79889addb7a3abf54cd50588Logan Chien  assert(header->getSectionHeaderEntrySize() >=
6561dfca9e892597db79889addb7a3abf54cd50588Logan Chien         TypeTraits<ELFSectionHeader<Bitwidth> >::size);
6661dfca9e892597db79889addb7a3abf54cd50588Logan Chien
6761dfca9e892597db79889addb7a3abf54cd50588Logan Chien  size_t pending = TypeTraits<ELFSectionHeader<Bitwidth> >::size -
6861dfca9e892597db79889addb7a3abf54cd50588Logan Chien                   header->getSectionHeaderEntrySize();
6961dfca9e892597db79889addb7a3abf54cd50588Logan Chien
7061dfca9e892597db79889addb7a3abf54cd50588Logan Chien  // Seek to the address of section header
7161dfca9e892597db79889addb7a3abf54cd50588Logan Chien  AR.seek(header->getSectionHeaderTableOffset(), true);
7261dfca9e892597db79889addb7a3abf54cd50588Logan Chien
7361dfca9e892597db79889addb7a3abf54cd50588Logan Chien  for (size_t i = 0; i < header->getSectionHeaderNum(); ++i) {
7461dfca9e892597db79889addb7a3abf54cd50588Logan Chien    boost::shared_ptr<ELFSectionHeader<Bitwidth> > sh(
7561dfca9e892597db79889addb7a3abf54cd50588Logan Chien      ELFSectionHeader<Bitwidth>::read(AR, i));
7661dfca9e892597db79889addb7a3abf54cd50588Logan Chien
7761dfca9e892597db79889addb7a3abf54cd50588Logan Chien    if (!sh) {
7861dfca9e892597db79889addb7a3abf54cd50588Logan Chien      // Something wrong while reading the section header.
7961dfca9e892597db79889addb7a3abf54cd50588Logan Chien      return boost::shared_ptr<ELFSectionHeaderTable>();
8061dfca9e892597db79889addb7a3abf54cd50588Logan Chien    }
8161dfca9e892597db79889addb7a3abf54cd50588Logan Chien
8261dfca9e892597db79889addb7a3abf54cd50588Logan Chien    AR.seek(pending);
8361dfca9e892597db79889addb7a3abf54cd50588Logan Chien    tab->table.push_back(sh);
8461dfca9e892597db79889addb7a3abf54cd50588Logan Chien  }
8561dfca9e892597db79889addb7a3abf54cd50588Logan Chien
8661dfca9e892597db79889addb7a3abf54cd50588Logan Chien  return tab;
8761dfca9e892597db79889addb7a3abf54cd50588Logan Chien}
8861dfca9e892597db79889addb7a3abf54cd50588Logan Chien
8961dfca9e892597db79889addb7a3abf54cd50588Logan Chientemplate <size_t Bitwidth>
9061dfca9e892597db79889addb7a3abf54cd50588Logan Chieninline void ELFSectionHeaderTable<Bitwidth>::print() {
9161dfca9e892597db79889addb7a3abf54cd50588Logan Chien  using namespace std;
9261dfca9e892597db79889addb7a3abf54cd50588Logan Chien  using namespace term;
9361dfca9e892597db79889addb7a3abf54cd50588Logan Chien  using namespace term::color;
9461dfca9e892597db79889addb7a3abf54cd50588Logan Chien
9561dfca9e892597db79889addb7a3abf54cd50588Logan Chien  cout << endl << setw(79) << setfill('=') << '=' << endl;
9661dfca9e892597db79889addb7a3abf54cd50588Logan Chien  cout << light::white()
9761dfca9e892597db79889addb7a3abf54cd50588Logan Chien       << "ELF Section Header Table" << normal() << endl;
9861dfca9e892597db79889addb7a3abf54cd50588Logan Chien
9961dfca9e892597db79889addb7a3abf54cd50588Logan Chien  for (size_t i = 0; i < table.size(); ++i) {
10061dfca9e892597db79889addb7a3abf54cd50588Logan Chien    table[i]->print();
10161dfca9e892597db79889addb7a3abf54cd50588Logan Chien  }
10261dfca9e892597db79889addb7a3abf54cd50588Logan Chien
103622e0734f429212e59a04a05b34ea0a5f9e1ef2bLogan Chien  cout << setw(79) << setfill('=') << '=' << endl << endl;
10461dfca9e892597db79889addb7a3abf54cd50588Logan Chien}
10561dfca9e892597db79889addb7a3abf54cd50588Logan Chien
10661dfca9e892597db79889addb7a3abf54cd50588Logan Chien#endif // ELF_SECTION_HEADER_TABLE_H
107