📄 test.c
字号:
printf( "execute permission" );
}
if( sec_flags & ORL_SEC_FLAG_READ_PERMISSION ) {
if( sep++ ) printf( ", " );
printf( "read permission" );
}
if( sec_flags & ORL_SEC_FLAG_WRITE_PERMISSION) {
if( sep++ ) printf( ", " );
printf( "write permission" );
}
if( sep ) printf( "\n" );
}
if( dump.sec_contents ) {
if( ORLSecGetContents( o_shnd, &buf ) == ORL_OKAY ) {
printf( "Contents:\n" );
for( loop = 0; loop < size; loop += 16 ) {
printf( "0x%8.8x: ", loop );
for( loop2 = 0; loop2 < 16; loop2++ ) {
if( loop + loop2 < size ) {
printf( "%2.2x ", buf[loop+loop2] );
} else {
printf( " " );
}
if( loop2 == 7 ) {
printf( " " );
}
}
printf( " " );
for( loop2 = 0; loop2 < 16 && loop + loop2 < size; loop2++ ) {
if( buf[loop+loop2] >= 32 && buf[loop+loop2] <= 122 ) {
printf( "%c", buf[loop+loop2] );
} else {
printf( "." );
}
if( loop2 == 7 ) {
printf( " " );
}
}
printf( "\n" );
}
}
}
if( dump.relocs ) {
reloc_section = ORLSecGetRelocTable( o_shnd );
if( reloc_section ) {
if( !segname_printed++ ) {
buf = ORLSecGetName( o_shnd );
printf( "[%s]\n", buf );
}
printf( "Relocs in [%s], ", ORLSecGetName( reloc_section ) );
symbol_table = ORLSecGetSymbolTable( reloc_section );
if( symbol_table ) {
printf( "symtab='%s', ", ORLSecGetName( symbol_table ) );
string_table = ORLSecGetStringTable( symbol_table );
if( string_table ) {
printf( "strtab='%s'.\n", ORLSecGetName( string_table ) );
} else {
printf( "strtab=none.\n" );
}
} else {
printf( "symtab=none, strtab=none.\n" );
}
//printf( "Relocs:\n" );
ORLRelocSecScan( reloc_section, &PrintRelocInfo );
}
}
return( ORL_OKAY );
}
orl_return PrintSymTable( orl_sec_handle orl_sec_hnd )
/****************************************************/
{
if( dump.symbols ) {
printf( "\nSymbol table\n" );
printf( "~~~~~~~~~~~~\n" );
ORLSymbolSecScan( orl_sec_hnd, &PrintSymbolInfo );
}
return( ORL_OKAY );
}
static void * objRead( void *hdl, unsigned int len )
/**************************************************/
{
buff_list ptr;
ptr = TRMemAlloc( sizeof( *buffList ) + len - 1 );
ptr->next = buffList;
buffList = ptr;
if( read( (int)hdl, ptr->buff, len ) != len ) {
TRMemFree( ptr );
return( NULL );
}
return( ptr->buff );
}
static long objSeek( void *hdl, long pos, int where )
/***************************************************/
{
return( lseek( (int)hdl, pos, where ) );
}
void freeBuffList( void )
/***********************/
{
buff_list next;
while( buffList ) {
next = buffList->next;
TRMemFree( buffList );
buffList = next;
}
}
int main( int argc, char *argv[] )
/********************************/
{
orl_handle o_hnd;
orl_file_handle o_fhnd;
orl_funcs funcs;
int file;
orl_file_flags file_flags;
orl_machine_type machine_type;
orl_file_type file_type;
orl_file_format type;
int c;
int sep;
char *secs[MAX_SECS];
int num_secs = 0;
if( argc < 2 ) {
printf( "Usage: objread [-ahrsSx] [-o<section>] <objfile>\n" );
printf( "Where <objfile> is a COFF, ELF or OMF object file\n" );
printf( "objread reads and dumps an object using ORL\n" );
printf( "Options: -a dumps all information (except hex dump)\n" );
printf( " -h dumps file header information\n" );
printf( " -r dumps relocation information\n" );
printf( " -s dumps symbol table\n" );
printf( " -S dumps section information\n" );
printf( " -x get hex dump of section content\n" );
printf( " -o only scan <section> for info\n" );
return( 1 );
}
while( (c = getopt( argc, argv, "axhrsSo:" )) != EOF ) {
switch( c ) {
case 'a':
dump.relocs++;
dump.header++;
dump.symbols++;
dump.sections++;
break;
case 'x':
dump.sec_contents++;
break;
case 'h':
dump.header++;
break;
case 'r':
dump.relocs++;
break;
case 's':
dump.symbols++;
break;
case 'S':
dump.sections++;
break;
case 'o':
secs[num_secs++] = optarg;
break;
default:
// error occured
exit(1);
};
};
if( optind != argc - 1 ) {
fprintf( stderr, "must specify 1 filename\n" );
exit(1);
}
file = open( argv[optind], O_BINARY | O_RDONLY );
if( file == -1 ) {
printf( "Error opening file.\n" );
return( 2 );
}
TRMemOpen();
funcs.read = &objRead;
funcs.seek = &objSeek;
funcs.alloc = &TRMemAlloc;
funcs.free = &TRMemFree;
o_hnd = ORLInit( &funcs );
if( o_hnd == NULL ) {
printf( "Got NULL orl_handle.\n" );
return( 2 );
}
type = ORLFileIdentify( o_hnd, (void *)file );
if( type == ORL_UNRECOGNIZED_FORMAT ) {
printf( "The object file is not in either ELF, COFF or OMF format." );
return( 1 );
}
switch( type ) {
case ORL_ELF:
printf( "ELF" );
break;
case ORL_COFF:
printf( "COFF" );
break;
case ORL_OMF:
printf( "OMF" );
break;
default:
printf( "Unknown" );
break;
}
printf( " object file.\n" );
o_fhnd = ORLFileInit( o_hnd, (void *)file, type );
if( o_fhnd == NULL ) {
printf( "Got NULL orl_file_handle.\n" );
return( 2 );
}
if( dump.header ) {
printf( "File %s:\n", argv[optind] );
machine_type = ORLFileGetMachineType( o_fhnd );
printf( "Machine Type: " );
if( machine_type >= ( sizeof( machType ) / sizeof( *machType ) ) ) {
// We've probably added some new types?
printf( "?(%d)", machine_type );
} else {
printf( "%s", machType[ machine_type ] );
}
file_type = ORLFileGetType( o_fhnd );
printf( " (" );
switch( file_type ) {
case ORL_FILE_TYPE_NONE:
printf( "file_type_none" );
break;
case ORL_FILE_TYPE_OBJECT:
printf( "object file" );
break;
case ORL_FILE_TYPE_EXECUTABLE:
printf( "executable" );
break;
case ORL_FILE_TYPE_SHARED_OBJECT:
printf( "shared object" );
break;
case ORL_FILE_TYPE_DLL:
printf( "DLL" );
break;
default:
printf( "unknown file type?" );
break;
}
printf( ")\n" );
file_flags = ORLFileGetFlags( o_fhnd );
//printf(" File flags=0x%x\n", file_flags );
sep = 0;
if( file_flags & ORL_FILE_FLAG_LINE_NUMS_STRIPPED ) {
printf( "line number info stripped" );
sep = 1;
}
if( file_flags & ORL_FILE_FLAG_RELOCS_STRIPPED ) {
if( sep++ ) printf( ", " );
printf( "relocs stripped" );
}
if( file_flags & ORL_FILE_FLAG_LOCAL_SYMS_STRIPPED ) {
if( sep++ ) printf( ", " );
printf( "local symbols stripped" );
}
if( file_flags & ORL_FILE_FLAG_DEBUG_STRIPPED ) {
if( sep++ ) printf( ", " );
printf( "debug info stripped" );
}
if( file_flags & ORL_FILE_FLAG_16BIT_MACHINE ) {
if( sep++ ) printf( ", " );
printf( "for 16-bit machine" );
}
if( file_flags & ORL_FILE_FLAG_32BIT_MACHINE ) {
if( sep++ ) printf( ", " );
printf( "for 32-bit machine" );
}
if( file_flags & ORL_FILE_FLAG_64BIT_MACHINE ) {
if( sep++ ) printf( ", " );
printf( "for 64-bit machine" );
}
if( file_flags & ORL_FILE_FLAG_LITTLE_ENDIAN ) {
if( sep++ ) printf( ", " );
printf( "little-endian byte order" );
}
if( file_flags & ORL_FILE_FLAG_BIG_ENDIAN ) {
if( sep++ ) printf( ", " );
printf( "big-endian byte order" );
}
if( file_flags & ORL_FILE_FLAG_SYSTEM ) {
if( sep++ ) printf( ", " );
printf( "system file" );
}
if( sep ) printf( "\n" );
}
if( num_secs ) {
for( c = 0; c < num_secs; c++ ) {
sectionFound = 0;
if( ORLFileScan( o_fhnd, secs[c], &PrintSecInfo ) != ORL_OKAY ) {
printf( "Error occured in scanning section '%s'.\n", secs[c] );
}
if( !sectionFound ) {
printf( "Section '%s' not found in object.\n", secs[c] );
}
}
} else {
if( ORLFileScan( o_fhnd, NULL, &PrintSecInfo ) != ORL_OKAY ) {
printf( "Error occured in scanning file.\n" );
return( 2 );
}
}
if( ORLFileScan( o_fhnd, ".symtab", &PrintSymTable ) != ORL_OKAY ) {
printf( "Error occured in scanning file for symbol table\n" );
return( 2 );
}
if( ORLFileFini( o_fhnd ) != ORL_OKAY ) {
printf( "Error calling ORLFileFini.\n" );
return( 2 );
}
if( close( file ) == -1 ) {
printf( "Error closing file.\n" );
return( 2 );
}
if( ORLFini( o_hnd ) != ORL_OKAY ) {
printf( "Error calling ORLFini.\n" );
}
freeBuffList();
#ifdef TRMEM
TRMemPrtList();
#endif
TRMemClose();
return( 0 );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -