Oto przykład jak to zrobić, tylko zmień sobie RELATIVE_PATH na swój plik *.obj.
Program wypisuje nazwy wszystkich exportowanych symboli (funkcje, metody, stringi...)
reference: http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx
Program uruchomiony z IDE z (currentdir == projectdir) działa poprawnie
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#define RELATIVE_PATH "release\\coffreader.obj"
// nie 'zmanglowana' funkcja cdecl
extern "C" void _funkcja_extern_c_cdecl() {};
// nie 'zmanglowana' funkcja stdcall
extern "C" void __stdcall _funkcja_extern_c_stdcall_() {};
// 'zmanglowana' funkcja cdecl
void _funkcja_zmanglowana_() {};
// jakaś klasa...
class CSomeClass
{
public:
void SomeMethod(int SomeArg); // dodaj virtual :)
};
void CSomeClass::SomeMethod(int SomeArg) {}
int main()
{
DWORD d;
IMAGE_FILE_HEADER hdr;
HANDLE hFile = CreateFile(RELATIVE_PATH, GENERIC_READ,0,0,OPEN_EXISTING,0,0);
// wczytaj nagłówek COFF
ReadFile(hFile, &hdr, sizeof(hdr), &d,0);
// wczytaj wszystkie sekcje
DWORD sectionslen = hdr.NumberOfSections * sizeof(IMAGE_SECTION_HEADER);
IMAGE_SECTION_HEADER *sections = (IMAGE_SECTION_HEADER*)malloc(sectionslen);
ReadFile(hFile, sections, sectionslen, &d, 0);
// wczytaj wszystkie nazwy symboli
SetFilePointer(hFile, hdr.PointerToSymbolTable + (hdr.NumberOfSymbols * sizeof(IMAGE_SYMBOL)), 0, FILE_BEGIN);
DWORD dwSize;
// stringtable zaczyna się od i zawiera DWORD size
ReadFile(hFile, &dwSize, 4, &d,0);
char* names = (char*)malloc(dwSize+4);
ReadFile(hFile, names+4, dwSize, &d, 0);
// wypisz wszystkie globalne sybmole
// czyli te exportowane dla innych modułów
SetFilePointer(hFile, hdr.PointerToSymbolTable, 0, FILE_BEGIN);
for (DWORD s=0; s<hdr.NumberOfSymbols; s++)
{
IMAGE_SYMBOL symbol;
ReadFile(hFile, &symbol, sizeof(IMAGE_SYMBOL), &d,0);
// if (!SectionNumber) - symbol jest importowany
if ((symbol.SectionNumber > 0) && (symbol.StorageClass == IMAGE_SYM_CLASS_EXTERNAL))
{
if (symbol.N.Name.Short)
{
// nazwa symbolu ma max 8 znaków, znajduje się w strukturze
char sname[12]; sname[8] = 0;
strncpy(sname, (char*)&symbol.N.ShortName, 8);
printf("short: %s\n", sname);
}
else
{
// nazwa symbolu przekracza 8 znaków, znajduje się w stringtable
printf("%s\n", &names[(int)symbol.N.Name.Long]);
}
}
}
free(sections);
free(names);
CloseHandle(hFile);
return _getch();
}