dumphll.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 639 行 · 第 1/2 页
C
639 行
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: IBM HLL and pre-CV4 CodeView debug format dump routines.
*
****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <setjmp.h>
#include "wdglb.h"
#include "dumpwv.h"
#include "wdfunc.h"
#include "hll.h"
static char *hll_debug_dirinfo_msg[] = {
"2cbDirHeader - length of directory header = ",
"2cbDirEntry - lentgh of each entry = ",
"4cDir - number of directory entries = ",
NULL
};
static char *hll_debug_dir_msg[] = {
"2subsection - subsection index = ",
"2iMod - module index (1 based) = ",
"4lfo - offset from base = ",
"4cb - subsection size = ",
NULL
};
static char *hll_sstModules_msg[] = {
"2 Seg - segment index = ",
"4 Off - code start within segment = ",
"4 cbSeg - size of code in segment = ",
"2 ovlNbr - overlay number = ",
"2 iLib - index into sstLibraries = ",
"2 cSeg - number of segments in module = ",
"2 Style - debug info style = ",
"2 Version - debug info version number = ",
NULL
};
static char *hll_seg_msg[] = {
"2 Seg - segment index = ",
"4 Off - code start within segment = ",
"4 cbSeg - size of code in segment = ",
NULL
};
static char *cv_sstPublics_msg[] = {
"2 offset - symbol offset within segment = ",
"2 seg - segment index = ",
"2 type - type index (0 if no data) = ",
NULL
};
static char *hll_sstPublics_msg[] = {
"4 offset - symbol offset within segment = ",
"2 seg - segment index = ",
"2 type - type index (0 if no data) = ",
NULL
};
static char *cv_sstSrcLnSeg_msg[] = {
"2 seg - segment index = ",
"2 cPair - number of line/offset pairs = ",
NULL
};
static char *cv_lnoff16_msg[] = {
"2 line - source line number = ",
"2 offset - offset within segment = ",
NULL
};
static char *cv_dir_entry_msg[] = {
"2SubSectionType - subsection type = ",
"2ModuleIndex - module index (1 based) = ",
"4lfoStart - offset from base = ",
"2Size - subsection size = ",
NULL
};
static char *cv_sstModules_msg[] = {
"2 Seg - segment index = ",
"2 Off - code start within segment = ",
"2 cbSeg - size of code in segment = ",
"2 ovlNbr - overlay number = ",
"2 iLib - index into sstLibraries = ",
"1 cSeg - number of segments in module = ",
"1 reserved - padding = ",
NULL
};
static char *cv_seg_msg[] = {
"2 Seg - segment index = ",
"2 Off - code start within segment = ",
"2 cbSeg - size of code in segment = ",
NULL
};
static char *hl4_linnum_first_msg[] = {
"2 lineNum - line number (must be zero) = ",
"1 entryType - format of entry = ",
"1 reserved - padding = ",
"2 numEntries - number of following entries = ",
"2 segNum - segment number for table = ",
"4 offset - offset/num entries (type 0x03) = ",
NULL
};
static char *hl4_filetab_entry_msg[] = {
"4 firstChar - first displayable listing char = ",
"4 numChars - displayable chars per line = ",
"4 numFiles - number of files in table = ",
NULL
};
static char *hl3_linnum_first_msg[] = {
"2 lineNum - line number (must be zero) = ",
"1 entryType - format of entry = ",
"1 reserved - padding = ",
"2 numEntries - number of following entries = ",
"2 segNum - segment number for table = ",
"4 tableSize - file names table size = ",
NULL
};
static char *hl3_filetab_entry_msg[] = {
"4 srcStart - start of source = ",
"4 numRecords - number of source records = ",
"4 numFiles - number of files in table = ",
NULL
};
static char *hll_linnum_entry_msg[] = {
"2 lineNum - line number = ",
"2 sfi - source file index = ",
"4 offset - offset within segment = ",
NULL
};
static int hll_level;
/*
* read_name - read length-prefixed name into 'buffer'
*/
static int read_name( char *buffer )
/**********************************/
{
unsigned_8 len;
Wread( &len, 1 );
Wread( buffer, len );
buffer[len] = '\0';
return( len );
}
/*
* dump_name - dump length-prefixed name, align to n-byte boundary
* return number of bytes read
*/
static int dump_name( bool align )
/********************************/
{
char name[256];
unsigned len, pad = 0;
len = read_name( name ) + 1;
Wdputs( name );
if( align ) {
pad = align - (len & (align - 1));
}
if( pad ) {
lseek( Handle, pad, SEEK_CUR );
}
return( len + pad + 1 );
}
/*
* dump_cv_sstPublics - dump CV sstPublic at 'offset'
* from 'base 'containing 'size' bytes
*/
static void dump_cv_sstPublics( unsigned_32 base, unsigned_32 offset,
unsigned_32 size )
/*******************************************************************/
{
hll_public_16 pub16;
unsigned_32 read = 0;
unsigned_8 name_len;
char name[256];
Wlseek( base + offset );
Wdputs( "==== sstPublics at offset " );
Puthex( offset, 8 );
Wdputslc( "\n" );
while( read < size ) {
Wread( &pub16, sizeof( pub16 ) );
name_len = pub16.name[0];
Dump_header( &pub16, cv_sstPublics_msg );
read += sizeof( pub16 );
Wread( name, name_len );
name[name_len] = '\0';
Wdputs( " symbol name: \"" );
Wdputs( name );
read += name_len;
Wdputslc( "\"\n" );
}
Wdputslc( "\n" );
}
/*
* dump_hll_sstPublics - dump HLL sstPublics at 'offset'
* from 'base 'containing 'size' bytes
*/
static void dump_hll_sstPublics( unsigned_32 base, unsigned_32 offset,
unsigned_32 size )
/********************************************************************/
{
hll_public_32 pub32;
unsigned_32 read = 0;
unsigned_8 name_len;
char name[256];
Wlseek( base + offset );
Wdputs( "==== sstPublics at offset " );
Puthex( offset, 8 );
Wdputslc( "\n" );
while( read < size ) {
Wread( &pub32, sizeof( pub32 ) );
name_len = pub32.name[0];
Dump_header( &pub32, hll_sstPublics_msg );
read += sizeof( pub32 );
Wread( name, name_len );
name[name_len] = '\0';
Wdputs( " symbol name: \"" );
Wdputs( name );
read += name_len;
Wdputslc( "\"\n" );
}
Wdputslc( "\n" );
}
/*
* dump_cv_sstLibraries - dump CV sstLibraries at 'offset'
* from 'base' containing 'size' bytes
*/
static void dump_cv_sstLibraries( unsigned_32 base, unsigned_32 offset,
unsigned_32 size )
/*********************************************************************/
{
unsigned index = 0;
unsigned_32 read = 0;
Wlseek( base + offset );
Wdputs( "==== sstLibraries at offset " );
Puthex( offset, 8 );
Wdputslc( "\n" );
while( read < size ) {
Wdputs( " index: " );
Puthex( index, 4 );
Wdputs( "H name: \"" );
read += dump_name( 0 );
Wdputslc( "\"\n" );
++index;
}
Wdputslc( "\n" );
}
/*
* dump_cv_sstModules - dump CV sstModules at 'offset' from 'base'
*/
static void dump_cv_sstModules( unsigned_32 base, unsigned_32 offset )
/********************************************************************/
{
cv3_sst_module mod;
cv3_seginfo seg;
bool first = TRUE;
Wlseek( base + offset );
Wdputs( "==== sstModules at offset " );
Puthex( offset, 8 );
Wdputslc( "\n" );
Wread( &mod, sizeof( mod ) );
Dump_header( &mod, cv_sstModules_msg );
Wdputs( " module name: \"" );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?