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

     

     

  • 相关阅读:
    转载阿里开源的分布式事务框架 Seata
    查看进程上的线程数量
    chmod命令
    查找端口与查找正在运行的进程
    可输入的文本框
    js 类和对象
    js 三维数组
    ajax
    ORACLE数据库主要的系统表和数据字典视图
    url 传参
  • 原文地址:https://www.cnblogs.com/yuanqiangfei/p/14559990.html
Copyright © 2020-2023  润新知