1.首先vs 2013建立工程生成obj文件,如下圖。
2.打開CMD命令行模式,用工具dumpbin執行以下命令對test.obj進行解析。
dumpbin /all test.obj > test.txt
obj解析信息會保存在test.txt文件中。
obj文件它的格式其實就是COFF(通用對象文件格式)文件格式。
先來看一下COFF文件的整體結構,看看它到底長得什么樣!
File Header
Optional Header
Section Header 1
......
Section Header n
Section Data
Relocation Directives
Line Numbers
Symbol Table
String Table
3.在vs2013中,winnt.h定義了coff文件格式相對應的結構體,現在來分析:
File Header:

上述信息只是給出了file header的信息,它對應的結構體,在winnt.h中是
1 typedef struct _IMAGE_FILE_HEADER { 2 WORD Machine; 3 WORD NumberOfSections; 4 DWORD TimeDateStamp; 5 DWORD PointerToSymbolTable; 6 DWORD NumberOfSymbols; 7 WORD SizeOfOptionalHeader; 8 WORD Characteristics; 9 } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
用winhex文件打開test.obj文件
Option Header值為0,所以沒有。
Section Header:
#節1
對應結構體:
1 typedef struct _IMAGE_SECTION_HEADER { 2 BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; 3 union { 4 DWORD PhysicalAddress; 5 DWORD VirtualSize; 6 } Misc; 7 DWORD VirtualAddress; 8 DWORD SizeOfRawData; 9 DWORD PointerToRawData; 10 DWORD PointerToRelocations; 11 DWORD PointerToLinenumbers; 12 WORD NumberOfRelocations; 13 WORD NumberOfLinenumbers; 14 DWORD Characteristics; 15 } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
#節2
#節3
#節4
上述四個節沒有”行號項“和”重定位項“
#節5
這個節有5個重定位項,有不同的類型Type,在raw data中用 00 填充,在鏈接時,該出數字會進行改變。
重定位結構體如下:
typedef struct _IMAGE_BASE_RELOCATION { DWORD VirtualAddress; DWORD SizeOfBlock; // WORD TypeOffset[1]; } IMAGE_BASE_RELOCATION; typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;
#節6
#節7
#節8
#節9
#節A
Symbol Table:
符號表的數據結構
typedef struct _IMAGE_SYMBOL { union { BYTE ShortName[8]; struct { DWORD Short; // if 0, use LongName DWORD Long; // offset into string table } Name; DWORD LongName[2]; // PBYTE [2] } N; DWORD Value; SHORT SectionNumber; WORD Type; BYTE StorageClass; BYTE NumberOfAuxSymbols; } IMAGE_SYMBOL; typedef IMAGE_SYMBOL UNALIGNED *PIMAGE_SYMBOL;
String Table:
字符串表前四個字節表示字符串表的長度,上圖中的0xA5。
4.最后的文件布局如下圖: