- 1、本文档共94页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章程序的链接讲述
可执行文件的链接生成 主要教学目标 使学生了解链接器是如何工作的,从而能够养成良好的程序设计习惯,并增加程序调试能力。 通过了解可执行文件的存储器映像来进一步深入理解进程的虚拟地址空间的概念。 包括以下内容 链接和静态链接概念 三种目标文件格式 符号及符号表、符号解析 使用静态库链接 重定位信息及重定位过程 可执行文件的存储器映像 可执行文件的加载 共享(动态)库链接 程序的链接 分以下三个部分介绍 第一讲:目标文件格式 程序的链接概述、链接的意义与过程 ELF目标文件、重定位目标文件格式、可执行目标文件格式 第二讲:符号解析与重定位 符号和符号表、符号解析 与静态库的链接 重定位信息、重定位过程 可执行文件的加载 第三讲:动态链接 动态链接的特性、程序加载时的动态链接、程序运行时的动态链接、动态链接举例 原始的链接概念早在高级编程语言出现之前就已存在 最早程序员用机器语言编写程序,并记录在纸带或卡片上 用符号表示跳转位置和变量位置,是否简化了问题? 汇编语言出现 用助记符表示操作码 用符号表示位置 用助记符表示寄存器 ….. 更高级编程语言出现 程序越来越复杂,需多人开发不同的程序模块 子程序(函数)起始地址和变量起始地址是符号定义(definition) 调用子程序(函数或过程)和使用变量即是符号的引用(reference) 一个模块定义的符号可以被另一个模块引用 最终须链接(即合并),合并时须在符号引用处填入定义处的地址 如上例,先确定L0的地址,再在jmp指令中填入L0的地址 目标文件 链接操作的步骤 1)确定标号引用关系(符号解析) 2)合并相关.o文件 3)确定每个标号的地址 4)在指令中填入新地址 目标文件的格式 目标代码(Object Code)指编译器和汇编器处理源代码后所生成的机器语言目标代码 目标文件(Object File)指包含目标代码的文件 最早的目标文件格式是自有格式,非标准的 标准的几种目标文件格式 DOS操作系统(最简单) :COM格式,文件中仅包含代码和数据,且被加载到固定位置 System V UNIX早期版本:COFF格式,文件中不仅包含代码和数据,还包含重定位信息、调试信息、符号表等其他信息,由一组严格定义的数据结构序列组成 Windows: PE格式(COFF的变种),称为可移植可执行(Portable Executable,简称PE) Linux等类UNIX:ELF格式(COFF的变种),称为可执行可链接(Executable and Linkable Format,简称ELF) 链接视图—可重定位目标文件 可被链接(合并)生成可执行文件或共享目标文件 静态链接库文件由若干个可重定位目标文件组成 包含代码、数据(已初始化.data和未初始化.bss) 包含重定位信息(指出哪些符号引用处需要重定位) 文件扩展名为.o(相当于Windows中的 .obj文件) switch-case语句举例 ELF头(ELF Header) ELF头位于ELF文件开始,包含文件结构说明信息。分32位系统对应结构和64位系统对应结构(32位版本、64位版本) 以下是32位系统对应的数据结构 ELF头信息举例 $ readelf -h main.o ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2s complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: REL (Relocatable file) Machine: Intel 80386 Version: 0x1 Entry point address: 0x0 Start of program headers: 0 (bytes into file) Start of section headers: 516 (bytes into file) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 0 (bytes) Number of program headers: 0 Size of section headers: 40 (bytes) Number of section headers: 15 Section h
文档评论(0)