Witam, mam napisać pogram który pobierze binarkę którą dostaliśmy na zajęciach i wykonuje readelf. Do tego użyłem biblioteki elfio http://elfio.sourceforge.net/ załadowałem tą binarkę i czyta. Teraz mam z tym zrobić następującą rzecz:
Wylicz miejsce w pliku na podstawie wzoru:
[adres w pliku] = [adres początku sekcji w pliku] + [adres wirtualny podany przy uruchomieniu] - [adres wirtualny początku sekcji]
We wzorze jest "adres wirtualny podany przy uruchomieniu" więc chyba muszę pobrać od użytkownika ten adres. Mógłby ktoś mnie naprowadzić jak się za to zabrać?
Czytanie pliku elf na podstawie dokumentacji tej biblioteki:
#include <iostream>
#include "elfio.hpp"
using namespace ELFIO;
int main( int argc, char** argv )
{
if ( argc != 2 ) {
std::cout << "Usage: <elf_file>" << std::endl;
return 1;
}
// Create an elfio reader
elfio reader;
// Load ELF data
if ( !reader.load( argv[1] ) ) {
std::cout << "Can't find or process ELF file " << argv[1] << std::endl;
return 2;
}
// Print ELF file properties
std::cout << "ELF file class : ";
if ( reader.get_class() == ELFCLASS32 )
std::cout << "ELF32" << std::endl;
else
std::cout << "ELF64" << std::endl;
std::cout << "ELF file encoding : ";
if ( reader.get_encoding() == ELFDATA2LSB )
std::cout << "Little endian" << std::endl;
else
std::cout << "Big endian" << std::endl;
// Print ELF file sections info
Elf_Half sec_num = reader.sections.size();
std::cout << "Number of sections: " << sec_num << std::endl;
for ( int i = 0; i < sec_num; ++i ) {
section* psec = reader.sections[i];
std::cout << " [" << i << "] "
<< psec->get_name()
<< "\t"
<< psec->get_size()
<< std::endl;
// Access to section's data
// const char* p = reader.sections[i]->get_data()
}
// Print ELF file segments info
Elf_Half seg_num = reader.segments.size();
std::cout << "Number of segments: " << seg_num << std::endl;
for ( int i = 0; i < seg_num; ++i ) {
const segment* pseg = reader.segments[i];
std::cout << " [" << i << "] 0x" << std::hex
<< pseg->get_flags()
<< "\t0x"
<< pseg->get_virtual_address()
<< "\t0x"
<< pseg->get_file_size()
<< "\t0x"
<< pseg->get_memory_size()
<< std::endl;
// Access to segments's data
// const char* p = reader.segments[i]->get_data()
}
for ( int i = 0; i < sec_num; ++i ) {
section* psec = reader.sections[i];
// Check section type
if ( psec->get_type() == SHT_SYMTAB ) {
const symbol_section_accessor symbols( reader, psec );
for ( unsigned int j = 0; j < symbols.get_symbols_num(); ++j ) {
std::string name;
Elf64_Addr value;
Elf_Xword size;
unsigned char bind;
unsigned char type;
Elf_Half section_index;
unsigned char other;
// Read symbol properties
symbols.get_symbol( j, name, value, size, bind,
type, section_index, other );
std::cout << j << " " << name << " " << value << std::endl;
}
}
}
return 0;
}