путей много, но правильный - это юзать elf-формат.Вот неупорядоченный кусок кода, который разгребает файл по секциям, а затем позволяет прочитать содержимое заданной секции.
struct CElf::sData{
Elf32_Ehdr m_elf;
std::map<std::string,Elf32_Shdr> m_mpSections;
std::ifstream m_fElf;
};
struct CElf::sData{
Elf32_Ehdr m_elf;
std::map<std::string,Elf32_Shdr> m_mpSections;
std::ifstream m_fElf;
};
CElf::CElf(const char *szFileName)
{
m_pData = new sData();
m_pData->m_fElf.open(szFileName);
if(m_pData->m_fElf){
m_pData->m_fElf.read(reinterpret_cast<char*>(&m_pData->m_elf), sizeof(m_pData->m_elf));
// load the header struct
std::vector<Elf32_Shdr> vv(m_pData->m_elf.e_shnum);
m_pData->m_fElf.seekg(m_pData->m_elf.e_shoff);
m_pData->m_fElf.read(reinterpret_cast<char*>(&vv[0]), vv.size() * m_pData->m_elf.e_shentsize);
// read in the section string table
m_pData->m_fElf.seekg(vv[m_pData->m_elf.e_shstrndx].sh_offset);
std::vector<char> vvs(vv[m_pData->m_elf.e_shstrndx].sh_size);
m_pData->m_fElf.read(&vvs[0], vvs.size());
// now generate a map of names to sections
for(unsigned i=0;i<vv.size();++i){
//TR2(i,std::string( (const char*)(&vvs[0] + vv[i].sh_name)));
m_pData->m_mpSections[ std::string( (const char*)(&vvs[0] + vv[i].sh_name)) ] = vv[i];
}
}
}
std::vector<unsigned char> CElf::getSection(const char *szSectionName)
{
std::vector<unsigned char> ret;
// try to find the section
std::map<std::string,Elf32_Shdr>::const_iterator itSec = m_pData->m_mpSections.find(szSectionName);
// if we found the section
if(itSec != m_pData->m_mpSections.end()){
m_pData->m_fElf.seekg(itSec->second.sh_offset);
ret.resize(itSec->second.sh_size);
m_pData->m_fElf.read(reinterpret_cast<char*>(&ret[0]), ret.size());
}
return ret;
}