GCC编译过程分解
来源:互联网 发布:录像配音软件 编辑:程序博客网 时间:2024/05/16 18:50
一.什么是GCC
Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。
gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。
Gcc编译器能将C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。
二.GCC编译过程分解
以hello world 为例分析gcc编译过程,建立文件hello.c
#include<stdio.h>int main(){ printf("Hello World\n"); return 0;}
通常我们使用gcc来生成可执行程序,命令为:gcc hello.c -o hello,生成可执行文件hello
实际上gcc hello.c可以分解为4个步骤,分别是预处理(Preprocess),编译(Compilation),汇编(Assembly)和链接(Linking)。如下所示:
(1) 预处理(也称预编译,Preprocessing)
在预处理过程中,对源代码文件中的头文件进行展开、预编译语句(如宏定义define等)进行分析。在这一阶段,调用cpp进行预处理,生成以.i为后缀的预处理文件。
使用命令:gcc –E hello.c –o hello.i,以下为预处理后的输出文件hello.i的内容:
# 1 "hello.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "hello.c"
# 1 "/usr/include/stdio.h" 1 3 4
# 28 "/usr/include/stdio.h" 3 4
/***** 省略了部分内容,包括stdio.h中的一些声明及定义 *****/
# 2 "hello.c" 2
int main()
{
printf("Hello World\n");
return 0;
}
(2) 编译(Compilation)
编译过程就是把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件
使用命令:gcc –S hello.i –o hello.s,以下为编译后的输出文件hello.s的内容:
.file "hello.c"
.section .rodata
.LC0:
.string "Hello World"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
movl $.LC0, (%esp)
call puts
movl $0, %eax
leave
ret
.size main, .-main
.ident "GCC: (GNU) 4.4.0 20090506 (Red Hat 4.4.0-4)"
.section .note.GNU-stack,"",@progbits
(3)汇编(Assembly)
汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和 机器指令的对照表一一翻译即可。
使用命令: gcc –c hello.c –o hello.o
(4)链接(Linking)
使用命令:gcc hello.o -o hello,最终生成可执行文件hello
链接器ld将各个目标文件组装在一起,解决符号依赖,库依赖关系,并生成可执行文件。
ld –static crt1.o crti.o crtbeginT.o hello.o –start-group –lgcc –lgcc_eh –lc-end-group crtend.o crtn.o (省略了文件的路径名)。
- GCC编译过程分解
- GCC编译过程分解
- gcc编译过程分解
- GCC编译过程分解
- [转]GCC编译过程分解
- Linux中gcc编译过程分解
- linux GCC编译过程
- linux GCC编译过程
- gcc编译过程概述
- [Pthread] Gcc 编译过程
- gcc编译过程
- linux gcc 编译过程
- gcc 编译过程
- GCC的编译过程
- gcc编译过程
- gcc编译过程概述
- gcc编译过程概述
- gcc 编译过程
- How Many Tables
- 20171001_Alfred介绍和一些workflow推荐
- 计算机图形学几何工具算法详解(第2章):(hua)笔(shui)记
- SSH入门项目-4-功能完善之CRUD
- 字符串全排列
- GCC编译过程分解
- Linux 学习路程(3)文件权限
- 关于verilog几条语法
- 【UVA 548 Tree】二叉树构造 & 遍历
- 智能算法推荐到底是不是原罪
- 关于putchar与getchar
- Eclipse添加jdk
- 多项式加法
- 孤独真的能毁掉一个人吗?