windows obj文件格式解析
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.最后的文件布局如下图: