前言
一般我们在linux操作系统编译运行C程序,都是直接编译成可执行程序直接运行,没有对中间过程进行剖析,过程如下。
一、预处理阶段
预处理阶段主要完成宏替换、头文件展开、条件编译、注释。
gcc -E hello.c -o hello.i -E只做预处理,执行之后的hello.i还是C文件,只是完成预处理之后的C文件。
二、编译阶段(C程序->汇编)
把c文件编译成为汇编文件(.s),其中进行了词法分析,语法分析,语义分析、生成中间代码、对代码进行优化等工作。
gcc -S hello.i -o hello.s
三、汇编阶段
把汇编文件(.s)编译成可重定位文件(.o)。
gcc -c hello.s -o hello.o
四、链接阶段(静态链接和动态链接)
把可重定位文件(.o)链接成为可执行文件,其中链接可分为静态链接和动态链接
gcc hello.o -o hello