⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.c

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
            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 + -