📄 omfload.c
字号:
case( CMT_EASY_OMF ):
/* Pharlap Sucks!!!!
* Their weird object files forces us to do this crap
*/
if( ( flags == CMT_TNP ) && !memcmp( buffer, EASY_OMF_SIGNATURE, 5 ) ) {
ofh->status |= OMF_STATUS_EASY_OMF;
ofh->machine_type = ORL_MACHINE_TYPE_I386;
_SetWordSize( ofh->flags, ORL_FILE_FLAG_32BIT_MACHINE );
ofh->status |= OMF_STATUS_ARCH_SET;
}
break;
case( CMT_MS_OMF ):
/* If we see the "New OMF" COMENT record, we need to see if it
* contains the debug info style information. If it isn't CodeView,
* we don't want to parse LINNUM records as they will be in different
* format and could confuse us. This happens with .obj files generated
* by IBM's compilers. Note that we default to CodeView (MS) style
* but we might encounter a COMENT record setting some unknown style.
*/
if (*buffer)
buffer++;
if( ( len == 0 ) || !strncmp( buffer, "CV", 2 ) ) {
ofh->debug_style = OMF_DBG_STYLE_CODEVIEW;
} else if( !strncmp( buffer, "HL", 2 ) ) {
ofh->debug_style = OMF_DBG_STYLE_HLL;
} else {
ofh->debug_style = OMF_DBG_STYLE_UNKNOWN;
}
break;
}
return( err );
}
static orl_return doMODEND( omf_file_handle ofh, omf_rectyp typ )
{
orl_return err;
typ = typ;
assert( ofh );
err = loadRecord( ofh );
if( err != ORL_OKAY ) return( err );
ofh->status |= OMF_STATUS_FILE_LOADED;
return( OmfModEnd( ofh ) );
}
static orl_return doEXTDEF( omf_file_handle ofh, omf_rectyp typ )
{
orl_return err;
omf_bytes buffer;
long len;
int slen;
assert( ofh );
err = loadRecord( ofh );
if( err != ORL_OKAY ) return( err );
len = ofh->parselen;
buffer = ofh->parsebuf;
while( len ) {
slen = buffer[0];
buffer++;
len--;
if( slen > len ) return( ORL_ERROR );
if( slen > 0 ) {
err = OmfAddExtDef( ofh, buffer, slen, typ );
if( err != ORL_OKAY ) break;
}
len -= slen;
buffer += slen;
loadIndex( &buffer, &len );
}
return( err );
}
static orl_return doCEXTDEF( omf_file_handle ofh, omf_rectyp typ )
{
orl_return err;
omf_bytes buffer;
long len;
int slen;
omf_idx idx;
char name[257];
assert( ofh );
err = loadRecord( ofh );
if( err != ORL_OKAY ) return( err );
len = ofh->parselen;
buffer = ofh->parsebuf;
while( len ) {
if( len < 2 ) return( ORL_ERROR );
idx = loadIndex( &buffer, &len );
loadIndex( &buffer, &len );
slen = OmfGetLName( ofh->lnames, idx, name );
if( slen < 0 ) return( ORL_ERROR );
err = OmfAddExtDef( ofh, name, slen, typ );
if( err != ORL_OKAY ) break;
}
return( err );
}
static orl_return doCOMDEF( omf_file_handle ofh, omf_rectyp typ )
{
orl_return err;
omf_bytes buffer;
long len;
int slen;
int dec;
assert( ofh );
err = loadRecord( ofh );
if( err != ORL_OKAY ) return( err );
len = ofh->parselen;
buffer = ofh->parsebuf;
while( len ) {
slen = buffer[0];
buffer++;
len--;
if( slen > len ) return( ORL_ERROR );
if( slen > 0 ) {
err = OmfAddExtDef( ofh, buffer, slen, typ );
if( err != ORL_OKAY ) break;
}
len -= slen;
buffer += slen;
loadIndex( &buffer, &len );
switch( buffer[0] ) {
case( COMDEF_NEAR ):
slen = 1;
break;
case( COMDEF_FAR ):
slen = 2;
break;
default:
return( ORL_ERROR );
}
buffer++;
len--;
while( slen > 0 ) {
dec = 1;
if( len < 1 ) return( ORL_ERROR );
if( buffer[0] & COMDEF_LEAF_SIZE ) {
switch( buffer[0] ) {
case( COMDEF_LEAF_4 ): dec++;
case( COMDEF_LEAF_3 ): dec++;
case( COMDEF_LEAF_2 ): dec += 2;
break;
default:
return( ORL_ERROR );
}
}
len -= dec;
buffer += dec;
slen--;
}
}
return( err );
}
static orl_return doLINNUM( omf_file_handle ofh, omf_rectyp typ )
{
orl_return err;
omf_bytes buffer;
long len;
omf_idx seg = 0;
omf_idx name = 0;
unsigned_16 line;
unsigned_32 offset;
int wordsize;
assert( ofh );
err = loadRecord( ofh );
if( err != ORL_OKAY ) return( err );
len = ofh->parselen;
buffer = ofh->parsebuf;
switch( typ ) {
case( CMD_LINSYM ):
case( CMD_LINSYM32 ):
buffer++;
len--;
name = loadIndex( &buffer, &len );
if( !name ) return( ORL_ERROR );
seg = 0;
break;
case( CMD_LINNUM ):
case( CMD_LINNUM32 ):
switch( ofh->debug_style ) {
case( OMF_DBG_STYLE_CODEVIEW ):
// We have MS style line numbers.
loadIndex( &buffer, &len );
seg = loadIndex( &buffer, &len );
if( !seg ) return( ORL_OKAY );
name = 0;
break;
case( OMF_DBG_STYLE_HLL ):
// We have IBM HLL style line numbers.
// TODO
return( ORL_OKAY );
case( OMF_DBG_STYLE_UNKNOWN ):
// We don't know what this is. Do not attempt to parse.
return( ORL_OKAY );
}
break;
default:
assert( 0 );
}
wordsize = OmfGetWordSize( check32Bit( ofh, typ ) );
while( len ) {
if( len < ( wordsize + 2 ) ) return( ORL_ERROR );
line = getUWord( buffer, 2 );
buffer += 2;
len -= 2;
offset = getUWord( buffer, wordsize );
buffer += wordsize;
len -= wordsize;
err = OmfAddLineNum( ofh, seg, name, line, offset );
if( err != ORL_OKAY ) break;
}
return( err );
}
static orl_return doPUBDEF( omf_file_handle ofh, omf_rectyp typ )
{
orl_return err;
omf_bytes buffer;
long len;
int slen;
omf_idx seg;
omf_idx group;
omf_frame frame = 0;
omf_bytes name;
orl_sec_offset offset;
int is32;
int wordsize;
assert( ofh );
err = loadRecord( ofh );
if( err != ORL_OKAY ) return( err );
is32 = check32Bit( ofh, typ );
wordsize = OmfGetWordSize( is32 );
len = ofh->parselen;
buffer = ofh->parsebuf;
if( len < 2 ) return( ORL_ERROR );
group = loadIndex( &buffer, &len );
seg = loadIndex( &buffer, &len );
if( !seg ) {
if( len < 2 ) return( ORL_ERROR );
frame = getUWord( buffer, 2 );
buffer += 2;
len -= 2;
}
while( len ) {
slen = buffer[0];
buffer++;
len--;
if( ( slen + 1 + wordsize ) > len ) return( ORL_ERROR );
name = buffer;
buffer += slen;
len -= slen;
offset = getUWord( buffer, wordsize );
buffer += wordsize;
len -= wordsize;
loadIndex( &buffer, &len );
err = OmfAddPubDef( ofh, is32, group, seg, frame, name, slen, offset,
typ );
if( err != ORL_OKAY ) break;
}
return( err );
}
static orl_return doLNAMES( omf_file_handle ofh, omf_rectyp typ )
{
orl_return err;
omf_bytes buffer;
long len;
int slen;
assert( ofh );
err = loadRecord( ofh );
if( err != ORL_OKAY ) return( err );
len = ofh->parselen;
buffer = ofh->parsebuf;
while( len ) {
slen = buffer[0];
buffer++;
len--;
if( slen > len ) return( ORL_ERROR );
err = OmfAddLName( ofh, buffer, slen, typ );
if( err != ORL_OKAY ) break;
len -= slen;
buffer += slen;
}
return( err );
}
static orl_return doSEGDEF( omf_file_handle ofh, omf_rectyp typ )
{
orl_return err;
omf_bytes buffer;
long len;
omf_idx name;
omf_idx class;
uint_8 datum;
int is32;
int wordsize;
orl_sec_alignment align;
orl_sec_size size = 0;
int combine;
int max = 0;
int use32 = 0;
orl_sec_frame frame;
assert( ofh );
err = loadRecord( ofh );
if( err != ORL_OKAY ) return( err );
is32 = check32Bit( ofh, typ );
wordsize = OmfGetWordSize( is32 );
len = ofh->parselen;
buffer = ofh->parsebuf;
if( len < ( 4 + wordsize ) ) return( ORL_ERROR );
datum = buffer[0];
align = getAlignment( datum >> 5 );
combine = ( datum >> 2 ) & 7;
buffer++;
len--;
if( ( datum >> 5 ) == ALIGN_ABS ) {
if( ofh->status & OMF_STATUS_EASY_OMF ) {
// FIXME !!! it looks bugy, frame should be 16-bit and offset ?
// I can not found any information about it
frame = getUWord( buffer, 2 );
} else {
frame = getUWord( buffer, 2 );
}
buffer += 3;
len -= 3;
if( len < ( wordsize + 3 ) ) {
return( ORL_ERROR );
}
} else {
frame = ORL_SEC_NO_ABS_FRAME;
}
if( datum & 0x02 ) {
max = 1;
}
size = getUWord( buffer, wordsize );
buffer += wordsize;
len -= wordsize;
if( datum & 0x01 ) {
use32 = 1;
} else {
use32 = 0;
}
name = loadIndex( &buffer, &len );
class = loadIndex( &buffer, &len );
loadIndex( &buffer, &len );
if( ofh->status & OMF_STATUS_EASY_OMF ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -