一、
链接是将各种代码和数据分片收集并合并成为一个单一文件的过程。在软件开发中扮演着重要的角色,因为它使得分离编译成为可能,可以把一个大型的应用程序分解为更小的、更好管理的模块,可以独立的修改和编译。
学习链接知识的重要作用:理解链接器将帮助你构造大型程序。理解链接器将帮助你避免一些危险的编程错误。理解链接将帮助你理解其他重要的系统概念。理解链接将能使你利用共享库。
二、

编译器和汇编器生成的可重定位的目标文件(包括共享文件)。链接器生成可执行目标文件。从技术上来说,一个目标模块就是一个字节序列,而一个目标文件就是一个文件形式存放在磁盘的目标模块。
目标文件分为三种:
可重定位的目标文件:包含二进制代码和数据,其形式可以在编译时与其他可重定位目标文件合并起来,创建一个可执行文件。
可执行目标文件:包含二进制代码和数据,其形式可以被直接复制到内存中执行。
共享目标文件:一种特殊类型的可重定位目标文件,可以在加载或者运行时被动态加载进内存并链接。
三、

符号和符号表:每个可重定位目标模块x都有一个符号表,它包含x定义和引用的符号的信息,在链接器的上下文中有三种不同的符号:1、由模块m定义并能被其他模块引用的全局符号。全局链接器符号对应于非静态的函数和全局变量。2、由其他模块定义并被模块m引用的全局符号。这些符号被称为外部符号,对应于在其他模块中定义的非静态函数和全局变量。3、只被模块m定义和引用的局部符号。它们对应于带static属性的函数和全局变量。这些符号在模块m中任何位置都可见,但不能被其他模块引用。
符号解析:链接器解析符号引用的方法是将每个引用与它输入的可重定位目标文件的符号表中的一个确定的符号定义关联起来。
重定位:一旦链接器完成解析,就把代码中的每个符号引用和正好一个符号定义关联起来,此时,链接器就知道它的输入目标模块的代码节和数据节的确切大小。然后开始进行重定位的步鄹。
重定位节和符号定义:在这一步中,链接器将所有相同类型的节合并为同一类型的新的聚合节。
重定位节中的符号引用:在这一步中,链接器修改代码节和数据节中对每个符号的引用,使得它们指向正确的运行时地址。要执行这一步,链接器依赖于可重定位目标模块中称为重定位条目的数据结构。
网友评论