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