- 1、本文档共81页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
;C语言编译系统
预处理器、编译器、汇编器、连接器
目标文件的格式、静态库、动态连接
Java运行系统
无用单元收集(垃圾收集)
多样化编译与反编译技术
引入本章的目的
掌握从源程序到可执行目标程序的实际处理过程
对实际参与软件开发是直接有用的
;10.1C语言编译系统;C源程序可以分成若干
个模块(文件)
分别进行预处理、编译
和汇编、形成可重定位
的目标文件
目标文件和必要的库文
件连接成一个可执行的
目标文件
gcc和cc是编译驱动程
序的名字
;10.1.1预处理器
gcc首先调用预处理器cpp,将源程序文件翻译成一个ASCII中间文件,它是经修改后的源程序
cpp实现以下功能
文件包含
宏展开
条件编译
;10.1C语言编译系统;10.1.2汇编器
gcc系统的编译器cc1产生汇编代码
最简单的汇编器对输入进行两遍扫描
例一段汇编代码
.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:;一遍扫描完成汇编代码到可重定位目标代码的翻译也是完全可能的
例一段汇编代码
.L2:
cmpl $0, -4(%ebp)
jne .L6 建.L6的回填链
jmp .L11
.L11:
cmpl $0, -8(%ebp)
jne .L6 加入.L6的回填链
jmp .L12
.L12:
jmp .L5
.p2align 4,,7
.L6: 顺.L6回填链进行回填;用 gcc?Smain.c
可以得到汇编文件main.s
用 as?omain.omain.s
可以将main.s汇编成可重定位目标文件main.o
;10.1.3连接器
目标模块或目标文件的形式
可重定位的目标文件
可执行的目标文件
共享目标文件
一种特殊的可重定位目标文件
在装入程序或运行程序时,动态地装入到内存并连接
;连接是一个收集、组织程序所需的不同代码和数据的过程,以便程序能被装入内存并被执行
连接的时机
编译时,装入时,或运行时
静态连接器
动态连接器
可重定位目标模块的组成?(回顾例子)
;10.1C语言编译系统;一个重定位模块M可能定义和引用的符号
全局符号指那些在模块M中定义,可以被其它模块引用的符号
局部符号指那些在模块M中定义,且只能在本模块中引用的符号
外部符号指那些由模块M引用并由其它模块定义符号
符号解析
识别各个目标模块中定义和引用的符号,为每一个符号引用确定它所关联的一个同名符号的定义
重定位
;10.1.4目标文件的格式
目标文件格式随系统不同而不同
介绍Unix的ELF(ExecutableandLinkableFormat)格式
Linux、SystemVUnix的后期版本、BSDUnix变体和SunSolaris,都使用Unix的ELF格式
;ELF头
描述了字的大小
产生此文件的系统的字节次序
目标文件的类型
机器类型
节头表的位置、条目多少
其它
节头表
描述目标文件中各节的位置和大小
处于目标文件的末尾;.text节
被编译程序的机器代码
.rodata节
诸如printf语句中的格式串和switch
语句的跳转表等只读数据
.data节
已初始化的全局变量
.bss节(.comm节)
未初始化的全局变量
在目标文件中不占实际的空间;.symtab节
记录在该模块中定义和引用
的函数和全局变量的信息的
符号表
Name:指针
Value:偏移地址或
绝对地址
Size:字节数
Type:FUNC或OBJECT
Bind:GLOBAL或LOCAL
或EXTERN;.rel.text节
.text节中需要修改的单元的
位置列表
.rel.data节
用于被本模块引用或定义的
全局变量的重定位信息
.debug节
用于调试程序的调试符号表;.line节
源文件和.text节中的机器指
令之间的行号映射
.strtab
一组有空结束符的串构成的
串表;10.1.5符号解析
将每个符号引用正确地与某可重定位模块的符号表中的一个符号定义相关联,从而确定各个符号引用的位置
在所有输入模块中都找不到被引用符号的定义,则打印错误消息并结束连接
需要定义解析规则
函数和已初始化的全局变量称为强符号;未初始化的全局变量称为弱符号
不允许有多重的强符号定义
出现一个强符号定义和多个弱符号定义时,选择强符号的定义
出现多个弱符号定义时,选择任意一个弱符号的定义
;10.1.6静态库
将相关的可重定位目标模块打包成一个文件,作为连接器的输入
连接器
文档评论(0)