从源代码到可执行文件

Posted 东皇※太一

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从源代码到可执行文件相关的知识,希望对你有一定的参考价值。

请简述程序从源代码到可执行程序的过程,面试经常会被问到!

这是一个屡见不鲜的问题,总而言之就如下四个过程:

预处理

比如有test.c源文件,内容如下:

#include <stdio.h>
/*主函数*/
int main(void)

	printf("hello world\\n");//打印hello world!

	return 0;

 用预处理指令将其生成*.i文件

gcc -E -o test.i test.c // 将源文件test.c文件预处理生成test.i
                        // GCC的选项-E使GCC在进行完预处理后即停止
                        // GCC的选项-o是指定输出的文件名称

然后cat test.i查看文件的内容

这是截取test.i文件的部分内容,对比test.i与test.c文件,我们可以看出

预处理主要干了如下这些事

①展开宏#define,处理条件编译,如#if #ifdef #else #elif #endif等

②处理#include,讲其包含的文件插入到该预编译指令的位置

③删除所有的注释"//"和“/* */”

④添加行号和文件标识,方便调试时使用

编译

编译命令如下:

gcc -S -o test.s test.i // 将预处理生成的test.i文件编译生成汇编程序test.s
                        // GCC的选项-S使GCC在执行完编译生成汇编程序后停止
                        // GCC的选项-o是指定输出的文件名称

 展开test.s文件,我们可以看到,只要稍微懂点汇编语法,确实将文件转换成了汇编文件

汇编

汇编指令如下:

gcc -c -o test.o test.s // 将test.s文件汇编生成目标文件test.o
                        // GCC的选项-c使GCC在执行完汇编生成目标文件后停止

经过这一步就得到了ELF格式的可重定向的目标文件,这个文件中的内容我们是无法看懂的

链接

链接指令如下:

gcc -o test test.o

经过这一步就得到了最终的可执行程序,如:./test

以上是关于从源代码到可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

从源代码到可执行文件

CMake 是不是将包含的标头中的所有内容编译到可执行文件中,还是仅将主类中使用的部分编译为可执行文件?

源文件如何转换到可执行文件

ELF核心文件格式

C/C++ - 从代码到可执行程序的过程

源代码到可执行程序的过程详解:预编译编译汇编链接