- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
中国科大 第十一章 语言编译系 统和运行系统 本章内容 -C语言编译系统 预处理器、汇编器、连接器 目标文件的格式、静态库、动态连接 -Java运行系统 -掌握从源程序到可执行目标程序的实际处理过程 -对实际参与软件开发是直接有用的 11.1 C语言编译系统 例如 一、 预处理器 gcc首先调用预处理器cpp,将源程序文件翻译成一个ASCII中间文件,它是经修改后的源程序 cpp实现以下功能 文件包含 宏展开 条件编译 示例 二、 汇编器 GCC系统的编译器cc1产生汇编代码 最简单的汇编器对输入进行两遍扫描 一遍扫描完成汇编代码到可重定位目标代码的翻译也是完全可能的 用 gcc ?S main.c 可以得到汇编文件main.s 用 as ?o main.o main.s 可以将main.s汇编成可重定位目标文件main.o 三、 连接器 目标模块或目标文件的形式 可重定位的目标文件 可执行的目标文件 共享目标文件 一种特殊的可重定位目标文件 在装入程序或运行程序时,动态地装入到内存并连接 连接是一个收集、组织程序所需的不同代码和数据的过程,以便程序能被装入内存并被执行 连接的时机 编译时 装入时 运行时 静态连接器 动态连接器 -一个重定位模块M可能定义和引用的符号 全局符号 指那些在模块M中定义,可以被其它模块引用的符号 局部符号 指那些在模块M中定义,且只能在本模块中引用的符号 外部符号 指那些由模块M引用并由其它模块定义符号 -符号解析 识别各个目标模块中定义和引用的符号,为每一个符号引用确定它所关联的一个同名符号的定义 -重定位 四、目标文件的格式 目标文件格式随系统不同而不同 介绍Unix的ELF(Executable and Linkable Format)格式 Linux、System V Unix的后期版本、BSD Unix变体和Sun Solaris,都使用Unix的ELF格式 ELF头 描述了字的大小 产生此文件的系统的字节次序 目标文件的类型 机器类型 节头表的位置 其它 节头表 节头表 -目标文件中各节的位置和大小 -处于目标文件的末尾 -text节 被编译程序的机器代码 -rodata节 诸如printf语句中的格式串和switch语句的跳转表等只读数据 -data节 已初始化的全局变量 -bss节(.comm 节) 未初始化的全局变量 在目标文件中不占实际的空间 -symtab节 记录在该模块中定义和引用的函数和全局变量的信息的符号表 symtab节 Type FUNC OBJECT Bind GLOBAL LOCAL EXTERN Name Value 偏移地址,或 绝对地址 Size 字节数 -rel.text节 -text节中需要修改的单元的位置列表 -rel.data节 用于被本模块引用或定义的全局变量的重定位信息 -debug节 用于调试程序的调试符号表 -line节 源文件和.text节中的机器指令之间的行号映射 -strtab 一组有空结束符的串构成的串表 五、符号解析 将每个符号引用正确地与某可重定位模块的符号表中的一个符号定义相关联,从而确定各个符号引用的位置 在所有输入模块中都找不到被引用符号的定义,则打印错误消息并结束连接 需要定义解析规则 六、静态库 将相关的可重定位目标模块打包成一个文件,作为连接器的输入 连接器仅复制库中被应用程序引用的模块 gcc ?c swap.c ??编译 ar rcs mylib.a swap.o ??建库 gcc ?static ?o swap1 main.c /usr/lib/libc.a mylib.a ??生成可执行文件 七、可执行目标文件及装入 可执行目标文件与可重定位目标文件格式类似 可执行目标文件的装入由装载器完成 典型的ELF可执行目标文件 Linux运行时的内存映像 这里描述的装入过程从概念上来说是正确的 若需要了解装入过程真正是怎样工作的,必须在理解了进程、虚拟内存和内存分页等概念以后 八、动态连接 -静态库 周期性地被维护和更新 printf和scanf这样的标准I/O函数可能内存有很多份一样的代码 -共享库 在运行时可以装到任意的内存位置,被内存中的进程共享 -共享库以两种不同的方式被共享 共享库的代码和数据被所有引用该库的可执行目标文件所共享 共享库的.text节在内存中的一个副本可以被正在运行的不同进程共享 装载器通常装入和运行动态连接器 动态连接器接着完成连接任务 把libc.so的文本和数据装入内存并进行重定位 把mylib.so的文本和数据装入内存并进行重定位 重定位swap2中任何对libc.so或m
文档评论(0)