zoukankan      html  css  js  c++  java
  • GCC编译器

    GCC(GNU Compiler Collection,即 GNU编译器套装),是一套由GNU开发的编程语言编译器。它是一套以GPL及LGPL许可证所发行的自由软件.

    编译过程简介

    1、直接将源文件编译成可执行文件

    gcc hello.c -o hello  

    从.c文件生成直接运行的二进制文件的转换过程:

    (1)预处理

    gcc -E hello.c -o hello.i
    • 删除#define,展开所有宏定义。例#define portnumber 3333
    • 处理条件预编译 #if, #ifdef, #if, #elif,#endif
    • 处理“#include”预编译指令,将包含的“.h”文件插入对应位置。这可是递归进行的,    文件内可能包含其他“.h”文件。
    • 删除所有注释。/**/,//。
    • 添加行号和文件标识符。用于显示调试信息:错误或警告的位置。
    • 保留#pragma编译器指令。(1)设定编译器状态,(2)指示编译器完成一些特定的动作。

    (2)编译

    gcc -s hello.c -o hello.s
    • 扫描(词法分析)
    • 语法分析
    • 语义分析
    • 源代码优化(中间语言生成)
    • 代码生成,目标代码优化。

    (3)汇编

    gcc -c hello.c -o hello.o

     汇编器是将汇编代码转变成可以执行的指令,生成目标文件。

    (4)链接

    gcc hello.o -o hello

      将各个模块之间相互引用的部分正确的衔接起来。它的工作就是把一些指令对其他符号地址的引用加以修正,链接过程主要包括了地址和空间分配、符号决议和重定向。

    • 地址和空间分配
    • 符号决议:有时候也被叫做符号绑定、名称绑定、名称决议、或者地址绑定,其实就是指用符号来去标识一个地址。比如说 int a = 6;这样一句代码,用a来标识一个块4个字节大小的空间,空间里边存放的内容就是4.
    • 重新计算各个目标的地址过程叫做重定位。最基本的链接叫做静态链接,就是将每个模块的源代码文件编译成目标文件(Linux:.o Windows:.obj),然后将目标文件和库链接形成最后的可执行文件。

     

     

  • 相关阅读:
    Codevs 2296 仪仗队 2008年省队选拔赛山东
    Codevs 1535 封锁阳光大学
    Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组
    Codevs 1218 疫情控制 2012年NOIP全国联赛提高组
    Codevs 1684 垃圾陷阱
    洛谷 P1108 低价购买
    Vijos P1325桐桐的糖果计划
    Codevs 3289 花匠 2013年NOIP全国联赛提高组
    Codevs 2611 观光旅游(floyed最小环)
    C语言基础之彩色版C语言(内含linux)
  • 原文地址:https://www.cnblogs.com/yuanqiangfei/p/14559990.html
Copyright © 2011-2022 走看看