gcc——预处理(预编译),编译,汇编,链接
来源:互联网 发布:时代互联域名转出 编辑:程序博客网 时间:2024/05/24 02:50
一,预编译
操作步骤:gcc -E hello.c -o hello.i
主要作用:
处理关于 “#” 的指令
【1】删除#define,展开所有宏定义。例#define portnumber 3333
【2】处理条件预编译 #if, #ifdef, #if, #elif,#endif
【3】处理“#include”预编译指令,将包含的“.h”文件插入对应位置。这可是递归进行的,文件内可能包含其他“.h”文件。
【4】删除所有注释。/**/,//。
【5】添加行号和文件标识符。用于显示调试信息:错误或警告的位置。
【6】保留#pragma编译器指令。(1)设定编译器状态,(2)指示编译器完成一些特定的动作。
二,编译(编译器主要做了什么)
操作步骤:gcc -s hello.c -o hello.s
主要作用:1.扫描(词法分析),2.语法分析,3.语义分析,4.源代码优化(中间语言生成),5.代码生成,目标代码优化。
【1】将源代码程序输入扫描器,将源代码的字符序列分割成一系列记号。例array[index] = (index + 4) * (2 + 6);
【2】基于词法分析得到的一系列记号,生成语法树。
【3】由语义分析器完成,指示判断是否合法,并不判断对错。又分静态语义:隐含浮点型到整形的转换,会报warning,
动态语义:在运行时才能确定:例1除以3
【4】中间代码(语言)使得编译器分为前端和后端,前端产生与机器(或环境)无关的中间代码,编译器的后端将中间代码转换为目标机器代码,目的:一个前端对多个后端,适应不同平台。
【5】编译器后端主要包括:代码生成器:依赖于目标机器,依赖目标机器的不同字长,寄存器,数据类型等
目标代码优化器:选择合适的寻址方式,左移右移代替乘除,删除多余指令。
三,汇编
操作步骤:gcc -c hello.c -o hello.o
主要作用:汇编器是将汇编代码转变成可以执行的指令,生成 目标文件。
四,链接
操作步骤:gcc hello.o -o hello
主要作用:通过编译器的5个步骤后,我们获得目标代码,但是里面的各个地址还没有确定,空间还没有分配。
链接过程主要包括:地址和空间的分配,符号决议和重定位。
地址和空间:略
符号决议:也可以说地址绑定,分动态链接和静态链接,
重定位:假设此时又两个文件:A,B。A需要B中的某个函数mov的地址,未链接前将地址置为0,当A与B链接后修改目标地址,完成重定位。
- gcc——预处理(预编译),编译,汇编,链接
- gcc中预编译(预处理)、编译、汇编、链接
- C/C++中预编译(预处理)、编译、汇编、链接
- gcc 编译的四大过程(预处理-编译-汇编-链接 )
- GCC编译过程:预处理-编译-汇编-链接
- gcc编译程序的四个阶段(预处理-编译-汇编-链接)
- GCC编程过程:预处理-编译-汇编-链接
- gcc预处理、编译、汇编和链接详解
- gcc预处理、编译、汇编、链接详解
- 预编译,编译,汇编,链接
- Linux开发工具(gcc gdb make shell)——c的预处理、编译、汇编和链接
- Linux开发工具(gcc gdb make shell)——c的预处理、编译、汇编和链接
- 深入理解预编译,编译,汇编,链接的过程——之预编译
- 深入理解预编译,编译,汇编,链接的过程——之汇编
- GCC编译的背后( 预处理和编译 汇编和链接 )
- GCC编译的背后( 预处理和编译 汇编和链接)
- GCC编译的背后( 预处理和编译 汇编和链接 )
- gcc 从语言编译全过程 预处理---->编译---->汇编----->链接
- WebSocket
- Android-TextView和EditText
- jQuery开发者眼中的AngularJS
- 微信一年扫出多少个二维码?
- CI框架源码解析十九之分页类文件Pagination.php
- gcc——预处理(预编译),编译,汇编,链接
- C#中各种集合类比较
- 含词尾的三单字新词识别设想
- JAVA容器Set的三种子类的比较
- flocing算法在unity中的使用
- Android-ImageView
- git bash第一次 提交code提示错误
- 粒子滤波通俗解释
- iOS备忘录之CocoaPods的使用说明