QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3117|回复: 1
打印 上一主题 下一主题

[转载]COFF文件格式(3)

[复制链接]
字体大小: 正常 放大
Blackbird        

8

主题

2

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-9-17 14:00 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<STRONG>
" P3 V- }# p% h! c3 X: p5 u<><STRONG>重要声明:本文乃转载自其他社区,由于在下无法获得任何有关作者和出处的信息,所以不能在此登出,恳请作者原谅,并希望知情者能告知在下。本着资源的共享的精神,在下深信作者不会拒绝在下的转载行为。同时强烈BS数学中国的下载系统,它不但不能及时给予他人需要的帮助,还浪费了他人大量的时间,仅仅是为了获得无聊的点数,而且遗憾的是,那些点数并不能保证你真能获得帮助!</STRONG></P></STRONG>
9 v- v3 R, Q9 a$ F' H2 p<><STRONG>段落头<br></STRONG>    段落头紧跟在可选头的后面(如果可选头的长度为0,那么它就是紧跟在文件头后)。它的长度为36个字节,如下:<br>typedef struct {<br>  char           cName[8];  // 段名<br>  unsigned long  ulVSize;  // 虚拟大小<br>  unsigned long  ulVAddr;  // 虚拟地址<br>  unsigned long  ulSize;  // 段长度<br>  unsigned long  ulSecOffset;  // 段数据偏移<br>  unsigned long  ulRelOffset;  // 段重定位表偏移<br>  unsigned long  ulLNOffset;  // 行号表偏移<br>  unsigned short ulNumRel;  // 重定位表长度<br>  unsigned short ulNumLN;  // 行号表长度<br>  unsigned long  ulFlags;  // 段标识<br>} SECHDR;<br>    这个头可是个重要的头头,我们要用到的最终信息就由它来描述。一个COFF文件可以不要其它的节,但文件头和段落头这两节是必不可少的。<br>    cName用来保存段名,常用的段名有.text,.data,.comment,.bss等。.text段是正文段,通常也就是代码段;.data是数据段,在这个数据段中所保存的数据是初始化过的数据;.bss段也可以用来保存数据,不过这里的数据是未初始化的,这个段也是一个空段;.comment段,看名字也知道,它是注释段,用来保存一些编译信息,算是对COFF文件的注释。<br>    ulVSize是段数据载入内存时的大小。只在可执行文件中有效,在目标文件中总为0。如果它的长度大于段的实际长度,则多的部分将用0来填充。<br>    ulVAddr是段数据载入或连接时的虚拟地址。对于可执行文件来说,这个地址是相对于它的地址空间而言。当可执行文件被载入内存时,这个地址就是段中数据的第一个字节的位置。而对于目标文件而言,这只是重定位时,段数据当前位置的一个偏移量。为了计算方便,便定位的计算简化,它通常设为0。<br>    ulSize这才是段中数据的实际长度,也就是段数据的长度,在读取段数据时就由它来确定要读多少字节。<br>    ulSecOffset是段数据在COFF文件中的偏移量。<br>    ulRelOffset是该段的重定位信息的偏移量。它指向了重定位表的一个记录。<br>    ulLNOffset是该段的行号表的偏移量。它指向的是行号表中的一个记录。<br>    ulNumRel是重定位信息的记录数。从ulRelOffset指向的记录开始,到第ulNumRel个记录为止,都是该段的重定位信息。<br>    ulNumLN和ulNumRel相似。不过它是行号信息的记录数。<br>    ulFlags是该段的属性标识。其值如下表:<br></P>
! ]* ^# `8 O) |: [5 P<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width="80%" align=center bgColor=#ffffff borderColorLight=#000000 border=1>% m" d& g4 l2 K7 X

3 b, z: y9 i* c, `<TR>' F/ N% \7 [# k7 ]% K( e% T
<TD vAlign=top width=55>值</TD>
8 U7 n$ i+ n, J# M<TD vAlign=top width=72>名称 </TD>( z( B3 ]* y! Q! _! m7 i6 ^
<TD vAlign=top width=441>说明</TD></TR>
; Q9 g# g0 r9 M% {* X* `<TR>; B% M3 d2 g; e8 I6 y: Q0 ?1 C
<TD vAlign=top width=55>0x0020</TD>' x- J& G' C+ \  r1 H  @# Y% ~
<TD vAlign=top width=72>STYP_TEXT</TD>- p7 _2 K& H; _: r" Q
<TD vAlign=top width=441>正文段标识,说明该段是代码。</TD></TR>
, p0 k, H8 o$ D/ [% K  ?# o/ G8 j<TR>
% \. o" X4 N! j<TD vAlign=top width=55>0x0040 </TD>! K5 m! W( K" K) p: t2 c# x
<TD vAlign=top width=72>STYP_DATA </TD>
8 ]7 ^( P+ h1 @4 e, r+ B8 a<TD vAlign=top width=441>数据段标识,有些标识的段将用来保存已初始化数据。</TD></TR>
+ d/ W) _# f$ |- l<TR>& H8 r$ v' q; R& I; g
<TD vAlign=top width=55>0x0080 </TD>/ \  \! S# D6 C. H9 s) F. U
<TD vAlign=top width=72>STYP_BSS</TD>4 i! `2 l0 b1 A* L- N
<TD vAlign=top width=441>有这个标识段也是用来保存数据,不过这里的数据是未初始化数据。</TD></TR></TABLE>    注意,在BSS段中,ulVSize、ulVAddr、ulSize、ulSecOffset、ulRelOffset、ulLNOffset、ulNumRel、ulNumLN的值都为0。(上表只是部分值,其它值在PE格式中介绍,后同)<br>
% }/ L6 N2 `; K; t" T1 C& C<DIV><br>    <STRONG>段数据</STRONG><br>    “人”如其名,这里是保存各个段的数据的位置。不同类型的段,数据的内容、结构也不尽相同。但在目标文件中,这些数据都是原始数据(Raw Data)。不存在什么特别的格式。<br></DIV>7 s, r6 ~+ [( X  Q" I
[此贴子已经被作者于2005-9-17 14:51:03编辑过]
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

1

主题

2

听众

60

积分

升级  57.89%

该用户从未签到

新人进步奖

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-20 01:12 , Processed in 0.433091 second(s), 58 queries .

回顶部