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.最后的文件布局如下图:

 

 

posted @ 2019-06-20 20:57  pro_love  阅读(5181)  评论(0编辑  收藏  举报