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

📄 cofflib.cpp

📁 TMS320F2808的完整驱动测试程序源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
        /*------------------------------------------------------------------*/
        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 + -