如何理解链接
链接(linking)是将各种代码和数据片段收集并组合成单一文件的过程。链接是有链接器(linker)的程序自动执行的。
链接器使分离编译成为可能,我们不用将一个大型的应用程序组成一个源文件,而是将它分解为更小的模块,可以独立的修改和管理这些模块,当我们修改这些模块的一个时,只需简单的编译它,并重新链接应用,而不必重新编译其他文件。学习链接有助于以下问题的理解
- 什么是库以及链接器如何使用库来解析引用的
- 明白语言的作用域规则是如何实现的,全局和局部变量之间的区别是什么?当你定义一个具有static属性的变量或者函数时,实际意味着什么?
- 链接器产生的可执行目标文件在重要的系统功能中扮演的至关重要的角色,比如加载和运行程序、虚拟内存、分页、内存映射。
什么是编译器驱动程序
大多数编译系统提供编译器驱动程序,它代表用户在需要时调用语言预处理器、编译器、汇编器和链接器。
什么是静态链接
静态链接器以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的、可以加载和运行的课执行目标文件作为输出。“输入的可重定位目标文件”由各种不同的代码和数据节组成,每一节都是一个连续的字节序列。 为了构造可执行器,链接器必须完成两个工作
- 符号解析,每个符号对应一个函数、一个全局变量或一个静态变量,符号解析的目的就是将每个符号引用正好和一个符号定义关联起来
- 重定位。编译器和汇编器生成从地址0开始的代码和数据节。链接器通过把每个符号定义与一个内存位置关联起来,从而重定位这些节,然后修改所有这些符号的引用,使得他们指向内存的位置。
目标文件纯粹是字节块的集合
什么是目标文件
目标文件是按照特定的目标文件格式来组织的,各个系统的目标文件格式都不相同,比如Windows使用可移植可执行(Portable Executable, PE)格式,Mac使用Mach-O格式。现代x86-64 Linux和Unix系统使用可执行可链接格式(Executable and Linkable Format, ELF)
ELF可重定位目标文件介绍
ELF头以一个16字节的序列开始,这个序列描述了生成该文件的系统的字的大小和字节顺序。ELF头剩下的部分帮助链接器语法分析和解释目标文件的信息。
什么是符号和符号表
每个可重定位目标符号m都有一个符号表,包含m定义和引用的符号的信息。比如有局部符号,对应带static属性的C语言属性和变量,只能被m模块引用而不能被其他模块引用。
符号解析是怎么实现的
连接器解析符号引用的方法是将每个引用和符号关联起来
如何理解库打桩机制(牵扯C语法太多,回头来看)
库打桩机制就是包装函数利用特殊手段,欺骗系统,调用包装函数执行逻辑,然后再调用目标函数。 打桩机制可以发生在编译时、链接时以及程序加载和执行的运行时