mirror of
https://github.com/celisej567/source-engine.git
synced 2026-01-05 22:09:59 +03:00
1
This commit is contained in:
132
devtools/test_binaries/OBJDUMP.C
Normal file
132
devtools/test_binaries/OBJDUMP.C
Normal file
@@ -0,0 +1,132 @@
|
||||
//--------------------
|
||||
// PROGRAM: PEDUMP
|
||||
// FILE: OBJDUMP.C
|
||||
// AUTHOR: Matt Pietrek - 1993
|
||||
//--------------------
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include "common.h"
|
||||
#include "extrnvar.h"
|
||||
|
||||
typedef struct _i386RelocTypes
|
||||
{
|
||||
WORD type;
|
||||
PSTR name;
|
||||
} i386RelocTypes;
|
||||
|
||||
// ASCII names for the various relocations used in i386 COFF OBJs
|
||||
i386RelocTypes i386Relocations[] =
|
||||
{
|
||||
{ IMAGE_REL_I386_ABSOLUTE, "ABSOLUTE" },
|
||||
{ IMAGE_REL_I386_DIR16, "DIR16" },
|
||||
{ IMAGE_REL_I386_REL16, "REL16" },
|
||||
{ IMAGE_REL_I386_DIR32, "DIR32" },
|
||||
{ IMAGE_REL_I386_DIR32NB, "DIR32NB" },
|
||||
{ IMAGE_REL_I386_SEG12, "SEG12" },
|
||||
{ IMAGE_REL_I386_SECTION, "SECTION" },
|
||||
{ IMAGE_REL_I386_SECREL, "SECREL" },
|
||||
{ IMAGE_REL_I386_REL32, "REL32" }
|
||||
};
|
||||
#define I386RELOCTYPECOUNT (sizeof(i386Relocations) / sizeof(i386RelocTypes))
|
||||
|
||||
//
|
||||
// Given an i386 OBJ relocation type, return its ASCII name in a buffer
|
||||
//
|
||||
void GetObjRelocationName(WORD type, PSTR buffer, DWORD cBytes)
|
||||
{
|
||||
DWORD i;
|
||||
|
||||
for ( i=0; i < I386RELOCTYPECOUNT; i++ )
|
||||
if ( type == i386Relocations[i].type )
|
||||
{
|
||||
strncpy(buffer, i386Relocations[i].name, cBytes);
|
||||
return;
|
||||
}
|
||||
|
||||
wsprintf( buffer, "???_%X", type);
|
||||
}
|
||||
|
||||
//
|
||||
// Dump the relocation table for one COFF section
|
||||
//
|
||||
void DumpObjRelocations(PIMAGE_RELOCATION pRelocs, DWORD count)
|
||||
{
|
||||
DWORD i;
|
||||
char szTypeName[32];
|
||||
|
||||
for ( i=0; i < count; i++ )
|
||||
{
|
||||
GetObjRelocationName(pRelocs->Type, szTypeName, sizeof(szTypeName));
|
||||
printf(" Address: %08X SymIndex: %08X Type: %s\n",
|
||||
pRelocs->VirtualAddress, pRelocs->SymbolTableIndex,
|
||||
szTypeName);
|
||||
pRelocs++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// top level routine called from PEDUMP.C to dump the components of a
|
||||
// COFF OBJ file.
|
||||
//
|
||||
void DumpObjFile( PIMAGE_FILE_HEADER pImageFileHeader )
|
||||
{
|
||||
unsigned i;
|
||||
PIMAGE_SECTION_HEADER pSections;
|
||||
|
||||
DumpHeader(pImageFileHeader);
|
||||
printf("\n");
|
||||
|
||||
pSections = (PIMAGE_SECTION_HEADER)(pImageFileHeader+1);
|
||||
|
||||
DumpSectionTable(pSections, pImageFileHeader->NumberOfSections, FALSE);
|
||||
printf("\n");
|
||||
|
||||
if ( fShowRelocations )
|
||||
{
|
||||
for ( i=0; i < pImageFileHeader->NumberOfSections; i++ )
|
||||
{
|
||||
if ( pSections[i].PointerToRelocations == 0 )
|
||||
continue;
|
||||
|
||||
printf("Section %02X (%.8s) relocations\n", i, pSections[i].Name);
|
||||
DumpObjRelocations( MakePtr(PIMAGE_RELOCATION, pImageFileHeader,
|
||||
pSections[i].PointerToRelocations),
|
||||
pSections[i].NumberOfRelocations );
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
PCOFFSymbolTable = MakePtr(PIMAGE_SYMBOL, pImageFileHeader,
|
||||
pImageFileHeader->PointerToSymbolTable);
|
||||
COFFSymbolCount = pImageFileHeader->NumberOfSymbols;
|
||||
|
||||
if ( fShowLineNumbers )
|
||||
{
|
||||
// Walk through the section table...
|
||||
for (i=0; i < pImageFileHeader->NumberOfSections; i++)
|
||||
{
|
||||
// if there's any line numbers for this section, dump'em
|
||||
if ( pSections->NumberOfLinenumbers )
|
||||
{
|
||||
DumpLineNumbers( MakePtr(PIMAGE_LINENUMBER, pImageFileHeader,
|
||||
pSections->PointerToLinenumbers),
|
||||
pSections->NumberOfLinenumbers );
|
||||
printf("\n");
|
||||
}
|
||||
pSections++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( fShowSymbolTable )
|
||||
{
|
||||
DumpSymbolTable(PCOFFSymbolTable, COFFSymbolCount);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
if ( fShowRawSectionData )
|
||||
{
|
||||
DumpRawSectionData( (PIMAGE_SECTION_HEADER)(pImageFileHeader+1),
|
||||
pImageFileHeader,
|
||||
pImageFileHeader->NumberOfSections);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user