ELF和静态链接
编译、链接和装载:拆解程序执行
“C语言代码——汇编代码——机器码”这个过程在计算机上是又两部分组成的。
第一部分由编译、汇编、链接三个阶段组成。链接器——把多个目标文件以及调用的各种函数库链接起来。三个阶段完成后,我们生成了可执行文件。(编译生成的是目标文件)
第二部分通过装载器把可执行文件装载到内存中,CPU从内存中读取指令和数据,来开始真正执行程序。
ELF格式和链接:理解链接过程
程序最终通过装载器变成指令和数据。
在Linux下,可执行文件和目标文件所使用的是ELF(Execuatable and Linkable File Format)的文件格式,也叫可执行与可链接文件格式,里面不仅存放了汇编指令,还有很多其他数据。
ELF文件格式:
- File Header,基本的头文件,用来表示这个文件的基本属性,例如是否是可执行文件,对应的CPU、操作系统等等。
- .text Section,也叫代码段或者指令段,用来保存程序的代码和指令。
- .data Section,也叫做数据段,保存程序里设置好的初始化数据。
- .rel.text Section,也叫重定位表,保留了没有链接之前哪些跳转地址是不知道的信息。
- .symtab Section,也叫符号表,保留了当前文件定义的函数名称和对应地址。
链接器执行过程:
链接器扫描所有输入的目标文件,然后把所有符号表整合成一个全局的符号表。再根据重定位表,把所有不确定的地址从符号表里找到后修正。最后把所有目标文件的对应的Section一次性合并,变成最终的可执行代码。
同样一个程序在Linux下可以执行而在Windows下不可以执行,就是因为两个操作系统下可执行文件的格式不一样。LInux下是ELF,Windows下是PE(Portable Executable Format)。