文档介绍:第十章语言编译系统和运行系统
本章内容
C语言编译系统
预处理器、汇编器、连接器
目标文件的格式、静态库、动态连接
Java运行系统
掌握从源程序到可执行目标程序的实际处理过程
对实际参与软件开发是直接有用的
C语言编译系统
预处理器
源程序
修改后的源程序
可重定位的目标程序
可重定位的
目标文件
库
编译器
汇编器
汇编程序
连接器
可执行的目标程序
C源程序可以分成若干个模块
分别进行预处理、编译和汇编、形成可重定位的目标文件
目标文件和必要的库文件连接成一个可执行的目标文件
是编译驱动程序的名字
C语言编译系统
(1) #if 1
(2) int buf[2];
(3) #else
(4) int buf[2] = {10,20};
(5) #endif
(6) void swap();
(7) #define A buf[0]
(8) int main()
(9) {
(10)scanf("%d, %d", buf, buf+1);
(11)swap();
(12)printf("%d, %d",A, buf[1]);
(13)return 0;
(14) }
(1) extern int buf[2];
(2) int *bufp0 = buf;
(3) int *bufp1;
(4) void swap()
(5) {
(6) int temp;
(7)bufp1 = buf+1;
(8)temp = *bufp0;
(9)*bufp0 = *bufp1;
(10)*bufp1 = temp;
(11) }
C语言编译系统
预处理器
gcc首先调用预处理器cpp,将源程序文件翻译成一个ASCII中间文件,它是经修改后的源程序
cpp实现以下功能
文件包含
宏展开
条件编译
C语言编译系统
(1) #if 1
(2) int buf[2];
(3) #else
(4) int buf[2] = {10,20};
(5) #endif
(6) void swap();
(7) #define A buf[0]
(8) int main()
(9) {
(10)scanf("%d, %d", buf, buf+1);
(11)swap();
(12)printf("%d, %d",A, buf[1]);
(13)return 0;
(14) }
(1) # 1 “”
(2)
(3) int buf[2];
(4)
(5)
(6)
(7) void swap();
(8)
(9) int main()
(10) {
(11) scanf("%d, %d", buf, buf+1);
(12) swap();
(13) printf("%d,%d",buf[0], …);
(14) return 0;
(15) }
C语言编译系统
汇编器
1产生汇编代码
最简单的汇编器对输入进行两遍扫描
一遍扫描完成汇编代码到可重定位目标代码的翻译也是完全可能的
用 gcc S
用 as o
C语言编译系统
一段汇编代码
.L2:
cmpl $0,-4(%ebp)
jne .L6
jmp .L11
.L11:
cmpl $0,-8(%ebp)
jne .L6
jmp .L12
.L12:
jmp .L5
.p2align 4,,7
.L6:
C语言编译系统
连接器
目标模块或目标文件的形式
可重定位的目标文件
可执行的目标文件
共享目标文件
一种特殊的可重定位目标文件
在装入程序或运行程序时,动态地装入到内存并连接
C语言编译系统
连接是一个收集、组织程序所需的不同代码和数据的过程,以便程序能被装入内存并被执行
连接的时机
编译时
装入时
运行时
静态连接器
动态连接器
C语言编译系统
一个重定位模块M可能定义和引用的符号
全局符号指那些在模块M中定义,可以被其它模块引用的符号
局部符号指那些在模块M中定义,且只能在本模块中引用的符号
外部符号指那些由模块M引用并由其它模块定义符号
符号解析
识别各个目标模块中定义和引用的符号,为每一个符号引用确定它所关联的一个同名符号的定义
重定位