找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 113128|回复: 0

COFF的OBJ文件格式

[复制链接]

1109

主题

1649

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24180 个
贡献
46222 次
宅之契约
0 份
在线时间
2294 小时
注册时间
2014-1-26
发表于 2014-1-26 18:27:55 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
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'结尾)
回复

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-3-28 21:49 , Processed in 0.037773 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表