链接的图像
构建(Build)就是编译+链接生成可执行程序的全过程。最早的程序,把地址直接写死在机器码里。但是这样做有一个问题,程序可能会被经常修改,程序员需要人工修改所有目标地址,而且这在程序规模变大,而且存在多次目标跳转时更加繁琐。之后,业界发明了汇编。汇编的一大创举就是用符号来标记指令和地址,比如用jump
来表示跳转指令,用divide
来标记除法子程序的起始地址。这种引入符号的好处就是不管程序变化导致foo
的地址发生什么变化,汇编器会自动解析计算整个程序中所有foo
的地址,来批量的替换。地址可能是一个子程序的起始地址,也可能是一个变量的起始地址。符号代替地址的思想和做法随着汇编的发展而诞生。同时,有了这种便利,软件的规模也可以越来越大了,这种单一程序的方式已经不能满足需求了。于是大家开始设计模块化的组织和编程方案,这样的话,改变部分源代码就不需要重新编译整个程序了。这种当程序被分割为多个模块以后,这些模块如何组合形成一个单一的程序是一个需要解决的问题。要设计方案,首先就需要梳理需求。C/C++这种静态编程语言模块间的通信方式有两种,一种是模块间的函数调用,另一种是模块间的变量访问。函数调用需要知道目标函数的地址,变量访问需要指导目标变量的地址,因此这两种模块间通信都可以归结为一种方式,那就是模块间符号的引用。模块间依靠符号来通信类似于拼图版,定义符号的模块多出一块区域,引用符号的模块刚好多出这一块区域,这种模块间的拼接过程,就是链接Linking的主题。这种基于符号的模块化的一个直接结果是链接在整个程序开发中变得十分重要和突出。