文章目录
前言
GCC(GNU C Compiler)是编译工具。本文所要介绍的将 C/C++语言编写的程序 转换成为处理器能够执行的二进制代码的过程即由编译器完成。
一、GCC编译工具集
1、工具
工具 | 说明及作用 |
---|---|
ar | 汇编器,将汇编语言代码装换成目标文件 |
as | 汇编 |
ld | 链接器,把编译生成的多个目标文件组织成最终的可执行程序文件 |
nm | 可用于查看目标文件中出现的符号 |
objcopy | 可用于目标文件格式转换,如.bin 转换成 .elf 、.elf 转换成 .bin等 |
objdump | 可用于查看目标文件的信息,最主要的作用是反汇编 |
readelf | 可用于查看目标文件或可执行程序文件的信息 |
size | 可用于查看目标文件不同部分的尺寸和总尺寸 |
2、系列参数
参数 | 作用 |
---|---|
-E | 只做预处理,不编译 |
-S | 只编译,将C程序编译为汇编文件 |
-c | 只汇编,不链接 |
-o | 指定输出的文件名 |
二、Linux GCC 常用命令
1、简介
GCC 的意思也只是 GNU C Compiler而已。经过了这么多年的发展,GCC已经不仅仅能支持 C 语言;它现在还支持Ada语言、C++ 语言、Java 语言、Objective C语言、Pascal语言、COBOL语言,以及支持函数式编程和逻辑编程的Mercury语言等。而GCC也不再单只是 GNU C语言编译器的意思了,而是变成了GNU Compiler Collection 也即是 GNU编译器家族的意思了。
2、简单编译
先创建新目录mkdir test1.2
,然后输入命令cd test1.2
进入新目录
test.c
一步到位的编译指令gcc test.c -o test
实质上,上述编译过程是分为四个阶段进行的,即预处理(也称预编译,Preprocessing)、编译 (Compilation)、汇编 (Assembly)和连接(Linking)。
2.1 预处理
gcc -E test.c -o test.i
或 gcc -E test.c
可以输出 test.i 文件中存放着 test.c 经预处理之后的代码。预处理结果就是将 stdio.h 文件中的内容插入到 test.c 中。
2.2 编译为汇编代码(Compilation)
预处理之后,可直接对生成的 test.i 文件编译,生成汇编代码:
gcc -S test.i -o test.s
gcc 的-S 选项,表示在程序编译期间,在生成汇编代码后,停止,-o 输出汇编代码文件。
2.3 汇编(Assembly)
对于上一小节中生成的汇编代码文件 test.s,gas 汇编器负责将其编译为目标文件,如下: gcc -c test.s -o test.o
2.4 连接(Linking)
gcc 连接器负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态连接库。对于上一小节中生成的test.o,将其与C标准输入输出库进行连接,最终生成程序 test。
gcc test.o -o test
执行./test