- UID
- 1
- 精华
- 积分
- 76361
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
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[8]; //段名
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[8];
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[dwSize]; //字串表(每个字串都有个'\0'结尾) |
|