I did actually look up the COFF format and wrote a converter
It's very basic, but from testing with a debug build program it does the trick:-
Code:
// requires Win32 Platform SDK for structs and constants
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <time.h>
#include <windows.h>
int main(int argc, char **argv)
{
char szFilename[256], *szPtr;
int bLong = 0, iData;
unsigned long ulSize;
FILE *fpIn, *fpOut;
IMAGE_FILE_HEADER header;
IMAGE_SECTION_HEADER section;
IMAGE_SYMBOL symbol;
printf("Binary File -> Object File Converter\n");
if (argc < 3 || argc > 4)
{
printf("Usage: bin2obj <filename> <symbol> [output filename]\n");
return -1;
}
fpIn = fopen(argv[1], "rb");
if (!fpIn)
return -1;
fseek(fpIn, 0, SEEK_END);
ulSize = ftell(fpIn);
fseek(fpIn, 0, SEEK_SET);
header.Machine = IMAGE_FILE_MACHINE_I386;
header.NumberOfSections = 1;
header.TimeDateStamp = time(NULL); // really necessary?
header.PointerToSymbolTable = sizeof(header) + sizeof(section);
header.NumberOfSymbols = 1;
header.SizeOfOptionalHeader = 0;
header.Characteristics = 0;
memset(§ion, 0, sizeof(section));
memcpy(section.Name, ".data", 5);
section.SizeOfRawData = ulSize;
section.PointerToRawData = sizeof(header) + sizeof(section) + sizeof(symbol);
section.Characteristics = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE_SCN_CNT_INITIALIZED_DATA;
memset(&symbol, 0, sizeof(symbol));
// determine short/long symbol name storage
if (strlen(argv[2]) <= 8)
memcpy(symbol.N.ShortName, argv[2], strlen(argv[2]));
else
{
symbol.N.LongName[1] = 4;
section.PointerToRawData += strlen(argv[2]) + 5;
bLong = 1;
}
symbol.SectionNumber = 1;
symbol.StorageClass = IMAGE_SYM_CLASS_EXTERNAL;
// prepare output filename
if (argc == 4)
strcpy(szFilename, argv[3]);
else
{
// append extension to input filename
strcpy(szFilename, argv[1]);
szPtr = szFilename + strlen(szFilename) - 1;
while (szPtr > szFilename && *szPtr != '.')
szPtr--;
if (szPtr > szFilename)
strcpy(szPtr, ".obj");
else
strcat(szFilename, ".obj");
}
fpOut = fopen(szFilename, "wb");
if (!fpOut)
return -1;
fwrite(&header, sizeof(header), 1, fpOut);
fwrite(§ion, sizeof(section), 1, fpOut);
fwrite(&symbol, sizeof(symbol), 1, fpOut);
if (bLong)
{
ulSize = strlen(argv[2]) + 5;
fwrite(&ulSize, 4, 1, fpOut);
fwrite(argv[2], strlen(argv[2]) + 1, 1, fpOut);
}
while ((iData = getc(fpIn)) != EOF)
putc(iData, fpOut);
fclose(fpIn);
fclose(fpOut);
return 0;
}