将源文件编译成可执行程序,需经历四个过程 预编译 将头文件插入到源文件中,删除注释,替换宏...等等 编译 将C语言的源文件编译成汇编语言源文件 汇编 将汇编语言源文件传化成机器语言文件,即目标文件 链接 将目标文件链接成可执行文件 前三个过程相对而言,不是很复杂。重点放在链接过程如何将多个目标文件链接成可执行文件的。linux下目标文件和可执行文件都采用的是ELF格式,每个ELF文件都包含多个section,如:.test .data .rodata .rela.text .symtab ...。其中目标文件中的重定位表(如:.rela.text)和符号表(.symtab)在链接过程中起着非常重要的作用。连接器根据中重定位表来确定目标文件中需要重定位处的地址--全局标识符在指令中的位置,并根据符号表来查找标识符对应内存区的地址。 重定位表包含结构Elf64_Rel的对象数组,每个数组元素对应一个需要重定位的地址。定义在/usr/include/elf.h typedef struct { Elf64_Addr r_offset;