没有合适的资源?快使用搜索试试~ 我知道了~
COFF文件的格式,DSP学习着必看
5星 · 超过95%的资源 需积分: 49 42 下载量 116 浏览量
2009-08-22
09:19:36
上传
评论 2
收藏 79KB DOC 举报
温馨提示
试读
18页
硬件学习着必看的资料,详细介绍COFF文件格式,看了之后对DSP段的概念更好理解了
资源推荐
资源详情
资源评论
COFF 文件的格式
COFF – 通用对象文件格式(Common Object File Format),是一种很流
行的对象文件格式(注意:这里不说它是“目标”文件,是为了和编译器产生的
目标文件(*.o/*.obj)相区别,因为这种格式不只用于目标文件,库文件、可
执行文件也经常是这种格式)。大家可能会经常使用 VC 吧?它所产生的目标
文件(*.obj)就是这种格式。其它的编译器,如 GCC(GNU Compiler
Collection)、ICL(Intel C/C++ Compiler)、VectorC,也使用这种格式
的目标文件。不仅仅是 C/C++,很多其它语言也使用这种格式的对象文件。统
一格式的目标文件为混合语言编程带来了极大的方便。
当然,并不是只有这一种对象文件格式。常用格式的还有 OMF-对象模型文
件(Object Module File)以及 ELF-可执行及连接文件格式(Executable
and Linking Format)。OMF 是一大群 IT 巨头在 n 年制定的一种格式,在
Windows 平台上很常见。大家喜欢的 Borland 公司现在使用的目标文件就是
这种格式。MS 和 Intel 在 n 年前用的也是这种格式,现在都改投异侧,用
COFF 格式了。ELF 格式在非 Windows 平台上使用得比较多,在 Windows 平
台基本上没见过。做为程序员,很有必要认识一下这些你经常打交道的家伙!
不过这次让我介绍 COFF 先!‹‹‹‹‹COFF 的文件结构
让我们先来看一下 COFF 文件的整体结构,看看它到底长得什么样!‹
File Header
Optional
Header
Section Header
1
......
Section Header
n
Section Data
Relocation
Directives
Line Numbers
Symbol Table
String Table
如左图:
COFF 文件一共有 8 种数据,自上而下分别为:
1.文件头(File Header)
2.可选头(Optional Header)
3.段落头(Section Header)
4.段落数据(Section Data)
5.重定位表(Relocation Directives)
6.行号表(Line Numbers)
7.符号表(Symbol Table)
8.字符串表(String Table)
其中,除了段落头可以有多个节(因为可以有多个段落)以外,其它的所有
类型的节最多只能有一个。
文件头:顾名思义,它就是 COFF 文件的头,它用来保存 COFF 文件的基本
信息,如文件标识,各个表的位置等等。
可选头:再顾名思义,它也是一个头,还是可选的,而且可有可无。在目标
文件中,基本上都没有这个头;但在其它的文件中(如:可执行文件)这个段
用来保存在文件头中没有描述到的信息。
段落头:又顾……(不顾了,再顾有人要打我了 J),这个头(怎么这么多
的头啊?!)是用来描述段落信息的,每个段落都有一个段落头来描述。段落
的数目在文件头中会指出。
段落数据:这通常是 COFF 文件中最大的数据段,每个段落真正的数据就保
存在这个位置。至于怎么区分这些数据是哪个段落的,不要问我,去问段落头。
重定位表:这个表通常只存在于目标文件中,它用来描述 COFF 文件中符号
的重定位信息。至于为什么要重定位,请回家看看你的操作系统的书籍。
符号表:这个表用来保存 COFF 文件中所用到的所有符号的信息,连接多个
COFF 文件时,这个表帮助我们重定位符号。调试程序时也要用到它。
字符串表:不用我说,大家也知道它用来保存字符串的。可是字符串保存给
谁看呢?不知道了吧!?问我啊!J 符号表是以记录的形式来描述符号信息的,
但它只为符号名称留置了 8 个字符的空间,早期的小程序还将就能行,可在现
在的程序中,一个符号名动不动就数十个字符,8 个字符怎么能够?没办法,
只好把这些名称存在字符串表中。而符号表中只记录这些字符串的位置。
文件的结构大体上就是这样了。长得是丑了点,不过还算它的设计者有点远
见。可扩充性设计得不错,以致于沿用至今。了解了文件的整体结构,现在让
我们来逐个段落分析它。
文件头
文件头,自然是从文件的 0 偏移处开始,它的结构很简单。用 C 的结构描述
如下:
typedef struct {
unsigned short usMagic;// 魔法数字
unsigned short usNumSec;// 段落(Section)数
unsigned long ulTime;// 时间戳
unsigned long ulSymbolO>set;// 符号表偏移
unsigned long ulNumSymbol;// 符号数
unsigned short usOptHdrSZ;// 可选头长度
unsigned short usFlags;// 文件标记
} FILEHDR;
结构中 usMagic 成员是一个魔法数字(Magic Number),在 I386 平台
上的 COFF 文件中它的值为 0x014c。如果 COFF 文件头中魔法数字不为
0x014c,那就不用看了,这不是一个 I386 平台的 COFF 文件。其实这就是一
个平台标识。
第二个成员 usNumSec 是一个无符号短整型,它用来描述段落的数量。段
落头(Section Header)的数目就是它。
ulTime 成员是一个时间戳,它用来描述 COFF 文件的建立时间。当 COFF
文件为一个可执行文件时,这个时间戳经常用来当做一个加密用的比对标识。
ulSymbolO>set 是符号表在文件中的偏移量,这是一个绝对偏移量,要从
文件头开始计数。在 COFF 文件的其它节中,也存在这种偏移量,它们都是绝
对偏移量。
ulNumSymbol 成员给出了符号表中符号记录的数量。
usOptHdrSZ 是可选头的长度,通常它为 0。而可选头的类型也是从这个长
度得知的,针对不同的长度,我们就要选择不同的处理方式。
usFlag 是 COFF 文件的属性标记,它标识了 COFF 文件的类型,COFF 文
件中所保存的数据等等信息。
其值如下:
值 名称‹ 说明
0x000
1
F_RELFL
G
无重定位信息标记。这个标记指出 COFF 文
件中没有重定位信息。通常在目标文件中这个
标记们为 0,在可执行文件中为 1。‹
0x000
2
F_EXEC
可执行标记。这个标记指出‹COFF 文件中所
有符号已经解析,‹COFF 文件应该被认为是
可执行文件。‹
0x000
4
F_LNNO
文件中所有行号已经被去掉。‹
0x000
8
F_LSYM
S
文件中的符号信息已经被去掉。‹
0x010
0
F_AR32
WR
些标记指出文件是‹32 位的‹Little-Endian
COFF 文件。‹
注:Little-Endian,记不得它的中文名称了。它是指数据的排列方式。比如:
十六进制的 0x1234 以 Little-Endian 方式在内存中的顺序为 0x34 0x12。与
之相反的是 Big-Endian,这种方式下,在内存中的顺序是 0x12 0x34。
这个表的内容并不全面,但在目标文件中,常用的也就只有这些。其它的标记
我将在以后介绍 PE 格式时给出。
可选头
可选头接在文件头的后面,也就是从 COFF 文件的 0x0014 偏移处开始。长
度可以为 0。不同长度的可选头,其结构也不同。标准的可选头长度为 24 或
28 字节,通常是 28 啦。这里我就只介绍长度为 28 的可选头。(因为这种头
的长度是自定义的,不同的人定义的结果就不一样,我只能选一种最常用的头
来介绍,别的我也不知道)
这种头的结构如下:
剩余17页未读,继续阅读
资源评论
- zhujili7702013-05-05很好,很受用,谢谢
- uestc_xinyuan2012-11-28用上了 非常感谢 DSP的都应该看看
- chun_lian_ok2013-01-14看了下载的资源,感觉对自己很有帮助,非常感谢!
yujian2008
- 粉丝: 2
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功