编译系统和运行时的系统(参照编译原理第三版第11章)
源程序———预处理器———修改后的源程序——编译器———汇编程序————汇编器————可重定位的目标程序————链接器(加入库文件和可重定位的目标文件)————可执行的目标程序
大多数编译系统提供一个驱动程序来调用预处理器、编译器、汇编器、链接器、以支持用户完成从源程序到可执行的目标文件。比如GCC。
如 gcc -v-o swap main.c swap.c
预处理器:
预处理器产生编译器的输入,主要有以下功能:
1.文件包含:
预处理器可以把源程序文件中的包含声明(#include)展开为程序正文,#include<stdio.h>,系统会在标准路径下搜素stdio.h,再用stdio.h中的内容代替这个语句。
2.宏展开
C程序可以用#define来定义宏,一个宏定义给出一段C代码的缩写,预处理器将源程序文件中出现的宏的引用展开相应的宏定义,称为宏展开。
3.条件编译
预处理器根据#if和#ifdef等编译命令及其后的条件,将源程序中的某部分包含进来或排除在外,通常把排除在外的语句换成空行。
编译器:
将C程序文件翻译成
汇编器:
将汇编语言翻译为机器语言的程序。一般而言,汇编生成的是目标代码,需要经链接器(Linker)生成可执行代码才可以执行。
最简单的汇编器对输入要进行两次扫描,第一遍,汇编器扫描输入,将表示存储单元的所有标识符都存入符号表,并分配地址。
第二遍,汇编器再次扫描输入,将每个操作码都翻译机器语言对应的位串,并将代表存储单元的每个标识符翻译成符号表中的为这个标识符分配的地址。
链接器:
1.可重定位的目标文件 它包含二进制代码和数据,可以和其他可重定位目标文件组装或一个可执行的目标文件。
2.可执行的目标文件
它包含二进制代码和数据,可以直接被复制到内存并被执行。
(一)静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,lib中的指令都全部被直接包含在最终生成的exe文件中了。但是若使用dll动态链接库,该dll不必被包含在最终的exe文件中,执行文件执行时可以动态地引用和卸载这个与exe独立的dll文件(二)静态链接库不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 使用差别静态链接库动态链接库使用的区别在于它允许可执行模块(dll或exe文件)仅包含在运行时定位dll函数的可执行代码的所需信息。静态链接库的使用中,连接器从静态链接库获取所有被引用的函数,并将库同代码一起放到可执行文件中。
原文地址:https://www.cnblogs.com/hcr1995/p/9643221.html