当我们拿到一个.cpp的文件,我们看到它的代码,但我们又是知道它是怎样运行的?我们都知道我们所看到的代码都是高级语言。但计算机底层只能识别像0,1这样的低级语言,所以这也是一个将C/C++代码转成汇编语言然后再变成机器语言的过程。
具体可分为预编译、编译、汇编、链接四个过程。
一、在liunx中这四个阶段的具体命令如下:
1、预编译:像stdio.h这样的头文件被翻译器cpp翻译成.i文件
gcc -E hello.c -o hello.s
2、编译:这个过程是整个程序最核心的部分,也是最复杂的部分
gcc -S hello.i -o hello.s
3、汇编:汇编器将汇编代码转变成机器可以执行的指令
gcc -C hello.c -o hello.c
4、链接:
gcc main.o -o main
二、下面我们具体来分析一下这四个过程都进行了哪些工作
1、预编译
(1)将#include预编译指令进行处理展开,将所包含的文件插入到预编译指令的位置。
(2)将#define进行替换,展开所有宏定义
(3)删除#if、#endif.
(4)删除所有注释,//、/**/;
(5)添加行号和文件标识。
(6)保留所有#pragma指令。
(7)生成.i文件。
2、编译
(1)词法分析
(2)语法分析
(3)语义分析
(4)代码纠错
(5)生成汇编指令
(6)生成.s文件
3、汇编
(1)将汇编指令翻译成二进制
(2)合并符号表
(3)生成.o文件
4、链接
(1)符号重定位
(2)分配地址和空间,找到对应的虚拟内存空间
(3)符号解析
二、以下为4G虚拟内存空间的布局

【Linux】预编译、编译、汇编、链接过程
三、各字段的说明
.data:保存的是那些已经初始化了的全局静态变量和局部静态变量。
.bss:存放的是未初始化的全局变量和局部静态变量,像X=0也认为是未初始化的变量。
.text:代码会被存放到.text段。
.rodata:存放的是只读数据,一般是程序里面的只读(如const修饰的变量)和字符常量。

相关文章:

  • 2022-12-23
  • 2021-12-21
  • 2022-12-23
  • 2021-12-19
  • 2021-06-10
  • 2022-01-03
猜你喜欢
  • 2021-09-18
  • 2021-12-31
  • 2021-12-18
  • 2021-04-13
  • 2021-12-04
  • 2021-07-28
  • 2022-12-23
相关资源
相似解决方案