计算机高手让你彻底了解《深入理解计算机系统》当“Linking”这个词出现时,我们就知道Building是一个编译过程,那么这个Linking(链接)过程是什么呢?本文将解释链接过程。了解链接过程可以帮助您理解计算机系统的底层原理,并解答您通常对计算机如何识别和执行程序的一些疑惑。此外,本文也是后续章节的基础。我们将从链接的知识中扩展Mach-O文件、fishhook原理、hookobjc_msgSend的知识。链接的基本概念链接是将各种代码和数据收集并组合成单个文件的过程,该文件可以加载(复制)到内存中并执行。链接可以在编译时(complietime)进行,也就是将源代码翻译成机器码的时候;也可以在加载时(loadtime)执行,即当程序被加载器(load-er)加载到内存并执行时甚至可以在运行时(runtime)执行,即由执行应用程序。在早期的计算机系统中,链接是手动执行的。在现代系统中,链接是由称为链接器的程序自动执行的。链接器的作用链接器使得分离编译成为可能。我们可以将大型应用程序分解为更小、更易于管理的模块,而不是将大型应用程序组织为一个巨大的源文件,这些模块可以独立修改和编译。模块。当我们更改其中一个模块时,我们只需重新编译它并重新链接应用程序,而无需重新编译其他文件。下面的讨论都是基于这样一个环境:一个运行Linux的x86-64系统,使用标准的ELF-64目标文件格式。编译器驱动程序下的C语言示例程序由两个源文件组成,main.c和sum.c。main函数初始化一个整数数组,然后调用sum函数对数组元素求和。//sum.cintsum(int*a,intn){ints=0;对于(inti=0;i
