编译原理 编译系统和运行系统 11.ppt
《编译原理 编译系统和运行系统 11.ppt》由会员分享,可在线阅读,更多相关《编译原理 编译系统和运行系统 11.ppt(65页珍藏版)》请在三一文库上搜索。
1、第十一章 编译系统和运行系统,本章内容 C语言编译系统 预处理器、汇编器、连接器 目标文件的格式、静态库、动态连接 Java运行系统 无用单元收集(垃圾收集) 掌握从源程序到可执行目标程序的实际处理过程 对实际参与软件开发是直接有用的,11.1 C语言编译系统,C源程序可以分成若干个模块 分别进行预处理、编译和汇编、形成可重定位的目标文件 目标文件和必要的库文件连接成一个可执行的目标文件 gcc和cc是编译驱动程序的名字,11.1 C语言编译系统,main.c (1) #if 1 (2) int buf2; (3) #else (4) int buf2 = 10,20; (5) #endif
2、(6) void swap(); (7) #define A buf0 (8) int main() (9) (10)scanf(“%d, %d“, buf, buf+1); (11)swap(); (12)printf(“%d, %d“,A, buf1); (13)return 0; (14) ,swap.c (1) extern int buf2; (2) int *bufp0 = buf; (3) int *bufp1; (4) void swap() (5) (6) int temp; (7)bufp1 = buf+1; (8)temp = *bufp0; (9)*bufp0 = *b
3、ufp1; (10)*bufp1 = temp; (11) ,11.1 C语言编译系统,11.1.1 预处理器 gcc首先调用预处理器cpp,将源程序文件翻译成一个ASCII中间文件,它是经修改后的源程序 cpp实现以下功能 文件包含 宏展开 条件编译,11.1 C语言编译系统,main.c (1) #if 1 (2) int buf2; (3) #else (4) int buf2 = 10,20; (5) #endif (6) void swap(); (7) #define A buf0 (8) int main() (9) (10)scanf(“%d, %d“, buf, buf+1)
4、; (11)swap(); (12)printf(“%d, %d“,A, buf1); (13)return 0; (14) ,main.i (1) # 1 “main.c” (2) (3) int buf2; (4) (5) (6) (7) void swap(); (8) (9) int main() (10) (11) scanf(“%d, %d“, buf, buf+1); (12) swap(); (13) printf(“%d,%d“,buf0, ); (14) return 0; (15) ,11.1 C语言编译系统,11.1.2 汇编器 GCC系统的编译器cc1产生汇编代码 最
5、简单的汇编器对输入进行两遍扫描 一遍扫描完成汇编代码到可重定位目标代码的翻译也是完全可能的 用 gcc S main.c 可以得到汇编文件main.s 用 as o main.o main.s 可以将main.s汇编成可重定位目标文件main.o,11.1 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:,11.1 C语言编译系统,11.1.3 连接器 目标模块或目标文件的形式 可重定位的目标文
6、件 可执行的目标文件 共享目标文件 一种特殊的可重定位目标文件 在装入程序或运行程序时,动态地装入到内存并连接,11.1 C语言编译系统,连接是一个收集、组织程序所需的不同代码和数据的过程,以便程序能被装入内存并被执行 连接的时机 编译时 装入时 运行时 静态连接器 动态连接器,11.1 C语言编译系统,一个重定位模块M可能定义和引用的符号 全局符号 指那些在模块M中定义,可以被其它模块引用的符号 局部符号 指那些在模块M中定义,且只能在本模块中引用的符号 外部符号 指那些由模块M引用并由其它模块定义符号 符号解析 识别各个目标模块中定义和引用的符号,为每一个符号引用确定它所关联的一个同名符号
7、的定义 重定位,11.1 C语言编译系统,11.1.4 目标文件的格式 目标文件格式随系统不同而不同 介绍Unix的ELF(Executable and Linkable Format)格式 Linux、System V Unix的后期版本、BSD Unix变体和Sun Solaris,都使用Unix的ELF格式,11.1 C语言编译系统,ELF头 描述了字的大小 产生此文件的系统的字节次序 目标文件的类型 机器类型 节头表的位置、条目多少 其它,11.1 C语言编译系统,节头表 描述目标文件中各节的位置和大小 处于目标文件的末尾,11.1 C语言编译系统,.text节 被编译程序的机器代码
8、.rodata节 诸如printf语句中的格式串和switch语句的跳转表等只读数据 .data节 已初始化的全局变量,11.1 C语言编译系统,.bss节(.comm 节) 未初始化的全局变量 在目标文件中不占实际的空间 .symtab节 记录在该模块中定义和引用的函数和全局变量的信息的符号表,11.1 C语言编译系统,.symtab节 Type FUNC OBJECT Bind GLOBAL LOCAL EXTERN,11.1 C语言编译系统,.symtab节 Name Value 偏移地址,或 绝对地址 Size 字节数,11.1 C语言编译系统,.rel.text节 .text节中需要
9、修改的单元的位置列表 .rel.data节 用于被本模块引用或定义的全局变量的重定位信息,11.1 C语言编译系统,.debug节 用于调试程序的调试符号表 .line节 源文件和.text节中的机器指令之间的行号映射 .strtab 一组有空结束符的串构成的串表,11.1 C语言编译系统,11.1.5 符号解析 将每个符号引用正确地与某可重定位模块的符号表中的一个符号定义相关联,从而确定各个符号引用的位置 在所有输入模块中都找不到被引用符号的定义,则打印错误消息并结束连接 需要定义解析规则,11.1 C语言编译系统,解析规则 函数和已初始化的全局变量称为强符号;未初始化的全局变量称为弱符号
10、不允许有多重的强符号定义 出现一个强符号定义和多个弱符号定义时,选择强符号的定义 出现多个弱符号定义时,选择任意一个弱符号的定义,11.1 C语言编译系统,11.1.6 静态库 将相关的可重定位目标模块打包成一个文件,作为连接器的输入 连接器仅复制库中被应用程序引用的模块 gcc c swap.c 编译 ar rcs mylib.a swap.o 建库 gcc static o swap1 main.c /usr/lib/libc.a mylib.a 生成可执行文件,11.1 C语言编译系统,和静态库连接,11.1 C语言编译系统,11.1.7 可执行目标文件及装入 可执行目标文件与可重定位目
11、标文件格式类似 可执行目标文件的装入由加载器完成,11.1 C语言编译系统,典型的ELF可执行目标文件,11.1 C语言编译系统,Linux运行时的内存映像,11.1 C语言编译系统,这里描述的装入过程从概念上来说是正确的 若需要了解装入过程真正是怎样工作的,必须在理解了进程、虚拟内存和内存分页等概念以后,11.1 C语言编译系统,11.1.8 动态连接 静态库 周期性地被维护和更新 内存可能有多份printf和scanf的代码 共享库 在运行时可以装到任意的内存位置,被内存中的进程共享,11.1 C语言编译系统,共享库以两种不同的方式被共享 共享库的代码和数据被所有引用该库的可执行目标文件所
12、共享 共享库的.text节在内存中的一个副本可以被正在运行的不同进程共享,11.1 C语言编译系统,11.1 C语言编译系统,加载器通常装入和运行动态连接器 动态连接器接着完成连接任务 把libc.so的文本和数据装入内存并进行重定位 把mylib.so的文本和数据装入内存并进行重定位 重定位swap2中任何对libc.so或mylib.so定义的符号的引用 将控制传递给应用程序,11.1 C语言编译系统,11.1.9 处理目标文件的一些工具 ar 创建静态库,插入、删除、罗列和提取成 strings 列出包含在目标文件中的所有可打印串 strip 从一个目标文件中删除符号表信息 nm 列出一
13、个目标文件的符号表中定义的符号 size 列出目标文件中各段的名字和大小 readelf 显示目标文件的完整结构,包括编码在ELF头中的所有信息。它包括了size和nm的功能 objdump 可以显示目标文件中的所有信息。其最有用的功能是反汇编.text节中的二进制指令 ldd 列出可执行目标文件在运行时需要的共享库,11.2 Java语言的运行系统,Java语言 简单性、分布性、安全性、可移植性等 我们关心的是:平台无关性 Java虚拟机技术是实现Java平台无关性特点的关键 Java运行系统就是Java虚拟机的一个实现,11.2 Java语言的运行系统,11.2.1 Java虚拟机语言简介
14、 Java程序首先由Java编译器把它编译成字节码, 也就是JVML程序 常量池: 各种字符串常量,类似于传统程序设计语言中的符号表 类成员信息: 域信息表和方法信息表 JVML指令序列,11.2 Java语言的运行系统,Java源程序中的方法 int calculate (int i) int j =2; return (i+j) (j-1); ,对应的字节码程序: int calculate (int i) iconst_2 istore_2 iload_1 iload_2 iadd iload_2 iconst_1 isub imul ireturn,11.2 Java语言的运行系统,1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理 编译系统和运行系统 11 编译 原理 系统 运行
链接地址:https://www.31doc.com/p-4211097.html