><STRONG>重要声明:本文乃转载自其他社区,由于在下无法获得任何有关作者和出处的信息,所以不能在此登出,恳请作者原谅,并希望知情者能告知在下。本着资源的共享的精神,在下深信作者不会拒绝在下的转载行为。同时强烈BS数学中国的下载系统,它不但不能及时给予他人需要的帮助,还浪费了他人大量的时间,仅仅是为了获得无聊的点数,而且遗憾的是,那些点数并不能保证你真能获得帮助!</STRONG></P>
>下面让我们来仔细看看每一小节的内容:</P>
><STRONG>First Sec<BR></STRONG> 第一节,通常就是Lib中的每一个小节。它的名称是“/”。其数据部分的结构如下:<BR> typedef struct {<BR> unsigned long SymbolNum; // 库中符号的数量<BR> unsigned long SymbolOffset[n]; // 符号所在目标节的偏移<BR> char StrTable[m]; // 符号名称字符串表<BR> }FirstSec;<BR> 第一个成员SymbolNum是符号的数量。注意!它是以Big-Endian方式储存的(x86平台上的数据是以Little-Endian方式储存的。这里应该注意转换。后面给出的convert函数可以在Little-Endian格式与Big-Endian格式之间进行相互转换)。<BR> 第二个成员SymbolOffset是一个数组,它的长度n就是符号的数量,也就是SymbolNum。这个数组储存了每一个符号所在的目标节的偏移。我们可以方便地通过它来查找符号所在的目标文件。注意!它也是以Big-Endian格式储存的。<BR> 第三个成员StrTable是一个字符串表,它的长度m就是SectionHeader.Size的值减去(SymbolNum+1)*4。其结构很简单,就是一堆以‘\0’结尾的字符串(和COFF文件中的字符串表结构相同)。在有的系统中,它还可能是以“/\n”这两个字符结尾的字符串的集合。<BR> 很简单的一个结构,不过有两个成员的长度是不定的。怎么才能方便地从Lib中读出这些数据,留给大家自己想吧!下面我只给出一个进行Little-Endian与Big-Endian互转的函数。<BR> inline void convert(void * p // 要转换的数据的指针<BR> ,size_t size = 4 // 数据的长度,long为4,short为2<BR> ) {<BR> char * buf=(char*)p;<BR> char temp;<BR> for ( size_t i=0;i<size/2;i++ ) {<BR> temp=buf;<BR> buf=buf[size-i-1];<BR> buf[size-i-1]=temp;<BR> }<BR> } </P>| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |