-
-
[原创]gcc xxx.cpp究竟经历了什么?
-
2022-4-7 01:14
5476
-
gcc xxx.cpp究竟经历了什么?
大家好,我是东北码农。
今天我们深入探索一下,一次gcc命令背后都进行了哪些工作。
1 2 3 4 5 6 7 8 9 10 11 12 13 | / / xxx.cpp
int a1 = 4 ;
int a2 = 5 ;
int main()
{
int x = Max (a1,a2);
printf( "Max(5,6)=%d\n" ,x);
return 0 ;
}
|
- 编译
1 | xjp@xxx:~ / code / case / case31_gcc_compile_test$ g + + xxx.cpp
|
- 运行
1 2 | xjp@xxx:~ / code / case / case31_gcc_compile_test$ . / a.out
Max ( 5 , 6 ) = 5
|
gcc编译时,这一行简单的指令其实经历了很多复杂的过程:
- 预处理
- 编译
- 汇编
- 链接
下面我们拆解编译过程,一一讲解。
1、预处理
预处理的命令
-E是预处理,-o指定输出文件。生成的xxx.i不放了,建议大家自己试试.
预处理的操作
- 展开所有#define 宏定义,进行文本替换。
- 删除程序中所有的注释。
- 处理所有的条件编译,#if、#ifdef、#elif 等。
- 处理所有的#include 指令,把这些头文件的内容都复制到引用的+ 源文件中。
- 添加行号和文件名标识,方便编译器产生警告及调试信息。
- 保留所有的#pragma 编译器指令,因为编译器会使用他们。
2、编译
这里的编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理文件(xxx.i)之后的程序转换成特定汇编(xxx.s)代码的过程。
编译的命令
-S是编译,生成汇编代码的过程,生成的xxx.s不放了,建议大家自己试试。
3、汇编
汇编过程将上一步的汇编代码转换成机器码,这一步产生的文件叫做目标文件,是二进制格式。
汇编的指令
使用汇编器将汇编代码转成机器可以执行的指令,其实就是将汇编指令和机器指令按照对照表一一翻译
4、链接
链接过程使用链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件。附加的目标文件包括静态连接库和动态连接库。
链接指令
5、总结
生成可执行程序过程为成四个步骤:
1、由.c文件到.i文件,这个过程叫预处理。
2、由.i文件到.s文件,这个过程叫编译。
3、由.s文件到.o文件,这个过程叫汇编。
4、由.o文件到可执行文件,这个过程叫链接。
1 2 3 4 5 6 | xjp@xxx:~ / code / case / case31_gcc_compile_test$ file *
a.out: ELF 64 - bit LSB shared object , x86 - 64 , version 1 (SYSV), dynamically linked, interpreter / lib64 / ld - linux - x86 - 64.so . 2 , BuildID[sha1] = 7cc294d0c27aa556f05229fbb772ff39477c7cef , for GNU / Linux 3.2 . 0 , not stripped
xxx.cpp: C source, ASCII text
xxx.i: C source, ASCII text
xxx.o: ELF 64 - bit LSB relocatable, x86 - 64 , version 1 (SYSV), not stripped
xxx.s: assembler source, ASCII text
|
东北码农,全网同名,欢迎大家使用常用聊天软件关注、评论交流~
如果大家觉得有用,求点赞、转发~
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界
最后于 2022-4-9 07:40
被assqqq编辑
,原因: 格式错了