GCC编译流程

 

 

furtherchan@ubuntu910:~$ ls

aaa.c            Desktop    examples.desktop  Music     Templates  workspace

aaa.h            Documents  macrotest         Pictures  test.c     文档

apue_src.tar.gz  Downloads  macrotest.c       Public    Videos     桌面

furtherchan@ubuntu910:~$ gcc -E -o aaa.i aaa.c

 

furtherchan@ubuntu910:~$ ls

aaa.c            Desktop    examples.desktop  Music     Templates  workspace

aaa.h            Documents  macrotest         Pictures  test.c     文档

aaa.i          apue_src.tar.gz  Downloads  macrotest.c       Public    Videos     桌面

 

furtherchan@ubuntu910:~$ cat aaa.i

 

# 1 "aaa.c"

# 1 "<built-in>"

# 1 "<command-line>"

# 1 "aaa.c"

# 1 "/usr/include/stdio.h" 1 3 4

#......

 

# 3 "aaa.c" 2

# 1 "aaa.h" 1

 

 

 

typedef int integer;

# 4 "aaa.c" 2

 

int main()

{

 integer i = 5;

 printf("Integer i = %d/n",i);

 return 0;

}

 

furtherchan@ubuntu910:~$ gcc -S -o aaa.s aaa.i

 

furtherchan@ubuntu910:~$ ls

aaa.c  apue_src.tar.gz  examples.desktop  Pictures   Videos

aaa.h  Desktop          macrotest         Public     workspace

aaa.i  Documents        macrotest.c       Templates  文档

aaa.s  Downloads        Music             test.c     桌面

 

furtherchan@ubuntu910:~$ cat aaa.s

       .file  "aaa.c"

       .section   .rodata

.LC0:

       .string     "Integer i = %d/n"

       .text

.globl main

       .type       main, @function

main:

       pushl       %ebp

       movl       %esp, %ebp

       andl $-16, %esp

       subl $32, %esp

       movl       $5, 28(%esp)

       movl       $.LC0, %eax

       movl       28(%esp), %edx

       movl       %edx, 4(%esp)

       movl       %eax, (%esp)

       call  printf

       movl       $0, %eax

       leave

       ret

       .size main, .-main

       .ident      "GCC: (Ubuntu 4.4.1-4ubuntu9) 4.4.1"

       .section   .note.GNU-stack,"",@progbits

 

furtherchan@ubuntu910:~$ gcc -c aaa.s -o aaa.o

furtherchan@ubuntu910:~$ ls

aaa.c  aaa.s            Downloads         Music      test.c     桌面

aaa.h  apue_src.tar.gz  examples.desktop  Pictures   Videos

aaa.i  Desktop          macrotest         Public     workspace

aaa.o  Documents        macrotest.c       Templates  文档

 

furtherchan@ubuntu910:~$ gcc aaa.o -o aaa

furtherchan@ubuntu910:~$ ./aaa

Integer i = 5

GCC(GNU Compiler Collection)的编译流程主要分为四个阶段:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。每个阶段都有其特定的功能,并且 GCC 作为编译管理工具,会根据用户提供的源代码和编译选项自动调用相应的工具来完成这些步骤。 ### 预处理阶段(Preprocessing) 在预处理阶段,GCC 会处理源代码中的预处理指令,如宏定义(`#define`)、条件编译(`#ifdef`、`#ifndef`)和文件包含(`#include`)等。预处理器会将头文件的内容插入到源文件中,并展开宏定义,最终生成一个经过预处理的源文件(通常以 `.i` 为扩展名)。这一阶段可以通过 `-E` 选项单独执行[^2]。 ### 编译阶段(Compilation) 在编译阶段,GCC 会将预处理后的源代码(`.i` 文件)翻译为汇编语言代码(`.s` 文件)。这一阶段涉及词法分析、语法分析以及生成中间表示(IR),然后进行优化并最终生成目标平台的汇编代码。该阶段可以通过 `-S` 选项单独执行,以查看生成的汇编代码[^1]。 ### 汇编阶段(Assembly) 在汇编阶段,GCC 会将上一阶段生成的汇编代码(`.s` 文件)翻译为目标机器的机器指令,生成目标文件(通常以 `.o` 为扩展名)。目标文件包含可执行的机器代码以及一些符号信息,用于后续的链接过程。这一阶段可以通过 `-c` 选项单独执行,生成目标文件[^3]。 目标文件通常包含多个段(section),其中最重要的两个段是: - **代码段(文本段)**:包含程序的指令,通常是只读且可执行的。 - **数据段**:包含常量、全局变量和静态变量,通常是可读写但不可执行的。 ### 链接阶段(Linking) 在链接阶段,GCC 会将多个目标文件(`.o` 文件)和库文件(`.a` 或 `.so`)合并,生成最终的可执行文件。链接器会解析各个目标文件之间的符号引用,并将它们绑定到正确的内存地址上。如果没有指定输出文件名,GCC 默认会生成名为 `a.out` 的可执行文件[^1]。 ### 示例命令 以下是一个完整的 GCC 编译流程示例: ```bash # 预处理 gcc -E source.c -o source.i # 编译 gcc -S source.i -o source.s # 汇编 gcc -c source.s -o source.o # 链接 gcc source.o -o program ``` 也可以一步完成整个编译过程: ```bash gcc source.c -o program ``` ### 编译选项 GCC 提供了丰富的编译选项,用于控制编译过程的各个方面。例如: - `-Wall`:启用所有常用的警告信息。 - `-O2`:启用优化级别 2,提高生成代码的性能。 - `-g`:生成调试信息,便于使用 GDB 调试程序。 - `-static`:强制静态链接库文件[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值