📄 cofflib.cpp
字号:
/*------------------------------------------------------------------*/
for (excess = 0; packet->buf[bufsize - 1]; --bufsize, ++excess) ;
/*------------------------------------------------------------------*/
/* LINK THE NEW BUFFER into THE HEAD OF THE LIST. */
/*------------------------------------------------------------------*/
packet->size = packet->index = bufsize;
packet->next = pCoffHndl->FileInfo->str_head;
packet->offset = pCoffHndl->FileInfo->str_head
? ( pCoffHndl->FileInfo->str_head->offset
+pCoffHndl->FileInfo->str_head->size)
: sizeof(long);
pCoffHndl->FileInfo->str_head = packet;
}
return ( 0 );
}
/*F***************************************************************************
* NAME: COFF_RET
* COFFR_GetSymbolTableEntry( COFF_HNDL pCoffHndl,
* long * pSymbolIndex,
* COFF_SYMTYPE * pSymbolType,
* SYMENT * pSymbolEntry,
* AUXENT * pAuxEntry )
*
* DESCRIPTION: Read a symbol and its aux entry. Return the index of
* the next symbol.
*
* INPUTS:
* PARAMETERS:
*
* GLOBALS:
*
* OUTPUTS:
* PARAMETERS:
*
* GLOBALS:
*
* RETURN:
*
* NOTES:
*
*F***************************************************************************/
COFF_RET
CoffLib::COFFR_GetSymbolTableEntry( COFF_HNDL pCoffHndl,
long * pSymbolIndex,
COFF_SYMTYPE * pSymbolType,
TI_SYMENT * pSymbolEntry,
TI_AUXENT * pAuxEntry )
{
/*----------------------------------------------------------------------*/
/* READ IN A SYMBOL AND ITS AUX ENTRY. */
/*----------------------------------------------------------------------*/
if ( (fseek( pCoffHndl->FileHndl,(pCoffHndl->FileInfo->file_hdr.f_symptr
+(*pSymbolIndex * TI_SYMESZ)),SEEK_SET))
|| (fread(pSymbolEntry,TI_SYMESZ,SIZE_ONE,pCoffHndl->FileHndl)!= SIZE_ONE)
|| ( pSymbolEntry->n_numaux
&& (fread(pAuxEntry,TI_SYMESZ,SIZE_ONE,pCoffHndl->FileHndl)!= SIZE_ONE)))
{
return (COFF_FILE_ACCESS_ERR);
}
if ( pCoffHndl->FileInfo->byte_swapped )
{
/*------------------------------------------------------------------*/
/* SWAP THE SYMBOL TABLE ENTRY. */
/*------------------------------------------------------------------*/
if (pSymbolEntry->n_zeroes == 0)
{
swap4byte( &pSymbolEntry->n_offset );
}
swap4byte(&pSymbolEntry->n_value);
swap2byte(&pSymbolEntry->n_scnum);
swap2byte(&pSymbolEntry->n_type);
/*------------------------------------------------------------------*/
/* SWAP THE AUX ENTRY, BASED ON THE STORAGE CLASS. */
/*------------------------------------------------------------------*/
if ( pSymbolEntry->n_numaux )
{
switch( pSymbolEntry->n_sclass )
{
case TI_C_FILE : break;
case TI_C_STRTAG :
case TI_C_UNTAG :
case TI_C_ENTAG :
swap4byte(&pAuxEntry->x_tag.x_fsize);
swap4byte(&pAuxEntry->x_tag.x_endndx);
break;
case TI_C_FCN :
if (!strcmp(pSymbolEntry->n_name, ".bf"))
{
swap2byte(&pAuxEntry->x_block.x_lcnt);
swap4byte(&pAuxEntry->x_block.x_regmask);
swap4byte(&pAuxEntry->x_block.x_framesize);
}
swap2byte(&pAuxEntry->x_block.x_lnno);
swap4byte(&pAuxEntry->x_block.x_endndx);
break;
case TI_C_BLOCK :
swap2byte(&pAuxEntry->x_block.x_lnno);
swap4byte(&pAuxEntry->x_block.x_endndx);
break;
case TI_C_EOS :
swap4byte(&pAuxEntry->x_eos.x_fsize);
swap4byte(&pAuxEntry->x_eos.x_tagndx);
break;
default :
/*-----------------------------------------------*/
/* HANDLE FUNCTION DEFINITION SYMBOL */
/*-----------------------------------------------*/
if (((pSymbolEntry->n_type >> 4) & 3) == TI_DT_FCN)
{
swap4byte(&pAuxEntry->x_func.x_tagndx);
swap4byte(&pAuxEntry->x_func.x_fsize);
swap4byte(&pAuxEntry->x_func.x_lnnoptr);
swap4byte(&pAuxEntry->x_func.x_endndx);
}
/*-----------------------------------------------*/
/* HANDLE ARRAYS. */
/*-----------------------------------------------*/
else if (((pSymbolEntry->n_type>>4) & 3) == TI_DT_ARY)
{
swap4byte(&pAuxEntry->x_array.x_tagndx);
swap4byte(&pAuxEntry->x_array.x_fsize);
swap2byte(&pAuxEntry->x_array.x_dimen[0]);
swap2byte(&pAuxEntry->x_array.x_dimen[1]);
swap2byte(&pAuxEntry->x_array.x_dimen[2]);
swap2byte(&pAuxEntry->x_array.x_dimen[3]);
}
/*-----------------------------------------------*/
/* HANDLE SECTION DEFINITIONS */
/*-----------------------------------------------*/
else if (pSymbolEntry->n_type == 0)
{
swap4byte(&pAuxEntry->x_scn.x_scnlen);
swap2byte(&pAuxEntry->x_scn.x_nreloc);
swap2byte(&pAuxEntry->x_scn.x_nlinno);
}
/*-----------------------------------------------*/
/* HANDLE MISC SYMBOL RECORD */
/*-----------------------------------------------*/
else
{
swap4byte(&pAuxEntry->x_sym.x_fsize);
swap4byte(&pAuxEntry->x_sym.x_tagndx);
}
break; /* End of default */
} /* End of switch */
} /* End of pSymbolEntry->n_numaux */
} /* End of if (pCoffHndl->FileInfo->byte_swapped ) */
if ( pSymbolEntry->n_numaux )
{
switch ( pSymbolEntry->n_sclass )
{
case TI_C_FILE :
*pSymbolType = COFF_AUX_FILE;
break;
case TI_C_STRTAG : /* FALL THROUGH */
case TI_C_UNTAG : /* FALL THROUGH */
case TI_C_ENTAG :
*pSymbolType = COFF_AUX_TAG;
break;
case TI_C_FCN : /* FALL THROUGH */
case TI_C_BLOCK :
*pSymbolType = COFF_AUX_BB;
break;
case TI_C_EOS :
*pSymbolType = COFF_AUX_EOS;
break;
default :
if (((pSymbolEntry->n_type >> 4) & 3) == TI_DT_FCN)
*pSymbolType = COFF_AUX_FUNC;
else if (((pSymbolEntry->n_type>>4) & 3) == TI_DT_ARY)
*pSymbolType = COFF_AUX_ARRAY;
else if (pSymbolEntry->n_type == 0)
*pSymbolType = COFF_AUX_SECT;
else
*pSymbolType = COFF_AUX_SYM;
break;
}
}
else
*pSymbolType = COFF_SYM;
*pSymbolIndex = *pSymbolIndex + pSymbolEntry->n_numaux + 1;
return ( 0 );
}
/*F***************************************************************************
* NAME: COFF_RET COFFR_GetSymbolName( COFF_HNDL pCoffHndl,
* SYMENT * pSymbolEntry,
* unsigned long MaxStringLength,
* char * pRetString )
*
* DESCRIPTION: Copy symbol name up to maxt_str length into *str.
*
* INPUTS:
* PARAMETERS:
*
* GLOBALS:
*
* OUTPUTS:
* PARAMETERS:
*
* GLOBALS:
*
* RETURN:
*
* NOTES:
*
*F***************************************************************************/
COFF_RET
CoffLib::COFFR_GetSymbolName( COFF_HNDL pCoffHndl,
TI_SYMENT * pSymbolEntry,
unsigned long MaxStringLength,
char * pRetString )
{
int Error;
if (pSymbolEntry->n_zeroes == 0)
{
STRTAB *pPacket;
if (!pCoffHndl->FileInfo->str_head)
{
Error = COFFR_LoadStrings( pCoffHndl );
if( Error != 0 )
return( Error );
}
pPacket = pCoffHndl->FileInfo->str_head;
while (pSymbolEntry->n_offset < (long)pPacket->offset)
pPacket = pPacket->next;
strncpy( pRetString, pPacket->buf+(pSymbolEntry->n_offset-pPacket->offset),
(int)MaxStringLength);
pRetString[ MaxStringLength - 1 ] = '\0';
}
else
{
strncpy( pRetString, pSymbolEntry->n_name, 8);
pRetString[8] = '\0';
}
return ( 0 );
}
/*F***************************************************************************
* NAME: COFF_RET
* COFFR_FindMaxLnno( COFF_HNDL pCoffHndl,
* long * pMaxLnno )
*
* DESCRIPTION: Find the most line numbers of any of the sections. Returns
* the number of line number entries.
*
* INPUTS:
* PARAMETERS:
*
* GLOBALS:
*
* OUTPUTS:
* PARAMETERS:
*
* GLOBALS:
*
* RETURN:
*
* NOTES:
*
*F***************************************************************************/
COFF_RET
CoffLib::COFFR_FindMaxLnno( COFF_HNDL pCoffHndl,
unsigned long * pMaxLnno )
{
int i;
unsigned long MaxLnno;
TI_SCNHDR * pSectHdr = SECT_HDR_PTR( 1 );
MaxLnno = 0L;
for( i=1; i<=pCoffHndl->FileInfo->file_hdr.f_nscns; i++ )
{
if( pSectHdr->s_nlnno > MaxLnno )
MaxLnno = pSectHdr->s_nlnno;
pSectHdr++;
}
*pMaxLnno = MaxLnno;
return( 0 );
}
/*F***************************************************************************
* NAME: COFF_RET
* COFFR_GetSectLnno( COFF_HNDL pCoffHndl,
* short SectNum,
* LNNO * pLnnoBuffer,
* unsigned long LnnoOffset,
* unsigned long LnnoToRead,
* unsigned long * pActualLnnoRead )
*
* DESCRIPTION: Read in line numbers from the file.
*
* INPUTS:
* PARAMETERS:
*
* GLOBALS:
*
* OUTPUTS:
* PARAMETERS:
*
* GLOBALS:
*
* RETURN:
*
* NOTES:
*
*F***************************************************************************/
COFF_RET
CoffLib::COFFR_GetSectLnno( COFF_HNDL pCoffHndl,
short SectNum,
TI_LINENO * pLnnoBuffer,
unsigned long LnnoOffset,
unsigned long LnnoToRead,
unsigned long * pActualLnnoRead )
{
unsigned long FilePos;
unsigned long LnnoLeftInSection,LnnoLeftToRead,LnnoRead;
TI_SCNHDR * pSectHdr = SECT_HDR_PTR( SectNum );
/*- Assume that we will be unable to read until we actually do ---------*/
*pActualLnnoRead = 0L;
if (pSectHdr->s_nlnno == 0L)
return( 0 );
/*- Set file position and seek -----------------------------------------*/
FilePos = pSectHdr->s_lnnoptr + LnnoOffset * TI_LINESZ;
if ( fseek(pCoffHndl->FileHndl, FilePos, SEEK_SET))
return (COFF_FILE_ACCESS_ERR);
/*- Read min of lnnos left in section or requested lnnos ---------------*/
LnnoLeftInSection = pSectHdr->s_nlnno - LnnoOffset;
if( LnnoLeftInSection <= 0 )
return( COFF_LOAD_SIZE_ERR );
LnnoLeftToRead = MIN(LnnoLeftInSection, LnnoToRead );
/*- Read the lnnos -----------------------------------------------------*/
for (LnnoRead =0L; LnnoRead < LnnoLeftToRead; LnnoRead++)
{
if (!fread( pLnnoBuffer, TI_LINESZ, 1, pCoffHndl->FileHndl) )
break;
/*- Swap bytes in the line number entries if necessary -------------*/
if ( pCoffHndl->FileInfo->byte_swapped )
{
swap2byte(&(pLnnoBuffer->l_lnno));
swap4byte(&(pLnnoBuffer->l_addr.l_paddr));
}
pLnnoBuffer++;
}
/*- Return number of lnnos read and error if less then fread request ---*/
*pActualLnnoRead = LnnoRead;
if( LnnoRead != LnnoLeftToRead )
return ( COFF_LOAD_SIZE_ERR );
else
return( 0 );
}
/*F***************************************************************************
* NAME: void FreeStrings( COFF_HNDL pCoffHndl )
*
* DESCRIPTION: Free the list of string table buffers.
*
* INPUTS:
* PARAMETERS:
*
* GLOBALS:
*
* OUTPUTS:
* PARAMETERS:
*
* GLOBALS:
*
* RETURN:
*
* NOTES:
*
*F***************************************************************************/
void
CoffLib::FreeStrings( COFF_HNDL pCoffHndl )
{
STRTAB *Current, *Next;
if( ( pCoffHndl->FileInfo != ( COFF_FILE_INFO *)NULL)
&& ( pCoffHndl->FileInfo->str_head != ( STRTAB *)NULL))
{
for ( Current = pCoffHndl->FileInfo->str_head;
Current;
Current = Next )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -