目标文件
一.前言
我们直接编辑的C语言程序无法在机器上运行,必须进经过一定的处理,下图为我们揭示了C文件如何变成具体的机器可执行的代码文件。
编译驱动程序包括
预处理器(cpp)
将程序从ASCII源文件翻译成 .i 文件
编译器(ccl)
翻译成 .s ASCII汇编语言文件
汇编器(as)
翻译成 .o 可重定位目标文件
链接器(ld)
翻译成可执行文件
链接必须完成两个主要任务:
1.符号解析:
目标文件定义和引用符号。符号解析的目的是将每个符号引用刚好和一个符号定义联系起来。(这里的符号包括变量名和函数名)
2.重定位
链接器通过把每个符号定义和一个存储器位置联系起来,然后修改所有对这些符号的引用,使得它们指向这个存储器位置,从而重定位这些节。
二.目标文件概述
目标文件是按照特定的目标文件格式来组织的,各个系统的目标文件格式都不同。现代x86-64 Linux和Unix系统使用可执行可链接格式——ELF,且有以下三种形式:
1.可重定位目标文件(.o)
包含二进制代码和数据,其可以在编译时与其他可重定位目标文件合并起来,组成一个可执行二进制文件。
2. 可执行目标文件(./a.out)
包含二进制代码和数据,可以被直接拷贝到存储器中执行。
3.共享目标文件(.so)
特殊类型的可重定位目标文件,可以在加载或运行时被动态地加载到存储器,并链接。
三.文件结构
以下是一个典型的ELF文件格式:
其中:
- ELF头,以一个16字节的序列开始,描述生成该文件的系统的字的大小和字节顺序。剩下字节包括帮助链接器语法分析和解释目标文件的信息,包括ELF头的大小、目标文件的类型(可重定位、可执