程序员的自我修养2--目标文件.docx

程序员的自我修养2--目标文件.docx

ID:51436855

大小:598.64 KB

页数:18页

时间:2020-03-24

程序员的自我修养2--目标文件.docx_第1页
程序员的自我修养2--目标文件.docx_第2页
程序员的自我修养2--目标文件.docx_第3页
程序员的自我修养2--目标文件.docx_第4页
程序员的自我修养2--目标文件.docx_第5页
资源描述:

《程序员的自我修养2--目标文件.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、程序员的自我修养2—目标文件TableofContents1、概述目标文件格式与结构12、举例说明目标文件中的各段3①编译并生成目标文件3②使用objdump-h命令查看各段基本情况4③使用objdump–s–d挖掘各段内容53、文件头84、段表95、重定位表:116、字符串表:117、链接的接口:符号与符号表118、符号修饰与函数签名149、强符号与弱符号、强引用与弱引用1510、调试信息:1611、用到的命令:1712动态存储变量和寄存器变量171、概述目标文件格式与结构目标文件(win.obj/linux.o)里有什么?或者说源代码在编

2、译后是怎么存储的?格式:已经是可执行文件的格式,只是没有经过链接,其中有符号或者地址没有被调整,本身按照可执行文件格式存储。现在流行的可执行文件的格式,在windows平台下是PE,在linux平台下是ELF格式,前者是扩展名为.exe的文件后者无扩展名。程序员的自我修养2—目标文件不光可执行文件和目标文件按照这种格式存储,动态链接库(win.dll/linux.so)和静态链接库(win.lib/linux.a)。ELF文件标准把系统中使用ELF格式的文件归结为:relocatablefile(.o.a),executablefile,sh

3、areobjectfile(.so.dll)等。可以使用file命令查看文件格式。目标文件和可执行文件的格式发展历史几乎是OS发展史,Unix最早的可执行文件格式为a.out格式,设计很简单,到后来共享库的概念出现时,a.out格式越来越捉襟见肘了,于是设计了COFF格式来解决问题。UnixsystemVrelease3提出了COFF格式,微软基于COFF制订了PE标准,制定、协议、标准!!UnixsystemVrelease4在COFF的基础上引入了ELF格式。所以PE和ELF十分相似。COFF的主要贡献是在目标文件中引入了段机制,不同的文

4、件可以拥有不同数量及不同类型的段。我们猜想目标文件中至少有编译后的指令、数据!除这些之外,目标文件中还包含了链接时所需信息,如符号表、调试信息、字符串等。结构:文件内容按照不同的属性放在不同的section/segment,他们都是一定长度的区域,不加区别,唯一的区别实在ELF的链接视图和装载视图。代码段:.code/.text数据段:.data存放初始化过的全局(静态)变量和静态局部变量.bss段比较特殊,它包含未初始化的静态变量,但并不是存储。因为未初始化的静态变量的值为0,在.data中开辟空间放它们是对磁盘的浪费。.bss段并不属于文

5、件内容,不占空间。记录了未初始化的静态变量的和,为它们预留空间,因为程序运行时需要它们。Filehead文件头描述了整个文件的属性,包括文件是否可执行、是静态链接还是动态链接(若可执行),目标硬件、目标操作系统等,文件头中还有包括段表,是描述文件中各段信息的数组,描述了各段在文件中的偏移位置及属性。代码和数据为什么要分开放?1、代码只读,数据可读写,当可执行文件被装载后,可以被映射到权限不同的存储空间。2、现代CPU的缓存机制,分指令cache和数据cache,提高命中率。3、当程序存在多个副本时,代码段共享,数据私有。程序员的自我修养2—目

6、标文件2、举例说明目标文件中的各段①编译并生成目标文件程序员的自我修养2—目标文件②使用objdump-h命令查看各段基本情况-h参数是将各段的基本信息打印出来(显示关键段、省略辅助性段)。-x会打印出更多的信息,但是又多又复杂。暂且忽略后三个段,先关注.txt/.data/.bss程序员的自我修养2—目标文件最容易理解的是段的长度Size,段所在的位置FileOffset。第二行是属性,CONTENTS表示该段在文件中存在。有一个专门的命令size可以查看ELF文件的代码段、数据段、BSS段。③使用objdump–s–d挖掘各段内容挖掘各段

7、的内容,我们还是离不开objdump这个利器,-s参数可以将所有段的内容以十六进制的形式打印出来,-d参数可以将包指令的段反汇编。最左边一列是偏移量,中间4列是十六进制内容,最右边一列是ASCII形式。对于代码段.text,共84字节的内容与size命令的结果一致。程序员的自我修养2—目标文件.Data段存放已经初始化了的全局(静态)变量和局部静态变量。前面一共两个这样的变量,每个变量4字节,所以一共8个字节。所以.data段一共8字节大小。.data段的54000000和55000000对应的是84和85,为什么不是00000054呢?这是

8、CPU的字节序的问题,也就是所以为的大小端问题。所谓的小端模式,是指数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中。我们在调用printf时,使用

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。