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