< ><STRONG>重要声明:本文乃转载自其他社区,由于在下无法获得任何有关作者和出处的信息,所以不能在此登出,恳请作者原谅,并希望知情者能告知在下。本着资源的共享的精神,在下深信作者不会拒绝在下的转载行为。同时强烈BS数学中国的下载系统,它不但不能及时给予他人需要的帮助,还浪费了他人大量的时间,仅仅是为了获得无聊的点数,而且遗憾的是,那些点数并不能保证你真能获得帮助!</STRONG></P>4 Z8 V4 E$ _. c& Q. Y5 E u- ~
< ><STRONG>字符串表<br></STRONG> 不用多说,瞎子也能看出这个表是用来保存字符串的。它紧接在符号表后。至于为什么要保存字符串,前面已经说过了。这里就不再多说了,只说说字符串的保存格式。<br> 字符串表是所有节中最简单一节。如下图:</P>% j9 R9 n- P, U2 R m0 D
<DIV align=center>0 4 </DIV>
y" r& a+ f- j: n" L' |9 e<DIV>
9 A9 `8 a A: O3 |2 g ^" e# c3 B<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=162 align=center bgColor=#ffffff borderColorLight=#000000 border=1>& K5 Z! r( J/ n+ J) R8 U5 j) u- j$ D
. _+ u0 c, o# |% S1 k* |) C
<TR>' n: w9 M, ^2 M
<TD vAlign=top width=%50>字符串表长度</TD>/ b+ \1 X3 A# J5 Z/ a4 G% j9 {
<TD vAlign=top width=%50>字符串1\0</TD></TR>' t/ w1 p/ H6 N' K3 V, F8 N1 e8 l/ |
<TR>; M" W, _& X" Z( C/ r+ O
<TD vAlign=top width=%50>....</TD># R( |7 P9 H1 ~
<TD vAlign=top width=%50>字符串n\0</TD></TR></TD></TR></TABLE></DIV>9 {+ @% u2 g9 Z
<DIV><br> 字符串表的前四个字节是字符串表的长度,以字节为单位。其后就是以0结尾的字符串(C风格字符串)。要注意的是,字符串表的长度不仅仅是字符串的长度(这个长度要包括每个字符串后的‘\0’)的总合,它还包括这个长度域的四个字节。符号表中ulOffset成员所指出的偏移就是从字符串表起始处的偏移。比如:指像每一个字符串的符号,ulOffset的值总为4。<br> 下面给出的代码,是从字符串表中读取字符串的典型C代码。<br><br>int iStrlen,iCur=4; // iStrLen是字符串表的长度,iCur是当前字符串偏移<br>char *str; // 字符串表<br>read(fn, &iStrlen, 4); // 得到字符串表长度<br>str = (char *)malloc(iStrlen); // 为字符串表分配空间<br>while (iCur<iStrlen ) // 读字符串表,直到全部读入内存<br> iCur+=read(fn, str+iCur, iStrlen- iCur);<br>iCur=4; // 把当前字符串偏移指到每一个字符串<br>while (iCur<iStrlen ) { // 显示每一个字符串<br> printf("String offset 0x%04X : %s\n", iCur, str + iCur);<br> iCur+=(strlen(str+iCur)+1); // 计算偏移时不要忘了计算‘\0’字符所占的1个字节!<br>}<br>free(str); // 释放字符串表空间</DIV>1 e1 O4 ?# B3 R' W( v
<DIV> </DIV>
# m3 w& Q- a( o$ k+ v& f* b<DIV> 直到这里,整个COFF的结构已经全部介绍完了。很多了解PE格式的朋友一定会奇怪,好像少了很多内容!?是的,标准的COFF文件只有这么多的东西。但MS为了和DOS的可执行文件兼容,以及对可执行文件功能的扩展,在COFF格式中加了很多它自己的标准。让我差点就认不出COFF了。但了解了COFF文件以后,再来学习PE文件的格式,那就很简单了。<br> 想了解PE文件的格式?网上有很多它的资料,我将在本文的基础上再写几篇文章,分别介绍PE,OMF以及ELF的格式。<br> 现在大家可以自己动手,写一个COFF文件解析器或是一个简单的连接程序了!</DIV>4 \1 Z; w" m7 s6 z3 W: {3 i* [/ n, [
[此贴子已经被作者于2005-9-17 14:58:16编辑过] |