GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac 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.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。
一、源代码
二、编译过程
(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.o、crti.o、crtbegin.o、crtend.o、crtn.o是gcc加入的系统标准启动文件,对于一般应用程序,这些启动是必需的。
l -lc:链接libc库文件,其中libc库文件中就实现了printf等函数。