GCC编译和链接过程

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

 

一、源代码

GCC编译和链接过程

 

 

二、编译过程

 

(1)预处理:

GCC编译和链接过程

 

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

结果:见文件0617_Demo.i

GCC编译和链接过程

 

 (2)编译

 

GCC编译和链接过程

 

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

结果:见文件0617_Demo.s

GCC编译和链接过程

 

 (3)汇编

 

GCC编译和链接过程

 

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

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

结果:见文件0617_Demo.o

GCC编译和链接过程

 

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

 

(4)链接

GCC编译和链接过程

 

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

结果:见文件0617_Demo

GCC编译和链接过程

 

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

 

三、链接原理

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

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

GCC编译和链接过程

 

  

l  crt1.o、crti.o、crtbegin.o、crtend.o、crtn.o是gcc加入的系统标准启动文件,对于一般应用程序,这些启动是必需的。

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

 

 

 

 

 

GCC编译和链接过程

 

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

 

一、源代码

GCC编译和链接过程

 

二、编译过程

(1)预处理:

GCC编译和链接过程

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

结果:见文件0617_Demo.i

GCC编译和链接过程

 

(2)编译

GCC编译和链接过程

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

结果:见文件0617_Demo.s

GCC编译和链接过程

 

(3)汇编

GCC编译和链接过程

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

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

结果:见文件0617_Demo.o

GCC编译和链接过程

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

 

(4)链接

GCC编译和链接过程

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

结果:见文件0617_Demo

GCC编译和链接过程

 

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

 

三、链接原理

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

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

GCC编译和链接过程

 

l  crt1.o、crti.o、crtbegin.o、crtend.o、crtn.o是gcc加入的系统标准启动文件,对于一般应用程序,这些启动是必需的。

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

 

上一篇:【已解决】libfreeimage.so:对‘TIFFTileRowSize@LIBTIFF_4.0’未定义的引用


下一篇:Linux简介