GNU_C
Last updated: 2018/10/23 Published at: 2018/10/23
搬运自我的 Linux0.11 仓库
GNU 编译工具链
简介
GNU 编译器套装 (英语:GNU Compiler Collection,缩写为 GCC),指一套编程语言编译器,以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU 项目的关键部分,也是 GNU 工具链的主要组成部分之一。GCC (特别是其中的 C 语言编译器) 也常被认为是跨平台编译器的事实标准。1985 年由理查德·马修·斯托曼开始发展,现在由自由软件基金会负责维护工作。
原名为 GNU C 语言编译器 (GNU C Compiler),因为它原本只能处理 C 语言。GCC 在发布后很快地得到扩展,变得可处理 C++。之后也变得可处理 Fortran、Pascal、Objective-C、Java、Ada,Go 与其他语言。
许多操作系统,包括许多类 Unix 系统,如 Linux 及 BSD 家族都采用 GCC 作为标准编译器。苹果计算机预装的 Mac OS X 操作系统也采用这个编译器。
编译和链接
假设使用 Linux 命令行编译以下代码
1gcc -Og -o prog prog1.c prog2.c
2# -Og表示不进行优化,优化等级高导致机器代码和原始代码严重变形,不易分析
3# -o表示命名
实际上 gcc
调用了一整套的程序,将源代码转化成可执行代码。首先,C 预处理器
扩展源代码,插入所有用#include 命令指定的文件,并扩展所有用#define 声明指定的宏。其次 编译器
将产生两个源文件的汇编代码,名字分别为 prog1.s
和 prog2.s
。接下来,汇编器
会将汇编代码转换成二进制 目标代码
文件 prog1.o
和 prog2.o
。目标代码是机器代码的一种形式,但还没有填入全局的地址。最后,链接器
将两个目标代码文件和实现库函数 (例如 printf) 的代码合并,并产生最终的可执行文件 prog
。可执行代码是我们要考虑的机器代码的第二种形式,也就是处理器执行的代码格式。更详细的信息可以参考 CSAPP 第七章。
有关命令
1gcc
2ld
3objdump
4objcopy
5dd
6# 使用方法Google