GCC编译简单流程---汇总

一、过程:预处理编译、汇编、链接。

1、预处理 
gcc -E filename.c (对应的后台工具为cpp)  
预处理是C语言程序从源代码变成可执行程序的第一步,主要是C语言编译器对各种预处理命令进行处理,包括头文件的包含、宏定义的扩展、条件编译的选择等。 
cpp:The C Preprocessor,主要用来预处理宏定义、文件包含、条件编译等。
2、编译
gcc -S filename.c (对应的后台工具则分别为cc1)  =>得到汇编代码 .s 
2.1、解释程序 
将源语言书写的源程序作为输入,解释一句后就提交计算机执行一句,并不形成目标程序,适合于通过终端设备与计算机会话,适合于小型机的计算问题。解释程序执行速度慢,易造成浪费。 
2.2、编译程序 
把高级语言源程序作为输入,进行翻译转换,产生出机器语言的目标程序,执行目标程序,得到计算结果。 
1)分析,是指词法分析和语法分析;

2)综合,代码优化,存储分配和代码生成。

编译程序采用对源程序进行多次扫描的办法,每次扫描集中完成一项或几项任务。如词法分析;语法分析;扫描做代码优化和存储分配;代码生成。 对于需要经常使用的有大量计算的大型题目,采用招待速度较快的编译型的高级语言,虽编译过程本身较复杂,但一旦形成目标文件,可多次使用。
3、汇编
gcc的-c选项或 as命令  (对应的后台工具为as)  => 目标代码 .o

把作为中间结果的汇编代码翻译成了机器代码(目标代码)
 

ELF格式的目标代码

1)结构: 
ELF Header(文件头) 
Porgram Headers Table(用于描述可执行文件和可共享库) 
Section 1 
Section 2    
Section 3
。。。。
 2)相关工具

binutils(GNU Binary Utilities)的很多工具都采用BFD库来操作目标文件,如objdump,objcopy,nm,strip等;

分析工具readelf:-h,-l和-S参数查看ELF Header、Program Headers Table段表和Section Headers Table节区表。

4、链接

gcc -o  filename  根据目标代码连接产生可执行文件。

处理可重定位文件,把符号引用和符号定义转换为可执行文件中的信息(一般是虚拟内存地址)的过程

链接分为静态链接和动态链接,静态链接:用ld静态链接器链接;动态链接:程序运行期间系统调用动态链接器(ld-linux.so)自动链接

ps:三种类型的文件:可重定位文件、静态连接库和动态连接库。

可重定位文件本身不可以运行,仅作为可执行文件、静态连接库(也是可重定位文件)、动态连接库的 “组件”。

静态连接库和动态连接库本身也不可以执行,作为可执行文件的“组件”。静态连接库是可重定位文件(可能是多个可重定位文件的集合),在连接时加入到可执行文件中去;动态连接库在连接时,库文件本身并没有添加到可执行文件中,只是在可执行文件中加入了该库的名字等信息,以便在可执行文件运行过程中引用库中的函数时由动态连接器去查找相关函数的地址,并调用它们。

动态共享库的搜素顺序:

1、LD_LIBRARY_PATH

2、ldconfig utility 维护的/etc/ld.so.cache,ldconfig utility:建立、保存共享库。

3、/lib

4、/usr/lib

命令:

Idconfig -v:列出并连接共享库; 

ldd /目录 显示依赖关系;

objdump -i列出目标文件、静态库、共享库的摘要信息



对一test.c 文件的执行过程:

1、gcc test.c -o test

2、./test


你可能感兴趣的:(GCC编译简单流程---汇总)