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),然后将目标文件和库链接形成最后的可执行文件。

     

     

  • 相关阅读:
    回顾:异常处理,值传递和引用传递
    回顾:静态变量和实例变量、构造器
    多态、抽象类与接口
    回顾:面向对象、基本类型
    总结一下《深入理解Java虚拟机》
    百度实习生面试题
    面试题
    阿里面试
    Shell
    Collector详解
  • 原文地址:https://www.cnblogs.com/yuanqiangfei/p/14559990.html
Copyright © 2011-2022 走看看