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 命令

确定文件类型

实用程序“文件”可用于显示目标文件和可执行文件的类型。例如,

[root@localhost ~]# file ./a.c

./a.c: C source, ASCII text

nm 命令

列出目标文件的列表符号表

实用程序“nm”列出了目标文件的符号表。“nm”通常用于检查某个特定函数是否在目标文件中定义。第二列中的'T'表示定义的函数,而'U'表示未定义的函数,并且应该由链接器解析。

例如,

[root@localhost ~]# nm a.o

0000000000000000 T main

                 U puts

ldd 命令

列出动态链接库

实用程序“ldd”检查可执行文件并显示它需要的共享库列表。例如,

[root@localhost ~]# 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


猜你喜欢

转载自blog.csdn.net/xiangguiwang/article/details/79896538