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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM