Linux(六)--编译链接原理

一、编译链接原理
我们编译一个程序的过程,其实是由四个步骤组成的,分别是:预编译、编译、汇编、链接。虽然我们现在都是在IDE这种集成开发环境下进行产品的开发,平时也不需要关注程序到底是怎么进行编译链接的,但了解编译链接原理对我们学习编程,以及对我们编写程序有很大帮助,因此,我们十分有必要学习程序的编译链接原理。接下来,我们就从四个步骤开始入手学习。
1、预编译阶段
预编译阶段主要处理那些源代码中以“#”开头的预编译指令,具体如下:
(1)处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。注意:该过程是递归的,也就是说,被包含的文件可能还包含其他文件。
(2)处理所有条件预编译指令,比如“#if",“#ifdef”,"#else",“#endif”。
(3) 进行宏替换,并将所有的“#define”删除。
(4)删除注释,包括“//”和“//”
(5)添加行号和文件名标识,以便于编译时编译器产生调试用的行号信息以及产生编译错误或警告时能够显示行号。
(6)保留所有的“#pragma”编译指令,因为编译器要使用它们。
2、编译阶段
(1)进行一系列词法分析、语法分析和语义分析
(2)进行代码的优化
(3)汇总符号、数据和函数
这个过程是整个程序构建的核心部分,也是最复杂的过程之一。
3、汇编阶段
(1)将汇编指令翻译成二进制的机器指令
(2)生成各个段(section)
(3)生成符号表
4、链接阶段
(1)合并所有文件的各个section,调整段大小以及段的起始位置。
(2)合并符号表,进行符号解析,并给符号分配一个虚拟地址。
(3)进行符号重定位,在源代码中使用符号的地方全都替换成符号的虚拟地址。
每一个步骤都会生成一个中间文件,下面就以一个.c文件为例,说明此过程。
在这里插入图片描述二、可执行文件格式
现在流行的可执行文件格式主要是Windows下的PE(Portable Executable)和Linux下的ELF(Executble Linkable Format),它们都是COFF(Common file format)格式的变种。
目标文件就是源代码进行编译后但未链接的那些中间文件(Windows下的.obj文件和Linux下的.o文件),它跟可执行文件的内容和结构很相似,所以跟可执行文件采用相同的文件格式存储。
在Linux下,可以通过objdumpreadelf命令查看文件的内部信息。
示例:查看各个段信息
(1)目标文件
Linux(六)--编译链接原理_第1张图片(2)可执行文件
Linux(六)--编译链接原理_第2张图片ELF的结构:
目标文件:
Linux(六)--编译链接原理_第3张图片可执行文件:
Linux(六)--编译链接原理_第4张图片常用段名的说明
Linux(六)--编译链接原理_第5张图片参考文献:《程序员的自我修养》

你可能感兴趣的:(笔记,linux)