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