-
可重定位目标文件(.o)
其代码和数据可和其他可重定位文件合并为可执行文件
-
每个.o文件由对应的.c文件生成
-
每个.o文件代码和数据地址都是从0开始
-
-
可执行目标文件(Linux默认为a.out,Windows中为*.exe
包含的代码和数据可以被直接复制到内存并被执行
代码和数据地址为虚拟地址空间中的地址
-
共享的目标文件(Linux中的*.so)
特殊的可重定位目标文件,能在装入或运行时被装入到内存并自动被链接,称为共享库文件
Windows中称其为Dynamic Link Libraries(DLLS)
目标文件格式:目标代码指编译器和汇编器处理源代码后所生成的机器语言目标代码,而目标文件指包含目标代码的文件
标准的几种目标文件格式
-
DOS操作系统(最简单):COM格式(*.com),文件中仅包含代码和数据,且被加载到内存的固定位置(不采用虚拟地址)
-
System V UNIX早期版本:COFF格式,文件中不仅包含代码和数据,还包含重定位信息,调试信息,符号表等其他信息,由一组严格定义的数据结构序列组成
-
Windows:PE格式(COFF的变种),称为可移植可执行(Portable Executable,简称PE)
-
Linux等类UNIX:ELF格式(COFF的变种),称为可执行可链接(Exexutable and Linkable Format,简称ELF)
ELF文件的两种视图
-
链接视图(被链接):可重定位目标文件
-
可被链接(合并)生成可执行文件或共享目标文件
-
静态链接库文件由若干个可重定位目标文件组成
-
包含代码,数据(已初始化.data节和未初始化.bss节)
-
包含重定位信息(指出哪些符号引用处需要重定位)
-
文件扩展名为.o(相当鱼Windonws中的.obj文件)
-
-
执行视图(被执行):可执行目标文件
-
包含代码,数据(已初始化.data节和未初始化.bss节)
-
定义的所有变量和函数已有确定地址(虚拟地址空间中的地址)
-
符号引用处已被重定位,以指向所引用的定义符号
-
没有文件扩展名或默认为a.out
-
可被CPU直接执行,指令地址和指令给出的操作数地址都是虚拟地址)
-
ELF头 | ELF头 |
---|---|
程序头表(可选) | 程序头表 |
section1(节) | segment 1(段) |
…… | segment 2 |
section n | segment 3 |
…… | …… |
节头表 | 节头表(可选) |
链接视图 执行视图
节(section) 是ELF文件中具有相同特征的最小可处理单位
-
.text节:代码
-
.data节:已初始化全局变量和静态变量
-
.rodata节:只读数据
-
.bss节:未初始化数据
多个节映射成一个段(如合并.data节和.bss节,并映射到一个可读可写数据段中)