数学建模社区-数学中国

标题: [转载]COFF文件格式(5) [打印本页]

作者: Blackbird    时间: 2005-9-17 14:06
标题: [转载]COFF文件格式(5)
<STRONG>
2 l& B* ]$ R3 e# s: C/ |. D6 {8 o0 i<><STRONG>重要声明:本文乃转载自其他社区,由于在下无法获得任何有关作者和出处的信息,所以不能在此登出,恳请作者原谅,并希望知情者能告知在下。本着资源的共享的精神,在下深信作者不会拒绝在下的转载行为。同时强烈BS数学中国的下载系统,它不但不能及时给予他人需要的帮助,还浪费了他人大量的时间,仅仅是为了获得无聊的点数,而且遗憾的是,那些点数并不能保证你真能获得帮助!</STRONG></P>
7 V1 s9 N/ q9 @  h" `3 [<></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>
) {- \$ V' i/ m3 i" g- i<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width="80%" align=center bgColor=#ffffff borderColorLight=#000000 border=1>3 S0 c% f3 X4 V/ T$ [; q4 ^" }
$ R" b/ y6 n1 J- _( T* _2 S: e
<TR>
% N& ?# J! v  I/ z2 S; z* l<TD vAlign=top width=55>值</TD>! e& s" w% p/ h$ E8 E
<TD vAlign=top width=72>名称 </TD>, o. m! R$ O. `# ~- Z
<TD vAlign=top width=441>说明</TD></TR>1 Y2 Y/ ?, I4 {% p+ H. x# b
<TR>
: r7 U4 r! y1 m$ w# M<TD vAlign=top width=55>NULL</TD>
% l; `+ f+ P5 S* A4 C<TD vAlign=top width=72>0</TD>
2 z0 K$ u! U4 K6 W7 O8 p+ J6 D7 a<TD vAlign=top width=441>无存储类型。</TD></TR>2 q3 w" _& [/ O- l) n4 D* K
<TR>5 \3 N/ ^# t' L
<TD vAlign=top width=55>AUTOMATIC</TD>, V/ V4 T0 ?2 z) c! s' F; u
<TD vAlign=top width=72>1</TD>
" _5 }8 f# b  b/ |# ?& g! |; i/ E<TD vAlign=top width=441>自动类型。通常是在栈中分配的变量。</TD></TR>
- G! P0 D3 w  p" u2 E. B<TR>
6 J! n; O. \* \* r# z1 a3 U, A<TD vAlign=top width=55>EXTERNAL</TD>- u! k, l$ Y7 m  K9 R4 R3 P
<TD vAlign=top width=72>2</TD>/ |" _4 ^# N. ]+ |0 O& d+ O+ O
<TD vAlign=top width=441>外部符号。当为外部符号时,iSection的值应该为0,如果不为0,则ulValue为符号在段中的偏移。</TD></TR>- _+ @, c% }! b0 j
<TR>* l6 X: e# O% N# _- ?
<TD vAlign=top width=55>STATIC</TD>
; q/ s- s/ @  H- @/ V<TD vAlign=top width=72>3</TD>
  ]3 X' ]1 C0 O+ L% q( H6 u$ g& d<TD vAlign=top width=441>静态类型。ulValue为符号在段中的偏移。如果偏移为0,那么这个符号代表段名。</TD></TR>' q% f) V$ l) j  d
<TR>1 g/ H, Q# ~, C" u8 \3 H3 K! x
<TD vAlign=top width=55>REGISTER</TD>
. b, D/ b9 ^: L% x$ r<TD vAlign=top width=72>4</TD>3 S& ^9 h$ a8 u3 V
<TD vAlign=top width=441>寄存器变量。</TD></TR>
+ J% H& Y  l. @" |1 }# z. @<TR>
, n5 j/ Z  B; o' Q  o' N<TD vAlign=top width=55>MEMBER_OF_STRUCT</TD>
" C+ j% F9 }: l# s, N; C<TD vAlign=top width=72>8</TD>
& n! x- D9 [' E9 p) c<TD vAlign=top width=441>结构成员。ulValue值为该符号在结构中的顺序。</TD></TR>8 Y' U1 p8 C- f6 R; v
<TR>1 n/ c& ?9 E# d  Z5 e
<TD vAlign=top width=55>STRUCT_TAG</TD>) D# B2 a- R* z
<TD vAlign=top width=72>10</TD>  F% Y0 u' J' \- b8 l
<TD vAlign=top width=441>结构标识符。</TD></TR>3 p8 v% n  e/ \: a/ k- g. ^
<TR>9 U, d# Z* b$ d5 n3 y
<TD vAlign=top width=55>MEMBER_OF_UNION</TD>
* e6 `/ `2 ]( a$ _# |3 |<TD vAlign=top width=72>11</TD>
1 [3 a) H# A& K9 D<TD vAlign=top width=441>联合成员。ulValue值为该符号在联合中的顺序。</TD></TR>+ `1 y2 G2 [& B. i
<TR>
* X$ m/ J8 Y4 f* U" Z" V; @+ a9 Y<TD vAlign=top width=55>UNION_TAG</TD>
" J4 F% a# l, X3 |: o<TD vAlign=top width=72>12</TD>
5 e9 A, b/ G+ s7 N/ q<TD vAlign=top width=441>联合标识符。</TD></TR>
8 v, }& W+ \( {' _( ^; z# G# q<TR>. T. h& h6 j# i$ ~; p4 ?9 E
<TD vAlign=top width=55>TYPE_DEFINITION</TD>
0 k9 c7 U: B% H+ J( M/ Y- K<TD vAlign=top width=72>13</TD>$ H5 ]) |. _; O" _& P/ \+ A" T
<TD vAlign=top width=441>类型定义。</TD></TR>
/ Z: X# f0 F4 o: }2 y6 W" m: X<TR>
! ^* m* P" w( R6 W- v, y1 R<TD vAlign=top width=55>FUNCTION</TD>
$ s, l3 f6 y# N: n<TD vAlign=top width=72>101</TD>$ q2 \; D! ?1 ]: y. `
<TD vAlign=top width=441>函数名。</TD></TR>
( X) v# T1 R$ n3 p: d<TR>+ X7 l8 Z; x# |
<TD vAlign=top width=55>FILE</TD>
# {8 z6 A$ F  `! p6 Q6 C. L9 I$ A, @<TD vAlign=top width=72>102</TD>* a) U0 O- }" U: ]0 n9 ^: [0 {3 }9 S: t
<TD vAlign=top width=441>文件名。</TD></TR></TABLE>
' `* A4 X; L: z9 e1 u$ A( ^3 z1 B+ o4 m<DIV>    最后一个成员usNumAux是附加记录的数量。附加记录是用来描述符号的一些附加信息,为了便于保存,这些附加记录通常选择成为一条符号信息记录的整数倍(多数为1)。所以,如果这个成员的值为1,那么就表示在当前符号信息记录后附加了一条记录,用来保存附加信息。<br>    附加信息的结构是与符号的类型以及存储类型相关的。不同的类型的符号,其附加信息(如果有的话)的结构也不同。如果你不在意这些内容,也可以把它们乎略。<br>     当段的类型为FILE时,附加信息就是一个字符串,它是目标文件对应源文件的名称。其它类型在介绍PE时再进行详细讨论。</DIV>. {$ v$ u* ?9 g, G# X8 g0 ~6 ~
[此贴子已经被作者于2005-9-17 14:53:44编辑过]

作者: cupidvenus    时间: 2005-9-23 13:37
学习




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5