- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
根据网上的资料做了个实验:实验代码如下:int printf(const char* format, ...);int global_init_var = 64;int global_unint_var;void func1(int i){printf(%d\n, i);}int main(void){static int static_var = 85;static int static_var1 = 90;static char static_char = B;static int static_var2;int a = 1;int b;func1(static_var + static_var2 + a + b);return a;} 将此代码编译,得到obj文件,用WinHex打开obj文件分析。从VS进入其命令提示符(为了使用dumpbin工具),进入obj所在目录,输入以下命令:dumpbin main.obj /HEADERS可以得到obj的所有节(SECTION)的描述结构,即节头上图是整个文件头得信息1.节1的信息2.节3(.bbs)的信息其file pointer to raw data的值为0,说明bss段在obj文件中并未占据空间,size of raw data 表明的是为其预留的空间3.节4(.data)其file pointer to raw data的值为 779(十六进制,即相对obj文件起始位置的便宜),size of raw data为D(十六进制),由代码可知,我们总共定义了1个全局变量,3个静态局部变量,总大小即4*3+1 = 13 即十六进制的D,用WinHex查看可知是对的。40 00 00 00 即64,55 00 00 00即85,5A 00 00 00即90,42即字母B4.节5(.text)5.节7(.rdata)此节即只读数据区,根据PointerToRawData,我们找到rdata段的数据如下: 25 64 0A 00翻译成ascii码就是%d\n,就是printf中用到的字符串常量。如果用.c编译出来的obj,我们会发现没有rdata这个段,再仔细看会发现%d\n被放到了.data段,所以用.c编译出来的obj只有一个data段。6.节10(.text)总共是13个节其中有3个debug $S节,2个.text节,2个.data节节的结构Name: 在.text中,我们看到Name: 2E 74 65 78 74, 对应的字符串就是.text,就是代码段。VirtualSize:当加载进内存时这个节的总大小。这个域仅对可执行映像是合法的,对于目标文件来说,它应该为0。VirtualAddress:对于可执行映像来说,这个域的值是这个节被加载进内存之后它的第一个字节相对于映像基址的偏移地址。对于目标文件来说,这个域的值是没有重定位之前其第一个字节的地址;为了简单起见,编译器应该把此值设置为0。SizeOfRawData:节的大小。PointerToRawData:该段数据存放的位置。PointerToRelocations:重定位表的位置,稍后介绍。PointerToLinenumbers:行号表,Microsoft的工具已经不再生成COFF行号信息,并且以后也不会再使用它了。NumberOfRelocations:重定位表的大小(个数)。NumberOfLinenumbers:行号表的大小(个数),同样不会再使用。Characteristics:段的特性,比如段的类型(代码、数据、bss),对齐方式及可读可写可执行等权限。由截图可知,在raw data 之后就是relocation table重定位表重定位表的结构如下VirtualAddress是重定位符号在节中的偏移以下是节6和节7由上面2图可得节6的重定位表的偏移是8B7(16进制),其大小是5*10 = 50 (即16进制32),8B7 + 32 = 8E9 即节7的raw data的偏移符号表:概括信息符号表的结构有上面的图可知第一列是在符号表中的偏移,第二列是在所在节的偏移,第三列是所在节等等检验偏移010到012 是节4(.data)的3个变量在所有的raw data + relocation table 之后是symbol table由上述可知symbol table的偏移是C38而最后一个节的数据的最后一位偏移刚好是C37字符串表在obj文件的最末端符号表和字符串表之间的数据不知道是什么……
文档评论(0)