编译原理编译系统和运行系统学习培训模板课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《编译原理编译系统和运行系统学习培训模板课件.ppt》由用户(林田)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 系统 运行 学习 培训 模板 课件
- 资源描述:
-
1、第十一章第十一章 编译系统和运行系统编译系统和运行系统 本章内容本章内容 C语言编译系统语言编译系统预处理器、汇编器预处理器、汇编器、连接器连接器 目标文件的格式、静态库、动态连接目标文件的格式、静态库、动态连接 Java运行系统运行系统 无用单元收集(垃圾收集)无用单元收集(垃圾收集)掌握从源程序到可执行目标程序的实际处理掌握从源程序到可执行目标程序的实际处理过程过程 对实际参与软件开发是直接有用的对实际参与软件开发是直接有用的11.1 C语言语言编译系统编译系统预处理器预处理器源程序源程序修改后的源程序修改后的源程序可重定位的目标程序可重定位的目标程序可重定位的可重定位的目标文件目标文件库
2、库编译器编译器汇编器汇编器汇编程序汇编程序连接器连接器可执行的目标程序可执行的目标程序 C源程序可以分成源程序可以分成若干个模块若干个模块 分别进行预处理分别进行预处理、编译和汇编、形、编译和汇编、形成可重定位的目标成可重定位的目标文件文件 目标文件和必要目标文件和必要的库文件连接成一的库文件连接成一个可执行的目标文个可执行的目标文件件 gccgcc和和cccc是编译驱是编译驱动程序的名字动程序的名字 11.1 C语言语言编译系统编译系统main.c(1)#if 1(2)int buf2;(3)#else(4)int buf2=10,20;(5)#endif(6)void swap();(7)
3、#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=*bufp1;(10)*bufp1=temp;(11)11.1 C语言语言编译系统编译系统11.1.1 预处理器预处理器 gcc首先
4、调用首先调用预处理器预处理器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);(11)swap();(12)printf(%d,%d,A,buf
5、1);(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产生汇编代码产生汇编代码 最简单的汇编器对输入进行两遍扫描最简单的汇编器对输入进行两遍扫描 一遍扫描完成汇编代码到可重定位目标代码一遍扫描完成汇编
6、代码到可重定位目标代码的翻译也是完全可能的的翻译也是完全可能的 用用 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.L6jmp.L11.L11:cmpl$0,-8(%ebp)jne.L6jmp.L12.L12:jmp.L5.p2align 4,7.L6:11.1 C语言语言编译系统编译系统11.1.3 连接器连接器目标模块或目标文件的形式目标模
7、块或目标文件的形式 可重定位的目标文件可重定位的目标文件 可执行的目标文件可执行的目标文件 共享目标文件共享目标文件 一种特殊的可重定位目标文件一种特殊的可重定位目标文件 在装入程序或运行程序时,动态地装入到内存并在装入程序或运行程序时,动态地装入到内存并连接连接11.1 C语言语言编译系统编译系统 连接连接是一个收集、组织程序所需的不同代码是一个收集、组织程序所需的不同代码和数据的过程,以便程序能被装入内存并被和数据的过程,以便程序能被装入内存并被执行执行 连接的时机连接的时机编译时编译时装入时装入时运行时运行时 静态连接器静态连接器 动态连接器动态连接器11.1 C语言语言编译系统编译系统
8、 一个重定位模块一个重定位模块M可能可能定义和引用的符号定义和引用的符号全局符号全局符号 指那些在模块指那些在模块M中定义,可以被其它中定义,可以被其它模块引用的符号模块引用的符号局部符号局部符号 指那些在模块指那些在模块M中定义,且只能在本中定义,且只能在本模块中引用的符号模块中引用的符号外部符号外部符号 指那些由模块指那些由模块M引用并由其它模块定引用并由其它模块定义符号义符号 符号解析符号解析识别各个目标模块中定义和引用的符号,为每一识别各个目标模块中定义和引用的符号,为每一个符号引用确定它所关联的一个同名符号的定义个符号引用确定它所关联的一个同名符号的定义 重定位重定位11.1 C语言
9、语言编译系统编译系统11.1.4 目标文件的格式目标文件的格式 目标文件格式随系统不同而不同目标文件格式随系统不同而不同 介绍介绍Unix的的ELF(Executable and Linkable Format)格式格式 Linux、System V Unix的后期版本、的后期版本、BSD Unix变体和变体和Sun Solaris,都使用都使用Unix的的ELF格式格式11.1 C语言语言编译系统编译系统ELF头头 描述了字的大小描述了字的大小 产生此文件的系统的字产生此文件的系统的字节次序节次序 目标文件的类型目标文件的类型 机器类型机器类型 节头表的位置、条目多节头表的位置、条目多少少
10、其它其它ELF头头.text.rodata.data.bss.symtab.rel.text.rel.data.debug.line.strtab节节头头表表0描述目标文描述目标文件的节件的节节节11.1 C语言语言编译系统编译系统节头表节头表 描述目标文件中各节的描述目标文件中各节的位置和大小位置和大小 处于目标文件的末尾处于目标文件的末尾ELF头头.text.rodata.data.bss.symtab.rel.text.rel.data.debug.line.strtab节节头头表表0描述目标文描述目标文件的节件的节节节11.1 C语言语言编译系统编译系统.text节节 被编译程序的机器
11、代码被编译程序的机器代码.rodata节节 诸如诸如printf语句中的格语句中的格式串和式串和switch语句的跳语句的跳转表等只读数据转表等只读数据.data节节 已初始化的全局变量已初始化的全局变量 ELF头头.text.rodata.data.bss.symtab.rel.text.rel.data.debug.line.strtab节节头头表表0描述目标文描述目标文件的节件的节节节11.1 C语言语言编译系统编译系统.bss节(节(.comm 节)节)未初始化的全局变量未初始化的全局变量 在目标文件中不占实际在目标文件中不占实际的空间的空间.symtab节节记录在该模块中定义和记录在
12、该模块中定义和引用的函数和全局变量引用的函数和全局变量的信息的符号表的信息的符号表ELF头头.text.rodata.data.bss.symtab.rel.text.rel.data.debug.line.strtab节节头头表表0描述目标文描述目标文件的节件的节节节11.1 C语言语言编译系统编译系统.symtab节节 Type FUNC OBJECT Bind GLOBAL LOCAL EXTERNELF头头.text.rodata.data.bss.symtab.rel.text.rel.data.debug.line.strtab节节头头表表0描述目标文描述目标文件的节件的节节节11
13、.1 C语言语言编译系统编译系统.symtab节节 Name Value偏移偏移地址,或地址,或绝对绝对地址地址 Size字节数字节数ELF头头.text.rodata.data.bss.symtab.rel.text.rel.data.debug.line.strtab节节头头表表0描述目标文描述目标文件的节件的节节节11.1 C语言语言编译系统编译系统.rel.text节节 .text节节中需要修改的中需要修改的单元的位置列表单元的位置列表.rel.data节节用于被本模块引用或定用于被本模块引用或定义的全局变量的重定位义的全局变量的重定位信息信息ELF头头.text.rodata.dat
14、a.bss.symtab.rel.text.rel.data.debug.line.strtab节节头头表表0描述目标文描述目标文件的节件的节节节11.1 C语言语言编译系统编译系统.debug节节用于调试程序的调试符用于调试程序的调试符号表号表.line节节源文件和源文件和.text节中的机节中的机器指令之间的行号映射器指令之间的行号映射 .strtab一组有空结束符的串构一组有空结束符的串构成的串表成的串表ELF头头.text.rodata.data.bss.symtab.rel.text.rel.data.debug.line.strtab节节头头表表0描述目标文描述目标文件的节件的节节
15、节11.1 C语言语言编译系统编译系统11.1.5 符号解析符号解析 将每个符号引用正确地与某可重定位模块的将每个符号引用正确地与某可重定位模块的符号表中的一个符号定义相关联,从而确定符号表中的一个符号定义相关联,从而确定各个符号引用的位置各个符号引用的位置 在所有输入模块中都找不到被引用符号的定在所有输入模块中都找不到被引用符号的定义,则打印错误消息并结束连接义,则打印错误消息并结束连接 需要定义解析规则需要定义解析规则11.1 C语言语言编译系统编译系统解析规则解析规则函数和已初始化的全局变量称为强符号;未函数和已初始化的全局变量称为强符号;未初始化的全局变量称为弱符号初始化的全局变量称为
16、弱符号 不允许有多重的强符号定义不允许有多重的强符号定义 出现一个强符号定义和多个弱符号定义时,出现一个强符号定义和多个弱符号定义时,选择强符号的定义选择强符号的定义 出现多个弱符号定义时,选择任意一个弱符出现多个弱符号定义时,选择任意一个弱符号的定义号的定义 11.1 C语言语言编译系统编译系统11.1.6 静态库静态库 将相关的可重定位目标模块打包成一个文件将相关的可重定位目标模块打包成一个文件,作为连接器的输入作为连接器的输入 连接器仅复制库中被应用程序引用的模块连接器仅复制库中被应用程序引用的模块gcc c swap.c编译编译ar rcs mylib.a swap.o建库建库gcc
17、static o swap1 main.c/usr/lib/libc.a mylib.a 生成可执行文件生成可执行文件11.1 C语言语言编译系统编译系统printf.o等等可重定位文件可重定位文件翻译器翻译器main.c源文件源文件连接器连接器main.omylib.aswap.olibc.a 静态库静态库swap1完全连接的可执行文件完全连接的可执行文件和静态库连接和静态库连接 11.1 C语言语言编译系统编译系统11.1.7 可执行目标文件及装入可执行目标文件及装入 可执行目标文件可执行目标文件与可重定位目标文件格式类与可重定位目标文件格式类似似 可执行目标文件的装入由加载器完成可执行目
18、标文件的装入由加载器完成11.1 C语言语言编译系统编译系统读读/写内存段写内存段ELF头头段头表段头表.init.text.rodata.data.bss.symtab.debug.line.strtab节头表节头表只读内存段只读内存段符号表和调试信符号表和调试信息,不装入内存息,不装入内存描述目标文件描述目标文件的节的节将下面的节映射到将下面的节映射到运行时的内存段运行时的内存段典型的典型的ELF可执行目标文件可执行目标文件11.1 C语言语言编译系统编译系统Linux运行时的内存映像运行时的内存映像内核内核用户栈用户栈(运行时创建)(运行时创建)共享库的共享库的内存区域内存区域运行时的堆
19、运行时的堆(运行时用(运行时用malloc创建)创建)读读/写段写段(.data,.bss)只读段只读段(.init,.text,.rodata)未使用未使用0 xc00000000 x400000000 x08048000对用户代码对用户代码不可见不可见%esp(栈指针)(栈指针)brk从可执行文件从可执行文件装入装入011.1 C语言语言编译系统编译系统 这里描述的装入过程从概念上来说是正确的这里描述的装入过程从概念上来说是正确的 若需要了解装入过程真正是怎样工作的,必若需要了解装入过程真正是怎样工作的,必须在理解了进程、虚拟内存和内存分页等概须在理解了进程、虚拟内存和内存分页等概念以后念
20、以后11.1 C语言语言编译系统编译系统11.1.8 动态连接动态连接 静态库静态库 周期性地被维护和更新周期性地被维护和更新 内存可能有多份内存可能有多份printf和和scanf的代码的代码 共享库共享库 在运行时可以装到任意的内存位置,被内存中在运行时可以装到任意的内存位置,被内存中的进程共享的进程共享11.1 C语言语言编译系统编译系统共享库以两种不同的方式被共享共享库以两种不同的方式被共享 共享库的代码和数据被所有引用该库的可执共享库的代码和数据被所有引用该库的可执行目标文件所共享行目标文件所共享 共享库的共享库的.text节在内存中的一个副本可以被节在内存中的一个副本可以被正在运行
21、的不同进程共享正在运行的不同进程共享11.1 C语言语言编译系统编译系统可重定位文件可重定位文件翻译器翻译器(cpp,cc1,as)main.c源文件源文件连接器(连接器(ld)main.olibc.somylib.so重定位和符重定位和符号表信息号表信息部分连接的可执部分连接的可执行目标文件行目标文件swap2加载器(加载器(execve)libc.somylib.so动态连接器(动态连接器(ld-linux.so)代码和代码和数据数据此时,动态连接器是内存中此时,动态连接器是内存中已完全连接的可执行代码已完全连接的可执行代码11.1 C语言语言编译系统编译系统加载器通常装入和运行动态连接器
22、加载器通常装入和运行动态连接器动态连接器接着完成连接任务动态连接器接着完成连接任务 把把libc.so的文本和数据装入内存并进行重定位的文本和数据装入内存并进行重定位 把把mylib.so的文本和数据装入内存并进行重定的文本和数据装入内存并进行重定位位 重定位重定位swap2中任何对中任何对libc.so或或mylib.so定义定义的符号的引用的符号的引用 将控制传递给应用程序将控制传递给应用程序11.1 C语言语言编译系统编译系统11.1.9 处理目标文件的一些工具处理目标文件的一些工具ar创建静态库,插入、删除、罗列和提取成创建静态库,插入、删除、罗列和提取成strings 列出包含在目标
23、文件中的所有可打印串列出包含在目标文件中的所有可打印串strip 从一个目标文件中删除符号表信息从一个目标文件中删除符号表信息nm 列出一个目标文件的符号表中定义的符号列出一个目标文件的符号表中定义的符号size 列出目标文件中各段的名字和大小列出目标文件中各段的名字和大小readelf 显示目标文件的完整结构,包括编码在显示目标文件的完整结构,包括编码在ELF头头中的所有信息。它包括了中的所有信息。它包括了size和和nm的功能的功能objdump可以显示目标文件中的所有信息。其最有可以显示目标文件中的所有信息。其最有用的功能是反汇编用的功能是反汇编.text节中的二进制指令节中的二进制指令
24、ldd列出可执行目标文件在运行时需要的共享库列出可执行目标文件在运行时需要的共享库 11.2 Java语言的运行系统语言的运行系统 Java语言语言简单性、分布性、安全性、可移植性等简单性、分布性、安全性、可移植性等我们关心的是:平台无关性我们关心的是:平台无关性 Java虚拟机技术是实现虚拟机技术是实现Java平台无关性特点平台无关性特点的关键的关键 Java运行系统就是运行系统就是Java虚拟机的一个实现虚拟机的一个实现11.2 Java语言的运行系统语言的运行系统11.2.1 Java虚拟机语言简介虚拟机语言简介Java程序首先由程序首先由Java编译器把它编译成字节码编译器把它编译成字
25、节码,也就是也就是JVML程序程序 常量池常量池:各种字符串常量各种字符串常量,类似于传统程序设类似于传统程序设计语言中的符号表计语言中的符号表 类成员信息类成员信息:域信息表和方法信息表域信息表和方法信息表 JVML指令序列指令序列11.2 Java语言的运行系统语言的运行系统Java源程序中的方法源程序中的方法int calculate(int i)int j=2;return(i+j)(j-1);对应的字节码程序:对应的字节码程序:int calculate(int i)iconst_2istore_2iload_1iload_2iaddiload_2iconst_1isubimulir
展开阅读全文