103 lines
2.4 KiB
C++
103 lines
2.4 KiB
C++
#include "OutFile.h"
|
|
#include <stdexcept>
|
|
using namespace OutFile;
|
|
File::File(std::string path)
|
|
{
|
|
//mystream.exceptions ( std::fstream::eofbit | std::fstream::failbit | std::fstream::badbit );
|
|
mystream.open(path.c_str(),std::fstream::binary|std::ios::in|std::ios::out);
|
|
|
|
|
|
if(mystream)
|
|
{
|
|
mystream.read((char*)&myhead,sizeof(myhead));
|
|
for(unsigned i=0;i<myhead.sectioncount;i++)
|
|
{
|
|
Section x;
|
|
mystream.read((char*)&x,sizeof(Section));
|
|
sections[x.name]=x;
|
|
}
|
|
//std::cout<<"Sizeof:"<<sizeof(Section)<<"\n";
|
|
/*myhead.PrintData();
|
|
for(auto it=sections.begin();it!=sections.end();it++)
|
|
{
|
|
it->second.PrintData();
|
|
}*/
|
|
|
|
}
|
|
else
|
|
{
|
|
throw std::runtime_error("Error opening file!");
|
|
}
|
|
}
|
|
Section &File::GetSection(std::string name)
|
|
{
|
|
return sections[name];
|
|
}
|
|
void File::GetText(char *ptr)
|
|
{
|
|
Section &s=GetSection(".text");
|
|
mystream.seekg(s.start);
|
|
|
|
mystream.read(ptr,s.size);
|
|
}
|
|
size_t File::GetTextSize()
|
|
{
|
|
Section &s=GetSection(".text");
|
|
return s.size;
|
|
}
|
|
void File::PrintRelocations()
|
|
{
|
|
for(auto it=sections.begin();it!=sections.end();it++)
|
|
{
|
|
std::cout<<it->first<<":\n";
|
|
for(unsigned i=0;i<it->second.numRel;i++)
|
|
{
|
|
Relocation r;
|
|
mystream.seekg(it->second.ptrRel+10*i);
|
|
mystream.read((char*)&r,10);
|
|
std::cout<<r.ptr<<" -- "<<r.tblIndex<<":"<</*symbols[r.tblIndex].name<<*/" type:"<<r.type<<"\n";
|
|
}
|
|
}
|
|
}
|
|
void File::PrintSymbols()
|
|
{
|
|
|
|
std::cout<<"Sizeof symbol:"<<sizeof(Symbol)<<std::endl;
|
|
std::cout<<"Symbol count:"<<myhead.symbolcount<<std::endl;
|
|
for(unsigned i=0;i<myhead.symbolcount;i++)
|
|
{
|
|
mystream.seekg(myhead.symbolptr+i*18);
|
|
Symbol s;
|
|
std::cout<<i<<"\t";
|
|
s.Read(mystream,myhead.symbolptr+18*myhead.symbolcount);
|
|
|
|
//mystream.read((char*)&s,sizeof(Symbol));
|
|
s.PrintData();
|
|
symbols.push_back(s);
|
|
if(s.auxsymbs>0)
|
|
{
|
|
i+=s.auxsymbs;
|
|
}
|
|
}
|
|
|
|
}
|
|
void File::LoadSymbols()
|
|
{
|
|
symbols.clear();
|
|
for(unsigned i=0;i<myhead.symbolcount;i++)
|
|
{
|
|
mystream.seekg(myhead.symbolptr+i*18);
|
|
Symbol s;
|
|
s.Read(mystream,myhead.symbolptr+18*myhead.symbolcount);
|
|
symbols.push_back(s);
|
|
if(s.auxsymbs>0)
|
|
{
|
|
i+=s.auxsymbs;
|
|
}
|
|
}
|
|
}
|
|
File::~File()
|
|
{
|
|
|
|
}
|