程序员自我修养(2)

来源:互联网 发布:淘宝怎么加入游戏专营 编辑:程序博客网 时间:2024/05/21 13:07

第三章

PC平台流行的可执行文件格式

windows下的PE(Portable Executable)和linux下的ELF(Executable Linkable Format)

ELF文件类型

(1)可重定位文件(relocatable file) 包含了代码和数据,可以被用来链接成可执行文件或共享目标文件

例如:linux的.o ;windows的.obj ;静态链接库

(2)可执行文件(executable file) 包含了可以直接执行的程序  

例如:linux的/bin/bash ; windows的.exe

(3)共享目标文件(shared object file)包含了代码和数据可以在以下两种情况下使用。第一种是链接器可以使用这种文件跟其他的可重定位文件和共享目标文件链接,产生新的目标文件;第二种是动态链接器可以将几个这种共享目标文件与可执行文件结合,作为进程映像的一部分使用。

例如:linux下的.so ; windows的dll

(4)核心转储文件(core dump file) 当进程意外终止时,系统可以将该进程的地址空间的内容及终止时的一些其他信息转储到核心转储文件   

       例如: linux下的core dump


可执行文件(目标文件)的格式是ELF,从图中可以看到,ELF文件的开通是一个“头文件”,它描述了整个文件的文件属性,包括文件是否可以执行,是静态链接还是动态链接及入口地址(如果是可执行文件)、目标硬件、目标操作系统等信息,文件头还包括一个段表(Section Table),段表其实是一个描述文件中各个段的数组。段表描述了文件中各个段在文件中的偏移位置及段的属性等,从段表里可以得到每个段的所有信息。文件头后面就是各个段的内容,比如代码段保存的就是程序的指令,数据段保存的就是程序的静态变量。

已初始化的全局变量和局部静态变量都保存在.data段;

未初始化的全局变量和局部静态变量一般放在一个叫.bss段里。




quesiton

为什么在程序代码中,数据和指令要分开存放?

(1)数据区和指令区权限不一样,指令区是只读,数据区是可读写。可以防止程序的指令被有意或无意地改写。

(2)现代CPU一般把指令缓存和数据缓存分离,所以程序的指令和数据分开对CPU的缓冲命中率提高有好处。

(3)the most important reason is that sharing the instructions is very userful.It can save a lot memory spaces.


objdump -h *.o

参数-h把ELF文件的各个段的基本信息打印出来。


每个段的第二行中的CONTENTS表示该段在文件中存在。


objdump的“-s”参数可以将所有段的内容以十六进制的方式打印出来,“-d”参数可以将所有包含指令的段反汇编。

.rodata 段存放的是只读数据,一般是程序里面的只读变量(如const修饰的变量)和字符串变量。操作系统在加载时可以将.rodata属性映射成只读,这样对于这个段的任何修改操作都会作为非法操作处理,保证了程序的安全性。


其他段




ELF文件头中定义了ELF魔数,文件机器字节长度、数据存储方式、版本、运行平台、ABI版本,ELF重定位类型,硬件平台,硬件平台版本、入口地址,程序入口和长度,段表的位置和长度及段的数量等。

原创粉丝点击