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 (省略了文件的路径名)。

     

           

      

















原创粉丝点击