如何向面试官讲清楚程序编译过程

源文件到产生效果是个很复杂的过程
大体步骤分为编译和链接
你如果只是背,这四点千万不要忽略
预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。
首先是个大的过程,编译。
编译分为预编译和编译加汇编
预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.i为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件

为了更清晰可见,我们再gcc编译下更清晰认识到
首先是预编译
我们假设有这样一个文件
getopt_exp.c
在进行预编译后
我们将结果放在res.i文件中
gcc -E getopt_exp.c -o res.i

我们来查看行数发现
在这里插入图片描述
可见预编译后是个庞大的代码量
接下来就是编译了
在编译过程中会进行语法分析 词义分析 语义分析 符号汇总
编译阶段将C语言转换成汇编语言 生成 .s文件
在这里插入图片描述
我们可以看到这时候代码量急剧减少,接下来就是我们所谓的汇编阶段
汇编就是将汇编指令翻译成二进制指令形成符号表。 生成.o文件
这个阶段,生成目标代码。
此过程生成ELF格式的目标代码
在这里插入图片描述
接下来就是链接过程,生成可执行代码。链接分为两种,一种是静态链接,另外一种是动态链接。使用静态链接的好处是,依赖的动态链接库较少,对动态链接库的版本不会很敏感,具有较好的兼容性;缺点是生成的程序比较大。使用动态链接的好处是,生成的程序比较小,占用较少的内存。链接主要有个过程
1:合并段表,将对应段合并在一起
2:符号表的合并和无符号表的重定位。
在这里插入图片描述
完成链接后就能得到我们想要的结果啦。

猜你喜欢

转载自blog.csdn.net/flf1234567898/article/details/106653744