您的位置:首页 > 运维架构 > Linux

程序的编译和链接过程

2017-09-13 15:35 211 查看
C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统的启动代码和用到的库文件进行组织形成最终生成可加载、可执行代码的过程。

将一个.c文件编译链接成.exe文件,需要以下几个步骤:预处理、编译、汇编、链接

预处理器:将.c 文件转化成 .i文件,使用的gcc命令是:gcc –E,对应于预处理命令cpp;
编译器:将.c/.h文件转换成.s文件,使用的gcc命令是:gcc –S,对应于编译命令 cc –S;
汇编器:将.s 文件转化成 .o文件,使用的gcc 命令是:gcc –c,对应于汇编命令是 as;
链接器:将.o文件转化成可执行程序,使用的gcc 命令是: gcc,对应于链接命令是 ld;
加载器:将可执行程序加载到内存并进行执行,loader和ld-linux.so。

预处理:主要是做一些代码文本的替换工作。(该替换是一个递归逐层展开的过程。)

(1)将所有的#define删除,并展开所有的宏定义

(2)处理所有的条件预编译指令,如:#if  #ifdef #elif #else #endif

(3)处理#include预编译指令,将被包含的文件插进到该指令的位置,这个过程是递归的

(4)删除所有的注释//与/* */

(5)添加行号与文件名标识,以便产生调试用的行号信息以及编译错误或警告时能够显示行号

(6)保留所有的#pragma编译器指令,因为编译器需要使用它们

编译:把预处理完的文件进行一系列词法分析(lex)、语法分析(yacc)、语义分析及优化后生成汇编代码,这个过程是程序构建的核心部分。 

汇编:汇编代码->机器指令。

链接:这里讲的链接,严格说应该叫静态链接。多个目标文件、库->最终的可执行文件(拼合的过程)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息