首页
论坛
课程
招聘
[原创]gcc xxx.cpp究竟经历了什么?
2022-4-7 01:14 3775

[原创]gcc xxx.cpp究竟经历了什么?

2022-4-7 01:14
3775

gcc xxx.cpp究竟经历了什么?

 

大家好,我是东北码农。

 

今天我们深入探索一下,一次gcc命令背后都进行了哪些工作。


  • 写一个简单的程序,比较4和5
1
2
3
4
5
6
7
8
9
10
11
12
13
// xxx.cpp
#include <stdio.h>
 
#define  Max(x,y)    ((x) > (y) ? (x) : (y))
 
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. 预处理
  2. 编译
  3. 汇编
  4. 链接

下面我们拆解编译过程,一一讲解。


1、预处理

预处理的命令

1
g++ -E xxx.cpp -o xxx.i

-E是预处理,-o指定输出文件。生成的xxx.i不放了,建议大家自己试试.

预处理的操作

  • 展开所有#define 宏定义,进行文本替换。
  • 删除程序中所有的注释。
  • 处理所有的条件编译,#if、#ifdef、#elif 等。
  • 处理所有的#include 指令,把这些头文件的内容都复制到引用的+ 源文件中。
  • 添加行号和文件名标识,方便编译器产生警告及调试信息。
  • 保留所有的#pragma 编译器指令,因为编译器会使用他们。

2、编译

这里的编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理文件(xxx.i)之后的程序转换成特定汇编(xxx.s)代码的过程。

编译的命令

1
g++ -S xxx.cpp -o xxx.s

-S是编译,生成汇编代码的过程,生成的xxx.s不放了,建议大家自己试试。

3、汇编

汇编过程将上一步的汇编代码转换成机器码,这一步产生的文件叫做目标文件,是二进制格式。

汇编的指令

1
gcc -c xxx.s -o xxx.o

使用汇编器将汇编代码转成机器可以执行的指令,其实就是将汇编指令和机器指令按照对照表一一翻译

4、链接

链接过程使用链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件。附加的目标文件包括静态连接库和动态连接库。

链接指令

1
gcc xxx.o -o a.out

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

东北码农,全网同名,欢迎大家使用常用聊天软件关注、评论交流~
如果大家觉得有用,求点赞、转发~


[2022夏季班]《安卓高级研修班(网课)》月薪两万班招生中~

最后于 2022-4-9 07:40 被assqqq编辑 ,原因: 格式错了
收藏
点赞0
打赏
分享
最新回复 (2)
雪    币: 8910
活跃值: 活跃值 (37729)
能力值: (RANK:105 )
在线值:
发帖
回帖
粉丝
Editor 活跃值 2022-4-7 20:36
2
0

转帖?
https://www.cnblogs.com/northeast-coder/p/16110552.html

最后于 2022-4-7 20:36 被Editor编辑 ,原因:
雪    币: 307
活跃值: 活跃值 (1991)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
assqqq 活跃值 2022-4-9 07:41
3
0
那个也是我发得啊
游客
登录 | 注册 方可回帖
返回