0xAA55 发表于 2014-1-26 18:27:55

COFF的OBJ文件格式

COFF的OBJ文件格式

1、文件概览
    文件头
    可选头(有、无)
    段落表(有很多个)
    段落数据(大小取决于段落表)
    重定位表(大小取决于段落表)
    行号表(大小取决于段落表)
    符号表
    字符串表

2、文件头格式
WORD wTarget; //目标
WORD wNbSections; //段落数
DWORD dwTimeStamp; //时间戳
DWORD dwSymbolTableOffset; //符号表的绝对偏移
DWORD dwNbSymbols; //符号表项数
WORD wOptHeadSize; //可选头大小
WORD wFlags; //标记

3、可选头格式(同PE可选头)
WORD wMagic; //魔法数字(同PE可选头魔法数字)
WORD wVersion; //版本标识
DWORD dwTextSize; //代码段大小
DWORD dwDataSize; //数据段大小
DWORD dwBssSize; //未初始化数据段大小
DWORD dwEntry; //入口点
DWORD dwTextBase; //代码段基址
DWORD dwDataBase; //数据段基址

4、段落表(有wNbSections个)
char szSecName; //段名
DWORD dwVirSize; //虚拟大小
DWORD dwVirAddr; //虚拟地址
DWORD dwSize; //大小
DWORD dwDataOffset; //数据在文件中的绝对偏移
DWORD dwRelocTableOffset; //重定向表在文件中的绝对偏移
DWORD dwLineTableOffset; //行号表在文件中的绝对偏移
WORD wNbRelocItems; //重定向表项数量
WORD wNbLineItems; //行号表项数量
DWORD dwSecFlags; //段标记

5、段落数据
段落数据的大小取决于所有段落表dwSize值的总和。
段落表的dwDataOffset指向段落数据,dwSize是大小。

6、重定位表(所有段落wNbRelocItems的总和个)
DWORD dwAddr; //定位偏移
DWORD dwSymbolIndex; //符号索引
WORD wType; //类型
注:wType的值如下:
#define RELOC_ADDR32 6 //32位绝对定位
#define RELOC_REL32 20 //32位相对定位

7、行号表(所有段落wNbLineItems的总和个)
DWORD dwAddrOrSymbolIndex; //代码地址或符号索引
WORD wLineNo; //行号
注:如果行号为0,则dwAddrOrSymbolIndex是符号索引,否则是代码地址

8、符号表
union
{
    char szSymName;
    struct
    {
        DWORD dwInStringTable; //如果这个值为0则符号名称在字串表,否则szSymName为符号名。
        DWORD dwStringTableOffset;
    }StringTableFlags;
}SymbolName;
DWORD dwValue; //值
INT16 i16SecIndex; //段索引
WORD wSymType; //符号类型
BYTE bSymClass; //0=NULL 1=AUTOMATIC 2=EXTERNAL 3=STATIC 4=REGISTER 8=MEMBER_OF_STRUCT(dwValue为结构体的成员顺序) 10=STRUCT_TAG结构标识符11=MEMBER_OF_UNION 12=UNION_TAG 13=TYPE_DEFINITION 101=FUNCTION 102=FILE
BYTE bSymAux; //符号附加数据数量
注:符号表在OBJ中的存储方式为18字节一个符号表项。其中bSymAux的值表示这个符号表项占用后面符号表项的数量。
一个符号表项的实际大小为18+18*bSymAux
dwNbSymbols的值其实只是整个符号表大小/18。

9、字串表
DWORD dwSize; //字串表大小
char szString; //字串表(每个字串都有个'\0'结尾)

woeoio 发表于 2024-7-2 05:45:07

good east west
页: [1]
查看完整版本: COFF的OBJ文件格式