mirror of
https://github.com/serge1/ELFIO.git
synced 2025-02-06 12:39:48 +00:00
ELFDump is using ELFIO::dump class now
This commit is contained in:
parent
8ded746bc3
commit
d8a7e8ccca
@ -1,27 +0,0 @@
|
|||||||
#include <iostream>
|
|
||||||
#include <elfio_dump.hpp>
|
|
||||||
|
|
||||||
using namespace ELFIO;
|
|
||||||
|
|
||||||
int main( int argc, char** argv )
|
|
||||||
{
|
|
||||||
if ( argc != 2 ) {
|
|
||||||
printf( "Usage: ELFDump <file_name>\n" );
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
elfio reader;
|
|
||||||
|
|
||||||
if ( !reader.load( argv[1] ) ) {
|
|
||||||
printf( "File %s is not found or it is not an ELF file\n", argv[1] );
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
dump::header ( std::cout, reader );
|
|
||||||
dump::section_headers( std::cout, reader );
|
|
||||||
dump::segment_headers( std::cout, reader );
|
|
||||||
dump::symbol_tables ( std::cout, reader );
|
|
||||||
dump::notes ( std::cout, reader );
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -27,212 +27,11 @@ THE SOFTWARE.
|
|||||||
#define ELFIO_NO_INTTYPES
|
#define ELFIO_NO_INTTYPES
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PRIx64 "llx"
|
#include <iostream>
|
||||||
|
#include <elfio_dump.hpp>
|
||||||
|
|
||||||
#define __STDC_FORMAT_MACROS
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <elfio.hpp>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace ELFIO;
|
using namespace ELFIO;
|
||||||
|
|
||||||
void
|
|
||||||
PrintHeader( const elfio& reader )
|
|
||||||
{
|
|
||||||
printf( "ELF Header\n" );
|
|
||||||
printf( " Class: %s (%d)\n",
|
|
||||||
( ELFCLASS32 == reader.get_class() ) ? "ELF32" : "ELF64",
|
|
||||||
(int)reader.get_class() );
|
|
||||||
if ( ELFDATA2LSB == reader.get_encoding() ) {
|
|
||||||
printf( " Encoding: Little endian\n" );
|
|
||||||
}
|
|
||||||
else if ( ELFDATA2MSB == reader.get_encoding() ) {
|
|
||||||
printf( " Encoding: Big endian\n" );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
printf( " Encoding: Unknown\n" );
|
|
||||||
}
|
|
||||||
printf( " ELFVersion: %s (%d)\n",
|
|
||||||
( EV_CURRENT == reader.get_elf_version() ) ? "Current" : "Unknown",
|
|
||||||
(int)reader.get_elf_version() );
|
|
||||||
printf( " Type: 0x%04X\n", reader.get_type() );
|
|
||||||
printf( " Machine: 0x%04X\n", reader.get_machine() );
|
|
||||||
printf( " Version: 0x%08X\n", reader.get_version() );
|
|
||||||
printf( " Entry: 0x%08" PRIx64 "\n", reader.get_entry() );
|
|
||||||
printf( " Flags: 0x%08X\n\n", reader.get_flags() );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
string
|
|
||||||
SectionTypes( Elf_Word type )
|
|
||||||
{
|
|
||||||
string sRet = "UNKNOWN";
|
|
||||||
switch ( type ) {
|
|
||||||
case SHT_NULL :
|
|
||||||
sRet = "NULL";
|
|
||||||
break;
|
|
||||||
case SHT_PROGBITS :
|
|
||||||
sRet = "PROGBITS";
|
|
||||||
break;
|
|
||||||
case SHT_SYMTAB :
|
|
||||||
sRet = "SYMTAB";
|
|
||||||
break;
|
|
||||||
case SHT_STRTAB :
|
|
||||||
sRet = "STRTAB";
|
|
||||||
break;
|
|
||||||
case SHT_RELA :
|
|
||||||
sRet = "RELA";
|
|
||||||
break;
|
|
||||||
case SHT_HASH :
|
|
||||||
sRet = "HASH";
|
|
||||||
break;
|
|
||||||
case SHT_DYNAMIC :
|
|
||||||
sRet = "DYNAMIC";
|
|
||||||
break;
|
|
||||||
case SHT_NOTE :
|
|
||||||
sRet = "NOTE";
|
|
||||||
break;
|
|
||||||
case SHT_NOBITS :
|
|
||||||
sRet = "NOBITS";
|
|
||||||
break;
|
|
||||||
case SHT_REL :
|
|
||||||
sRet = "REL";
|
|
||||||
break;
|
|
||||||
case SHT_SHLIB :
|
|
||||||
sRet = "SHLIB";
|
|
||||||
break;
|
|
||||||
case SHT_DYNSYM :
|
|
||||||
sRet = "DYNSYM";
|
|
||||||
break;
|
|
||||||
case SHT_INIT_ARRAY :
|
|
||||||
sRet = "SHT_INIT_ARRAY";
|
|
||||||
break;
|
|
||||||
case SHT_FINI_ARRAY :
|
|
||||||
sRet = "SHT_FINI_ARRAY";
|
|
||||||
break;
|
|
||||||
case SHT_PREINIT_ARRAY :
|
|
||||||
sRet = "SHT_PREINIT_ARRAY";
|
|
||||||
break;
|
|
||||||
case SHT_GROUP :
|
|
||||||
sRet = "SHT_GROUP";
|
|
||||||
break;
|
|
||||||
case SHT_SYMTAB_SHNDX :
|
|
||||||
sRet = "SHT_SYMTAB_SHNDX";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sRet;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
string SectionFlags( Elf_Xword flags )
|
|
||||||
{
|
|
||||||
string sRet = "";
|
|
||||||
if ( flags & SHF_WRITE ) {
|
|
||||||
sRet += "W";
|
|
||||||
}
|
|
||||||
if ( flags & SHF_ALLOC ) {
|
|
||||||
sRet += "A";
|
|
||||||
}
|
|
||||||
if ( flags & SHF_EXECINSTR ) {
|
|
||||||
sRet += "X";
|
|
||||||
}
|
|
||||||
|
|
||||||
return sRet;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
PrintSection( int i, const section* sec )
|
|
||||||
{
|
|
||||||
Elf64_Addr addr = sec->get_address();
|
|
||||||
Elf_Xword size = sec->get_size();
|
|
||||||
PRIx64;
|
|
||||||
printf( " [%2x] %-20s %-8.8s %08"PRIx64" %06"PRIx64" %02"PRIx64" %-3.3s %02x %04x %02"PRIx64"\n",
|
|
||||||
i,
|
|
||||||
string( sec->get_name() ).substr( 0, 20 ).c_str(),
|
|
||||||
SectionTypes( sec->get_type() ).c_str(),
|
|
||||||
sec->get_address(),
|
|
||||||
sec->get_size(),
|
|
||||||
sec->get_entry_size(),
|
|
||||||
SectionFlags( sec->get_flags() ).c_str(),
|
|
||||||
sec->get_link(),
|
|
||||||
sec->get_info(),
|
|
||||||
sec->get_addr_align() );
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
string
|
|
||||||
SegmentTypes( Elf_Word type )
|
|
||||||
{
|
|
||||||
string sRet = "UNKNOWN";
|
|
||||||
switch ( type ) {
|
|
||||||
case PT_NULL:
|
|
||||||
sRet = "NULL";
|
|
||||||
break;
|
|
||||||
case PT_LOAD:
|
|
||||||
sRet = "PT_LOAD";
|
|
||||||
break;
|
|
||||||
case PT_DYNAMIC:
|
|
||||||
sRet = "PT_DYNAMIC";
|
|
||||||
break;
|
|
||||||
case PT_INTERP:
|
|
||||||
sRet = "PT_INTERP";
|
|
||||||
break;
|
|
||||||
case PT_NOTE:
|
|
||||||
sRet = "PT_NOTE";
|
|
||||||
break;
|
|
||||||
case PT_SHLIB:
|
|
||||||
sRet = "PT_SHLIB";
|
|
||||||
break;
|
|
||||||
case PT_PHDR:
|
|
||||||
sRet = "PT_PHDR";
|
|
||||||
break;
|
|
||||||
case PT_TLS:
|
|
||||||
sRet = "PT_TLS";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sRet;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
PrintSegment( int i, const segment* seg )
|
|
||||||
{
|
|
||||||
printf( " [%2x] %-10.10s %08"PRIx64" %08"PRIx64" %08"PRIx64" %08"PRIx64" %08x %08"PRIx64"\n",
|
|
||||||
i,
|
|
||||||
SegmentTypes( seg->get_type() ).c_str(),
|
|
||||||
seg->get_virtual_address(),
|
|
||||||
seg->get_physical_address(),
|
|
||||||
seg->get_file_size(),
|
|
||||||
seg->get_memory_size(),
|
|
||||||
seg->get_flags(),
|
|
||||||
seg->get_align() );
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
PrintSymbol( std::string& name, Elf64_Addr value,
|
|
||||||
Elf_Xword size,
|
|
||||||
unsigned char bind, unsigned char type,
|
|
||||||
Elf_Half section )
|
|
||||||
{
|
|
||||||
printf( "%-46.46s %08"PRIx64" %08"PRIx64" %01x %01x %02x\n",
|
|
||||||
name.c_str(),
|
|
||||||
value,
|
|
||||||
size,
|
|
||||||
(int)bind,
|
|
||||||
(int)type,
|
|
||||||
section );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main( int argc, char** argv )
|
int main( int argc, char** argv )
|
||||||
{
|
{
|
||||||
if ( argc != 2 ) {
|
if ( argc != 2 ) {
|
||||||
@ -240,8 +39,6 @@ int main( int argc, char** argv )
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Open ELF reader
|
|
||||||
elfio reader;
|
elfio reader;
|
||||||
|
|
||||||
if ( !reader.load( argv[1] ) ) {
|
if ( !reader.load( argv[1] ) ) {
|
||||||
@ -249,82 +46,11 @@ int main( int argc, char** argv )
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print ELF file header
|
dump::header ( std::cout, reader );
|
||||||
PrintHeader( reader );
|
dump::section_headers( std::cout, reader );
|
||||||
|
dump::segment_headers( std::cout, reader );
|
||||||
// Print ELF file sections
|
dump::symbol_tables ( std::cout, reader );
|
||||||
printf( "Section headers:\n" );
|
dump::notes ( std::cout, reader );
|
||||||
printf( " [Nr] Name Type Addr Size ES Flg Lk Inf Al\n" );
|
|
||||||
int nSecNo = reader.sections.size();
|
|
||||||
int i;
|
|
||||||
for ( i = 0; i < nSecNo; ++i ) { // For all sections
|
|
||||||
section* sec = reader.sections[i];
|
|
||||||
PrintSection( i, sec );
|
|
||||||
}
|
|
||||||
printf( "Key to Flags: W (write), A (alloc), X (execute)\n\n" );
|
|
||||||
|
|
||||||
// Print ELF file segments
|
|
||||||
int nSegNo = reader.segments.size();
|
|
||||||
if ( nSegNo > 0 ) {
|
|
||||||
printf( "Segment headers:\n" );
|
|
||||||
printf( " [Nr] Type VirtAddr PhysAddr FileSize Mem.Size Flags Align\n" );
|
|
||||||
}
|
|
||||||
for ( i = 0; i < nSegNo; ++i ) { // For all segments
|
|
||||||
segment* seg = reader.segments[i];
|
|
||||||
PrintSegment( i, seg );
|
|
||||||
}
|
|
||||||
printf( "\n" );
|
|
||||||
|
|
||||||
// Print symbol tables
|
|
||||||
nSecNo = reader.sections.size();
|
|
||||||
for ( i = 0; i < nSecNo; ++i ) { // For all sections
|
|
||||||
section* sec = reader.sections[i];
|
|
||||||
if ( SHT_SYMTAB == sec->get_type() || SHT_DYNSYM == sec->get_type() ) {
|
|
||||||
symbol_section_accessor symbols( reader, sec );
|
|
||||||
|
|
||||||
std::string name;
|
|
||||||
Elf64_Addr value;
|
|
||||||
Elf_Xword size;
|
|
||||||
unsigned char bind;
|
|
||||||
unsigned char type;
|
|
||||||
Elf_Half section;
|
|
||||||
unsigned char other;
|
|
||||||
Elf_Xword nSymNo = symbols.get_symbols_num();
|
|
||||||
if ( 0 < nSymNo ) {
|
|
||||||
printf( "Symbol table (%s)\n", sec->get_name().c_str() );
|
|
||||||
printf( " Name Value Size Bind Type Sect\n" );
|
|
||||||
for ( int i = 0; i < nSymNo; ++i ) {
|
|
||||||
symbols.get_symbol( i, name, value, size, bind, type, section, other );
|
|
||||||
PrintSymbol( name, value, size, bind, type, section );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printf( "\n" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for ( i = 0; i < nSecNo; ++i ) { // For all sections
|
|
||||||
section* sec = reader.sections[i];
|
|
||||||
if ( SHT_NOTE == sec->get_type() ) {
|
|
||||||
note_section_accessor notes( reader, sec );
|
|
||||||
int nNotesNo = notes.get_notes_num();
|
|
||||||
if ( 0 < nNotesNo ) {
|
|
||||||
printf( "Note section (%s)\n", sec->get_name().c_str() );
|
|
||||||
printf( " No Type Name\n" );
|
|
||||||
for ( int i = 0; i < nNotesNo; ++i ) { // For all notes
|
|
||||||
Elf_Word type;
|
|
||||||
std::string name;
|
|
||||||
void* desc;
|
|
||||||
Elf_Word descsz;
|
|
||||||
|
|
||||||
notes.get_note( i, type, name, desc, descsz );
|
|
||||||
printf( " [%2d] 0x%08x %s\n", i, type, name.c_str() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printf( "\n" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user