zoukankan      html  css  js  c++  java
  • gcc/g++ 编译过程

    四个阶段:预编译、编译、汇编和链接。

    阶段 输入 输出 工具 示例
    预编译 *.c *.i 预处理器cpp gcc –E test.c –o test.i
    编译 *.i *.s  汇编代码 编译器egcs gcc –S test.i –o test.s
    汇编 *.s *.o  目标代码 汇编器as gcc –c test.s –o test.o
    链接 *.o 可执行文件 连接器ld gcc test.o –o test

    简单理解:

    预编译:替换宏定义的变量和include包含以及进行条件编译;即如#define PI 3.1415,则将文件中的PI用3.1415替换,include文件包含和条件编译同理。

    编译:生成汇编语言。

    汇编:生成机器语言。

    链接:生成可执行程序。

    执行过程示例(百度百科)

    示例代码 a.c:

      #include <stdio.h>

      int main()

      {

      printf("hello\n");

      }

    编译过程

      这个过程处理宏定义和include,并做语法检查。

      可以看到预编译后,代码从5行扩展到了910行。

      gcc -E a.c -o a.i

      cat a.c | wc -l

      5

      cat a.i | wc -l

      910

    编译过程

      这个阶段,生成汇编代码。

      gcc -S a.i -o a.s

      cat a.s | wc -l

      59

    汇编过程

      这个阶段,生成目标代码

      此过程生成ELF格式的目标代码。

      gcc -c a.s -o a.o

      file a.o

      a.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped

    链接过程

      链接过程。生成可执行代码。链接分为两种,一种是静态链接,另外一种是动态链接。使用静态链接的好处是,依赖的动态链接库较少,对动态链接库的版本不会很敏感,具有较好的兼容性;缺点是生成的程序比较大。使用动态链接的好处是,生成的程序比较小,占用较少的内存。

      gcc a.o -o a

      程序运行:

      ./a

      hello

  • 相关阅读:
    SQL中distinct的用法
    python requests 高级用法 -- 包括SSL 证书错误的解决方案
    odoo js
    线程池的理解及使用
    单点登录原理及简单实现
    如何重写hashCode()和equals()方法
    多线程中的Lock小结
    Sql语句的优化摘要
    Spring事务管理
    并发编程之原子性、可见性、有序性的简单理解
  • 原文地址:https://www.cnblogs.com/helloweworld/p/2693611.html
Copyright © 2011-2022 走看看