8.1 C语言编译系统 8.1.2汇编器 GCC系统的编译器cc1产生汇编代码 最简单的汇编器对输入进行两遍扫描 一遍扫描完成汇编代码到可重定位目标代码 的翻译也是完全可能的 用gcc-S main..c 可以得到汇编文件main.s 。用as-0main.0main.s 可以将main.s汇编成可重定位目标文件main.0
8 1. C语言编译系统 8.1.2 汇编器 • GCC系统的编译器cc1产生汇编代码 • 最简单的汇编器对输入进行两遍扫描 • 一遍扫描完成汇编代码到可重定位目标代码 的翻译也是完全可能的 • 用 gcc S main c S main.c 可以得到 编文件 汇 main.s • 用 as o main.o main.s 可以将main.s汇编成可重定位目标文件main.o
8.1 C语言编译系统 ·例一 段汇编代码 .L2: 第一编扫描建立符号表 cmpl $0,-4(%ebp) 包括代码标号.L2、.L11 jne .L6 等 jmp .L11 第二遍扫描依据符号表 L11: 中的信息来产生可重定 cmpl $0,-8(%ebp) 位代码 jne .L6 jmp .L12 L12: jmp.L5 p2align 4,,7 L6:
8 1. 1 C语言编译系统 • 例 一段汇编代码 .L2: 第 编扫描建 符号表 一编扫描建 立符号表 , cmpl $0,-4(%ebp) 包括代码标号.L2 、.L11 j en e . L 6 等 jmp .L11 第二遍扫描依据符号表 . L11 : 中的信息来产生可重定 cmpl $0,-8(%ebp) 位代码 jne . L 6 jmp .L12 . L12 : jmp .L5 . p 2align 4,, 7 .L6:
8.1 C语言编译系统 8.1.3连接器 目标模块或目标文件的形式 可重定位的目标文件 可执行的目标文件 共享目标文件 一种特殊的可重定位目标文件 在装入程序或运行程序时,动态地装入到内存并 连接
8 1. C语言编译系统 8.1.3 连接器 目标模块或目标文件的形式 • 可重定位的目标文件 • 可执行的目标文件 • 共享目标文件 – 一种特殊的可重定位目标文件 – 在装入程序或运行程序时,动态地装入到内存并 连接
8.1 C语言编译系统 连接是一个收集、组织程序所需的不同代码和 数据的过程,以便程序能被装入内存并被执行 连接的时机 编译时 -装入时 运行时 静态连接器 动态连接器
8 1. C语言编译系统 • 连接是一个收集、组织程序所需的不同代码和 数据的过程,以便程序能被装入内存并被执行 • 连接的时机 –编译时 –装入时 –运行时 • 静态连接器 • 动态连接器
8.1 C语言编译系统 个重定位模块M可能定义和引用的符号 全局符号指那些在模块M中定义,可以被其他模 块引用的符号 局部符号指那些在模块M中定义,且只能在本模 块中引用的符号 外部符号指那些由模块M引用并由其他模块定义 的符号 符号解析 识别各个目标模块中定义和引用的符号,为每一 个符号引用确定它所关联的一个同名符号的定义 重定位
8 1. C语言编译系统 • 一个重定位模块M可能定义和引用的符号 定义和引用的符号 – 全局符号 指那些在模块M中定义,可以被其他模 块引用的符号 – 局部符号 指那些在模块M中定义,且只能在本模 块中引用的符号 – 外部符号 指那些由模块M引用并由其他模块定义 的符号 • 符号解析 – 识别各个目标模块中定义和引用的符号,为每一 个符号引用确定它所关联的一个同名符号的定义 • 重定位