QQ登录

只需要一步,快速开始

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

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

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

8

主题

2

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-9-17 14:06 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<STRONG>9 e+ P9 p  o* R8 b' x5 L1 m
<><STRONG>重要声明:本文乃转载自其他社区,由于在下无法获得任何有关作者和出处的信息,所以不能在此登出,恳请作者原谅,并希望知情者能告知在下。本着资源的共享的精神,在下深信作者不会拒绝在下的转载行为。同时强烈BS数学中国的下载系统,它不但不能及时给予他人需要的帮助,还浪费了他人大量的时间,仅仅是为了获得无聊的点数,而且遗憾的是,那些点数并不能保证你真能获得帮助!</STRONG></P>
% y5 Q) M( V% ~  D, e; T+ `* c<></STRONG><STRONG>符号表<br></STRONG>    符号表是对象文件中用来保存符号信息的一张表,也是COFF文件中最为复杂的一张表。所有段落使用到的符号都在这个表里。它也是由很多条记录组成,每条记录都以如下结构保存:<br>typedef struct {<br>  union {<br>    char cName[8];            // 符号名称<br>    struct {<br>      unsigned long ulZero;   // 字符串表标识<br>      unsigned long ulOffset; // 字符串偏移<br>    } e;<br>  } e;<br>  unsigned long ulValue;     // 符号值<br>  short iSection;            // 符号所在段<br>  unsigned short usType;     // 符号类型<br>  unsigned char usClass;     // 符号存储类型<br>  unsigned char usNumAux;    // 符号附加记录数<br>} SYMENT;<br>    cName符号名称,和前面所有的名称一样,它也是8个字节,但不同的是它在一个联合体中。和它占相同的存储空间的还有ulZero和ulOffset这两个成员。如果符号的名称只有8个字符,那很好,可以直接放到这个cName中;可是,如果名称的长度大于8个字节,这里就放不下了,只好放到字符串表中。这时候,ulZero的值就会为0,而在ulOffset中会给出我们所用的符号的名称在字符串表中的偏移。<br>    一个符号有了名称不够,它还要有值!ulValue就是这个符号所代表的值。<br>    iSection成员指出了这个符号所在的段落。如果它的值为0,那么这个符号就是一个外部符号,要从其它的COFF文件中解析(连接多个目标文件就是要解析这种符号)。当它的值为-1时,说明这个符号的值是一个常量,不是它在段落中的偏移。而当它的值为-2时,这个符号只是一个调试符号,只有在调试时才会用到它。当它大于0时,才是符号所在段的索引值。<br>    usType是符号的类型标识。它用来说明这个符号的类型,是函数?整型?还是其它什么。这个标识是两个字节。<br>    低字节的低四位是基本标识,它指出了符号的基本类型,如整型,字符,结构,联合等。高四位指出了符号的高级类型,如指针(0001b),函数(0010b),数组(0011b),无类型(0000b)等。现在的编译器,通常不使用基本类型,只使用高级类型。所以,符号的基本类型通常被设为0。<br>高字节通常未用。<br>    usClass是符号的存储类型标识。它指明了符号的存储方式。<br>    其值与意义见下表:<br></P>9 S% {$ M2 ]1 f% k: _. n
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width="80%" align=center bgColor=#ffffff borderColorLight=#000000 border=1>/ D, u8 z+ W" c: {6 y+ h

2 z- \6 f( L* R. O<TR>& [( d: v, s/ m& h5 ^% G
<TD vAlign=top width=55>值</TD>
) B( S  @9 e0 j% U9 Y6 `  l<TD vAlign=top width=72>名称 </TD>/ M7 O$ _) ^! E( x- J6 y
<TD vAlign=top width=441>说明</TD></TR>
" i) d2 a7 K; w5 ]+ n- Q7 K; f<TR>
+ H0 ^; w  I# ]! n+ l# j- W3 }8 @- l<TD vAlign=top width=55>NULL</TD>
4 L  y* E, J5 }7 k- w  A/ j) q' r9 g<TD vAlign=top width=72>0</TD>: f" o- `, ?% R: V) _
<TD vAlign=top width=441>无存储类型。</TD></TR>2 H% U# N" [7 j; S; |4 ~* z6 c
<TR>
2 M0 S; U( e- i9 U- Y<TD vAlign=top width=55>AUTOMATIC</TD>
: q3 J" t& B1 a, w/ ]<TD vAlign=top width=72>1</TD>5 H5 \- |, Z, g/ [7 G$ r+ Z
<TD vAlign=top width=441>自动类型。通常是在栈中分配的变量。</TD></TR>- {  p3 [7 j1 @+ K- ?" U0 g
<TR>
, g4 y9 P4 X( ^% a3 o<TD vAlign=top width=55>EXTERNAL</TD>
7 d% A- }8 ^  Y5 ]* d9 ?) }2 J<TD vAlign=top width=72>2</TD>/ u. B- i. |7 t( K
<TD vAlign=top width=441>外部符号。当为外部符号时,iSection的值应该为0,如果不为0,则ulValue为符号在段中的偏移。</TD></TR>
( }6 t4 ~8 ]) J( r<TR>
" s. l% a0 H, G) {/ ^' S: K<TD vAlign=top width=55>STATIC</TD>& V0 `, U. G0 z3 X7 o( }0 }
<TD vAlign=top width=72>3</TD>+ A2 F5 [3 E  s1 b, j0 _+ W
<TD vAlign=top width=441>静态类型。ulValue为符号在段中的偏移。如果偏移为0,那么这个符号代表段名。</TD></TR>
$ e. u. o/ Y' v) F4 t0 T: {<TR>$ C/ g- T/ ~0 h. k! Y1 |
<TD vAlign=top width=55>REGISTER</TD>- r; w: C" e  D
<TD vAlign=top width=72>4</TD>
& e& o- S0 w) f! c7 h4 C5 k<TD vAlign=top width=441>寄存器变量。</TD></TR>' l7 r; s3 y$ j4 w* w
<TR>3 G; I+ P6 ~, i$ _7 Q
<TD vAlign=top width=55>MEMBER_OF_STRUCT</TD>
/ d3 J0 d4 t! H( [  C! g<TD vAlign=top width=72>8</TD>  r, C4 M- |. z5 I' t  g# Z
<TD vAlign=top width=441>结构成员。ulValue值为该符号在结构中的顺序。</TD></TR>( w5 H  {2 Y7 ]9 W2 Q8 J" _2 R. S/ h9 N) m
<TR>
* s7 s9 _0 l% k9 W( f( A3 y<TD vAlign=top width=55>STRUCT_TAG</TD>
1 v/ u% f5 h! ]3 J" k/ J6 ?<TD vAlign=top width=72>10</TD>
- S5 d* f1 Z& q4 Q<TD vAlign=top width=441>结构标识符。</TD></TR>9 L) t! A! H; Z& K9 r1 p( E$ D
<TR>% f6 Y/ x" Y4 P" x
<TD vAlign=top width=55>MEMBER_OF_UNION</TD>- M! K6 ?* L/ y$ h) o- ]
<TD vAlign=top width=72>11</TD>
" O9 L) Q! n- ]1 q! t<TD vAlign=top width=441>联合成员。ulValue值为该符号在联合中的顺序。</TD></TR>/ a) L9 Y  }% w7 Q0 w7 S2 g) @
<TR>
  o$ {% j9 x# Y; v0 M: u- u<TD vAlign=top width=55>UNION_TAG</TD>: m8 w  r3 j& b: g5 k& I9 |
<TD vAlign=top width=72>12</TD>5 Z# b( U' ~. f: g7 \3 v
<TD vAlign=top width=441>联合标识符。</TD></TR>4 @* h& D1 r. I4 H  H
<TR>
0 J) y( l4 Z7 A) C: g9 b<TD vAlign=top width=55>TYPE_DEFINITION</TD># V4 ?2 {' c1 s8 z0 p
<TD vAlign=top width=72>13</TD>4 l! A) j1 S- }0 d+ Z( E. j
<TD vAlign=top width=441>类型定义。</TD></TR>
( B9 c% p& q% D) Q( P' O. \+ f* @) v<TR>* r% k$ `4 C0 t5 a$ J1 D
<TD vAlign=top width=55>FUNCTION</TD>4 P. N5 j. d8 v  q7 @3 A+ s/ O. c
<TD vAlign=top width=72>101</TD>$ l( P5 P& l$ K# w5 h9 w
<TD vAlign=top width=441>函数名。</TD></TR>
1 \9 l" U- C- l8 K4 w<TR>
5 M6 M# u. }# g5 h% l0 _<TD vAlign=top width=55>FILE</TD>
3 k( W0 x& z5 I. k/ O% z" S<TD vAlign=top width=72>102</TD>
; F" B8 o" S' K; z9 i$ J  A<TD vAlign=top width=441>文件名。</TD></TR></TABLE>
  ]% }( p7 s$ b4 v/ l  N<DIV>    最后一个成员usNumAux是附加记录的数量。附加记录是用来描述符号的一些附加信息,为了便于保存,这些附加记录通常选择成为一条符号信息记录的整数倍(多数为1)。所以,如果这个成员的值为1,那么就表示在当前符号信息记录后附加了一条记录,用来保存附加信息。<br>    附加信息的结构是与符号的类型以及存储类型相关的。不同的类型的符号,其附加信息(如果有的话)的结构也不同。如果你不在意这些内容,也可以把它们乎略。<br>     当段的类型为FILE时,附加信息就是一个字符串,它是目标文件对应源文件的名称。其它类型在介绍PE时再进行详细讨论。</DIV>
3 }, A3 u! q- Q
[此贴子已经被作者于2005-9-17 14:53:44编辑过]
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-22 20:20 , Processed in 0.779420 second(s), 58 queries .

回顶部