ELFSectionStrTab.h revision 921465005aca46a100d137c9608a0aedd846e290
155b5e7c242e599b88f5727352758808461483000Logan Chien#ifndef ELF_SECTION_STRTAB_H 255b5e7c242e599b88f5727352758808461483000Logan Chien#define ELF_SECTION_STRTAB_H 355b5e7c242e599b88f5727352758808461483000Logan Chien 455b5e7c242e599b88f5727352758808461483000Logan Chien#include "ELFSection.h" 555b5e7c242e599b88f5727352758808461483000Logan Chien 655b5e7c242e599b88f5727352758808461483000Logan Chien#include "utils/helper.h" 755b5e7c242e599b88f5727352758808461483000Logan Chien#include "utils/serialize.h" 8bbbfce8bed31f418c2e4c56707accc2d1893c0dbTDYa#include "utils/raw_ostream.h" 955b5e7c242e599b88f5727352758808461483000Logan Chien 101f100419d794fa433336190aa47bb0862f93f978TDYa#include <llvm/ADT/OwningPtr.h> 11bbbfce8bed31f418c2e4c56707accc2d1893c0dbTDYa#include <llvm/Support/Format.h> 12921465005aca46a100d137c9608a0aedd846e290Logan Chien#include <llvm/Support/raw_ostream.h> 13921465005aca46a100d137c9608a0aedd846e290Logan Chien 14921465005aca46a100d137c9608a0aedd846e290Logan Chien#include <vector> 1555b5e7c242e599b88f5727352758808461483000Logan Chien 1655b5e7c242e599b88f5727352758808461483000Logan Chientemplate <size_t Bitwidth> class ELFSectionHeader; 1755b5e7c242e599b88f5727352758808461483000Logan Chien 1855b5e7c242e599b88f5727352758808461483000Logan Chientemplate <size_t Bitwidth> 1955b5e7c242e599b88f5727352758808461483000Logan Chienclass ELFSectionStrTab : public ELFSection<Bitwidth> { 2055b5e7c242e599b88f5727352758808461483000Logan Chienprivate: 211f100419d794fa433336190aa47bb0862f93f978TDYa ELFSectionHeader<Bitwidth> const *section_header; 2255b5e7c242e599b88f5727352758808461483000Logan Chien std::vector<char> buf; 2355b5e7c242e599b88f5727352758808461483000Logan Chien 2455b5e7c242e599b88f5727352758808461483000Logan Chienprivate: 2555b5e7c242e599b88f5727352758808461483000Logan Chien ELFSectionStrTab() { } 2655b5e7c242e599b88f5727352758808461483000Logan Chien 2755b5e7c242e599b88f5727352758808461483000Logan Chienpublic: 2855b5e7c242e599b88f5727352758808461483000Logan Chien template <typename Archiver> 291f100419d794fa433336190aa47bb0862f93f978TDYa static ELFSectionStrTab * 3055b5e7c242e599b88f5727352758808461483000Logan Chien read(Archiver &AR, ELFSectionHeader<Bitwidth> const *sh) { 311f100419d794fa433336190aa47bb0862f93f978TDYa llvm::OwningPtr<ELFSectionStrTab> st(new ELFSectionStrTab()); 3255b5e7c242e599b88f5727352758808461483000Logan Chien st->buf.resize(sh->getSize()); 3355b5e7c242e599b88f5727352758808461483000Logan Chien 34bbbfce8bed31f418c2e4c56707accc2d1893c0dbTDYa // Save section_header 35bbbfce8bed31f418c2e4c56707accc2d1893c0dbTDYa st->section_header = sh; 36bbbfce8bed31f418c2e4c56707accc2d1893c0dbTDYa 3755b5e7c242e599b88f5727352758808461483000Logan Chien AR.seek(sh->getOffset(), true); 3855b5e7c242e599b88f5727352758808461483000Logan Chien AR.prologue(sh->getSize()); 3955b5e7c242e599b88f5727352758808461483000Logan Chien AR.read_bytes(&*st->buf.begin(), sh->getSize()); 4055b5e7c242e599b88f5727352758808461483000Logan Chien AR.epilogue(sh->getSize()); 4155b5e7c242e599b88f5727352758808461483000Logan Chien 4255b5e7c242e599b88f5727352758808461483000Logan Chien if (!AR) { 4355b5e7c242e599b88f5727352758808461483000Logan Chien // Unable to read the string table. 441f100419d794fa433336190aa47bb0862f93f978TDYa return 0; 4555b5e7c242e599b88f5727352758808461483000Logan Chien } 4655b5e7c242e599b88f5727352758808461483000Logan Chien 471f100419d794fa433336190aa47bb0862f93f978TDYa return st.take(); 4855b5e7c242e599b88f5727352758808461483000Logan Chien } 4955b5e7c242e599b88f5727352758808461483000Logan Chien 5055b5e7c242e599b88f5727352758808461483000Logan Chien virtual void print() const { 51bbbfce8bed31f418c2e4c56707accc2d1893c0dbTDYa using namespace llvm; 5255b5e7c242e599b88f5727352758808461483000Logan Chien 53bbbfce8bed31f418c2e4c56707accc2d1893c0dbTDYa out() << '\n' << fillformat('=', 79) << '\n'; 54bbbfce8bed31f418c2e4c56707accc2d1893c0dbTDYa out().changeColor(raw_ostream::WHITE, true); 55bbbfce8bed31f418c2e4c56707accc2d1893c0dbTDYa out() << "ELF String Table: " << this->section_header->getName() << '\n'; 56bbbfce8bed31f418c2e4c56707accc2d1893c0dbTDYa out().resetColor(); 57bbbfce8bed31f418c2e4c56707accc2d1893c0dbTDYa out() << fillformat('-', 79) << '\n'; 5855b5e7c242e599b88f5727352758808461483000Logan Chien 5955b5e7c242e599b88f5727352758808461483000Logan Chien dump_hex((unsigned char const *)&*buf.begin(), buf.size(), 0, buf.size()); 6055b5e7c242e599b88f5727352758808461483000Logan Chien 61bbbfce8bed31f418c2e4c56707accc2d1893c0dbTDYa out() << fillformat('=', 79) << '\n'; 6255b5e7c242e599b88f5727352758808461483000Logan Chien } 6355b5e7c242e599b88f5727352758808461483000Logan Chien 6455b5e7c242e599b88f5727352758808461483000Logan Chien char const *operator[](size_t index) const { 6555b5e7c242e599b88f5727352758808461483000Logan Chien return &*buf.begin() + index; 6655b5e7c242e599b88f5727352758808461483000Logan Chien } 6755b5e7c242e599b88f5727352758808461483000Logan Chien}; 6855b5e7c242e599b88f5727352758808461483000Logan Chien 6955b5e7c242e599b88f5727352758808461483000Logan Chien#endif // ELF_SECTION_STRTAB_H 70