GCC编译和链接过程

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

 

一、源代码

GCC编译和链接过程_第1张图片

 

 

二、编译过程

 

1)预处理:

GCC编译和链接过程_第2张图片

 

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

结果:见文件0617_Demo.i

GCC编译和链接过程_第3张图片

 

 2)编译

 

 

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

结果:见文件0617_Demo.s

GCC编译和链接过程_第4张图片

 

 3)汇编

 

GCC编译和链接过程_第5张图片

 

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

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

结果:见文件0617_Demo.o

GCC编译和链接过程_第6张图片

 

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

 

4)链接

GCC编译和链接过程_第7张图片

 

 链接就是将汇编生成的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 先看一下链接过程是怎样的:

GCC编译和链接过程_第8张图片

 

  

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

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

 

 

 

 

 

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等函数。

 

你可能感兴趣的:(GCC编译和链接过程)