网站首页
IC库存
IC展台
电子资讯
技术资料
PDF文档
我的博客
IC72论坛
ic72 logo
资料首页最新产品 技术参数 电路图 设计应用 解决方案 代理商查询 IC替换 IC厂商 电子辞典
关键字: 技术文章 PDF资料 IC价格 电路图 代理商查询 IC替换 IC厂商 电子辞典

连接器和加载器之连接和加载

一直以来不太清楚C中的连接和加载的功能,今天找到一篇关于此的好文,帖上来与大家共享:
原文出处:
[url]http://www.cstc.net.cn/docs/docs.php?id=317[/url]
[b:6d45b39ba0][内容][/b:6d45b39ba0]
连接器和加载器都做些什么?
地址绑定:一个历史性观点
连接 VS 加载
两遍连接
目标代码库
重定位和代码修正
编译器驱动器
连接器命令语言
连接:一个真实的例子
练习
[b:6d45b39ba0]连接器和加载器都做些什么?[/b:6d45b39ba0]
任何连接器或加载器的基本工作都很多简单:将更加抽象的名字绑定(binding)到更加具体的名字,以允许程序员可以使用更加抽象的名字来编写程序。也就是说,它可以将程序员写的一个名字如getline绑定到“从模块iosys中的可执行代码的开始处定位612字节”。或者可以将一个更加抽象的数值地址如“从该模块的静态数据之后定位450个字节”绑定到一个具体的数值地址上。
地址绑定:一个历史性观点
观察连接器和加载器都做什么的一个有用的方法是研究它们在计算机程序系统的开发中所处的地位。
最早的计算机程序完全用机器语言编写。程序员将符号化的程序写在纸张上,再将它们汇编为机器代码并将这些机器代码制成计算机中的触发器,或者可能将它们打孔到纸带或卡片上。(真正刺激的是直接用开关构成代码。)如果程序员使用了符号地址,程序员必须通过他自己的手动翻译将这些符号绑定到地址上。如果发现一条指令必须被添加或删除,整个程序都必须手动地进行检查并且调整所有受指令添加或删除影响的地址。
这里的问题是将名字绑定到地址的时机太早了。汇编器通过让程序员使用符号名字来编写程序,而由汇编器将名字绑定到机器地址来解决这一问题。如果程序发生了变化,程序员只需重新汇编它,而地址分配的工作由程序员转到了计算机。
代码库使得地址分配的问题更加复杂。由于计算机可以执行的基本操作非常简单,有用的程序通常由子程序组成以执行更高级和更复杂的操作。计算机中通常保存了预先编写好并通过调试的子程序库,这样程序员在编写新程序时就可以利用它们,而不是自己编写这些子程序。程序员将这些子程序加载到主程序中就可以得到一个完整的工作程序。

程序员使用子程序库甚至先于使用汇编器。1947年,主持过ENIAC项目的John Mauchly写了一些可以加载从磁带上存储的程序目录中选择的子程序的加载程序,这需要重定位子程序代码来反映它们加载的地址。这也许很令人吃惊,两个基本的连接器功能——重定位和库搜索,居然先于汇编器出现,因为Mauchly希望程序和子程序都是用机器语言编写的。带重定位的加载器允许自程序的作者和用户在编写每一个子程序时都可以假设它们从位置0开始,并且将实际地址的绑定推迟到子程序被连接到一个特定的主程序中时。
随着操作系统的出现,带重定位的加载器有必要从连接器和库中分离出来。在操作系统出现之前,每个程序在其处理过程中都拥有机器的整个内存,计算机中的所有地址都是可用的,因此程序可以使用固定的内存地址来汇编和连接。但操作系统出现之后,程序必须和操作系统甚至可能是和别的程序共享计算机的内存。这意味着直到操作系统将程序加载到内存中以前是不可能知道程序运行的实际地址的,最终的地址绑定从连接时推迟到了加载时。连接器和加载器现在分割了这个工作,连接器负责部分的地址绑定——在每个程序中分配相关的地址,而加载器完成最终的重定位步骤以分配实际地址。
由于系统变得越来越复杂,它们要求连接器完成越来越复杂的名字管理和地址绑定。Fortran程序使用多个子程序和公共块,数据区域由多个子程序共享,它要求连接器来布置存储并为子程序和公共块分配地址。连接器越来越需要对目标代码库进行处理。这既包括用Fortran和其他语言编写的应用库,又包括通过调用已编译的代码来处理I/O和其他高级操作的编译器支持库。
程序很快变得比可用内存还要大,因此连接器提供复用——一种允许程序员协调程序的不同部分来共享相同内存的技术,每个复用都在程序的其他部分调用它们的时候才加载。从1960年左右磁盘出现,到二十世纪70年代中期虚拟存储的推广,存储复用一直广泛应用于大型机;之后在二十世纪80年代早期又再次以完全相同的形式出现在微型机中,最后再二十世纪90年代虚拟存储出现在PC机上之后慢慢隐退。它依然存在于内存有限的嵌入式环境中,并且可能由于考究的程序员或编译器需要控制存储以提高性能而出现在其他地方。
随着硬件重定位和虚拟存储的出现,连接器和加载器变得不再复杂,因为每个程序又可以获得整个的地址空间了。可以按照使用固定地址加载的形式来连接程序,通过硬件而不是软件重定位来处理加载时重定位。但是具有硬件重定位的计算机总是要运行多于一个的程序,常常是一个程序的多个副本。当一台计算机运行一个程序的多个实例时,在程序所有的运行实例之间有某些部分是相同的(特别是可执行代码),而其他部分对于每个实例是唯一的。如果不变的部分可以从变化的部分中分离出来,操作系统就可以只使用不变部分的一个副本,这可以节省相当可观的内存。编译器和汇编其变为可以用不同的节(section)来建立目标代码,一个节中只放有只读代码,而其他节中放入可写代码,连接器必须能够合并各种类型的所有节以使得连接后的程序中所有的代码在一个地方而所有的数据在另一个地方。这里尽管没有出现复用地址绑定,但它确实存在,因为地址仍然是在连接时分配的,但更多的工作推迟到了连接器为所有的节分配地址的时候。
热门搜索:2838319 ADC128S102CIMTX PS120406 BQ25895MRTWR TLP604 IS-1000 2839237 01M1001JF TLP712B SS480806 2320296 ADC128S102CIMTX 2839240 EURO-4 TLM626SA PS-415-HGULTRA 2838228 PS361220 PS240406 TLP606B SBB8006-SS-1 TLM825GF 02B5000JF 02M1001JF 2920120
COPYRIGHT:(1998-2010) IC72 达普IC芯片交易网
客户服务:service@IC72.com 库存上载:IC72@IC72.com
(北京)联系方式: 在线QQ咨询:点击这里给我发消息 联系电话:010-82614113 传真:010-82614123
京ICP备06008810号-21 京公网安备 11010802032910 号 企业资质