gnu gcc 编译
gnu gcc 编译
gnu gcc简介
最初的GNU C编译器(GCC)由GNU Project的创始人RichardStallman开发。 Richard Stallman于1984年创立了GNU项目,以创建一个类似自由软件的类Unix操作系统,以促进计算机用户和程序员之间的自由和合作。
GCC(以前称为“GNU C编译器”)随着时代的发展而不断增长,以支持C(gcc),C ++(g ++),Objective-C,Objective-C ++,Java(gcj),Fortran(gfortran),Ada gnat),Go(gccgo),OpenMP,Cilk Plus和OpenAcc。它现在被称为“GNU编译器集合”。 GCC的网站是http://gcc.gnu.org/。目前的版本是GCC 7.3,于2018-01-25发布。
GCC是所谓的“GNU工具链”的关键组件,用于开发应用程序和编写操作系统。 GNU工具链包括:
GNU编译器集合(GCC):一种支持许多语言的编译器,例如C / C ++和Objective-C / C ++。
GNU Make:用于编译和构建应用程序的自动化工具。
GNU Binutils:一套二进制实用工具,包括连接器和汇编器。
GNU调试器(GDB)。
GNU Autotools:构建系统,包括Autoconf,Autoheader,Automake和Libtool。
GNU Bison:一个解析器生成器(类似于lex和yacc)。
GCC是可移植的,可以在许多操作平台上运行。 GCC(和GNU Toolchain)目前在所有的Unix上都可用。他们也被移植到Windows(Cygwin,MinGW和MinGW-W64)。 GCC也是一个交叉编译器,用于在不同平台上生成可执行文件。
GCC编译过程
如上图所示,GCC以4个步骤将C / C ++程序编译为可执行文件。例如,执行“gcc -o a.out a.c”如下:
#include <stdio.h>
int main(){
printf("hello world\n");
return 0;
}
预处理
通过GNU C预处理器,其中包括头文件(#include)并扩展宏(#define)。
> gcc -E a.c -o a.i
生成的中间文件“a.i”包含扩展的源代码。
编译
编译器将预处理源代码编译为特定处理器的汇编代码。
> gcc -S a.i -o a.s
-S选项指定生成汇编代码,而不是目标代码。 生成的程序集文件是“a.s”。
汇编
gcc调用汇编程序(as)将汇编代码转换为目标文件“a.o”中的机器代码。
> as -o a.o a.s
链接器
最后,gcc调用链接器(ld )将目标代码与库代码链接起来以生成可执行文件“a.out”。
>gcc –o a.out a.o
详细模式(-v)
您可以通过启用-v(详细)选项来查看详细的编译过程。例如,
> gcc -v -o a.out a.c
用于检查编译文件的实用程序
file 命令
确定文件类型
实用程序“文件”可用于显示目标文件和可执行文件的类型。例如,
[[email protected] ~]# file ./a.c
./a.c: C source, ASCII text
nm 命令
列出目标文件的列表符号表
实用程序“nm”列出了目标文件的符号表。“nm”通常用于检查某个特定函数是否在目标文件中定义。第二列中的'T'表示定义的函数,而'U'表示未定义的函数,并且应该由链接器解析。
例如,
[[email protected] ~]# nm a.o
0000000000000000 T main
U puts
ldd 命令
列出动态链接库
实用程序“ldd”检查可执行文件并显示它需要的共享库列表。例如,
[[email protected] ~]# ldd a.out
linux-vdso.so.1=> (0x00007fffbed2e000)
libc.so.6=> /lib64/libc.so.6 (0x00007f384923c000)
/lib64/ld-linux-x86-64.so.2(0x00007f3849626000)
参考资料
https://www.gnu.org/gnu/about-gnu.html