zoukankan      html  css  js  c++  java
  • 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等函数。

     

     

     

     

     

     

  • 相关阅读:
    搭建redis sentinel 和 cluster
    ASP.NET WebForm Ajax请求Handler的经验
    ASP.NET WebForm Identity使用
    Github Pages 无法调用 node_modules 文件夹的解决方案
    聊聊手机之--小米6
    boostrap-非常好用但是容易让人忽略的地方【7】:list-unstyled list-inline
    boostrap-非常好用但是容易让人忽略的地方【6】:role属性
    monaco-editor使用
    关于oppo和vivo这两年强势崛起的反思
    Build 2017(简体中文视频)
  • 原文地址:https://www.cnblogs.com/ruigelwang/p/13197608.html
Copyright © 2011-2022 走看看