一、什么是链接?
C/C++程序的编译可以分解为4个步骤,预处理、编译、汇编、链接。每个源文件先进行预处理,完成预编译操作,再通过编译进行一系列语法、语义分析生成汇编代码文件,之后汇编器将汇编代码转变成机器可以执行的指令,即机器语言。预处理、编译、汇编都是对独立的源文件模块进行处理,而链接的作用就是将这些独立的模块组装起来。链接过程主要包括了地址和空间分配、符号解析和重定位等。
二、目标文件格式
目标文件指源代码经过编译产生的能被cpu直接识别二进制代码,了解它对于认识系统背后的机理有巨大的好处。Windows的PE、Linux的ELF都是COFF格式的变种,下面着重了解一下ELF格式。ELF文件可分为可重定位文件(静态链接库也可归为这一类)、可执行文件、共享目标文件、核心转储文件。
典型的ELF可重定位目标文件:
ELF头以一个16字节的序列开始,这个序列描述了字的大小和生成该文件系统的字节顺序。ELF头还包括ELF头的大小、目标文件的类型、机器类型、节头部表的文件偏移,以及节头部表中表目大小和数量。不同节的位置和大小是由节头部表描述的。
一个典型的