第三章:目标文件的结构

一、什么叫目标文件

编译后链接前的文件称为目标文件,它已经接近于可执行文件,只是没有经过链接而已。

二、格式术语

Linux:ELF(.o)

Windows:PE(.obj)

二者由于都源自Unix中的COFF格式,因此相关的格式十分相近。

可执行文件(.exe-ELF)  与 动态链接库(.dll-.so)  与 静态链接库(.lib-a) 都可以以上述形式进行存储。


三、存储格式

目标文件以 节(section) 或 段(segment) 的形式进行存储(类似于堆栈的结构),主要依次分为

file header

.txt section  代码段

.data section 数据段 

.bss section  存放未初始化的变量——类似与占位符,并不实际占据空间


分段存储的好处:

1.相同属性的数据放在一起便于管理

2.在装载时,数据和代码会被映射到两个 虚存区域,数据在可读写区域,代码在只读区域。

3.程序与指令的分开(分块)降低了体积,提高了灵活性,可以提高缓存的命中率。

4.跟java的.class文件相通(其实这就是目标文件),代码段只需要一个副本,而数据段可能需要多份。在JVM中代码和数据就本别被存放在方法区和堆中。


四、数据段

分为:.data,.rodata.rodata中存放这read only的数据,data中存放初始化的 全局或局部变量(包括静态变量)。

五、BSS段

存放未初始化的全局变量或局部变量(包括静态变量)

六、ELF文件头

包含了描述整个文件的基本属性,比如:版本、目标机器号、程序入口地址等。


你可能感兴趣的:(链接,编译)