• GCC编译和链接过程


    GCCGNU Compiler CollectionGNU编译器套件),是由 GNU 开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如LinuxBSDMac OS X等)采纳为标准的编译器,GCC同样适用于微软的Windows

     

    一、源代码

     

    二、编译过程

    1)预处理:

     

     预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些代码输出到一个“.i”文件中等待进一步处理。

    结果:见文件0617_Demo.i

     

     2)编译

     

     

     编译就是把C/C++代码(比如上面的".i"文件)“翻译”成汇编代码。

    结果:见文件0617_Demo.s

     

     3)汇编

     

     

     红色箭头处的relocatable表示可重定位,也即是可以和库等依赖文件链接。

    汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码,在Linux系统上一般表现位ELF目标文件(OBJ文件)

    结果:见文件0617_Demo.o

     

     这个就是没有连接的目标代码,也是01序列,需要使用二进制查看器如Hex Editor Neo等查看。

     

    4)链接

     

     链接就是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序。如图中红色箭头所示。

    结果:见文件0617_Demo

     

     总结:在编译过程中。除非使用了"-c",“-S,"-E"选项(或者编译错误阻止了完整的过程),否则统一完整链接步骤。

     

    三、链接原理

    gcc -c -o 0617_Demo.o 0617_Demo.c 不作最后一步链接,得到0617_Demo.o二进制OBJ文件

    gcc -v -o 0617_Demo 0617_Demo.o 先看一下链接过程是怎样的:

     

      

    l  crt1.ocrti.ocrtbegin.ocrtend.ocrtn.ogcc加入的系统标准启动文件,对于一般应用程序,这些启动是必需的。

    l  -lc:链接libc库文件,其中libc库文件中就实现了printf等函数。

     

     

     

     

     

     

  • 相关阅读:
    Linux下JDK的安装
    Docker 搭建 Maven 私服
    K8s 部署 PostgreSQL
    CentOS7 使用 kubeadm 部署 K8s(单机/集群)
    CentOS7 升级 Vim
    Go 函数详解
    CentOS7 安装 golang
    Redis 集群伸缩原理
    CentOS7 安装 Redis
    CentOS7 搭建 Redis 集群
  • 原文地址:https://www.cnblogs.com/ruigelwang/p/13197608.html
Copyright © 2020-2023  润新知