📜  操作系统中的静态和动态链接

📅  最后修改于: 2021-09-27 14:29:19             🧑  作者: Mango

静态链接:
当我们点击程序的.exe(可执行)文件并开始运行时,二进制文件的所有必要内容都已加载到进程的虚拟地址空间中。但是,大多数程序还需要运行系统库中的函数,而这些库函数也需要加载。

在最简单的情况下,必要的库函数直接嵌入到程序的可执行二进制文件中。这样的程序静态链接到它的库,并且静态链接的可执行代码可以在加载后立即开始运行。

坏处:
生成的每个程序都必须包含完全相同的公共系统库函数的副本。在物理内存和磁盘空间使用方面,将系统库仅加载一次到内存中效率更高。动态链接允许这种单一加载发生。

动态链接:
每个动态链接的程序都包含一个小的、静态链接的函数,该函数在程序启动时被调用。此静态函数仅将链接库映射到内存并运行该函数包含的代码。链接库通过读取包含在库部分中的信息来确定程序需要的所有动态库以及这些库所需的变量和函数的名称。

之后它将库映射到虚拟内存的中间并解析对这些库中包含的符号的引用。我们不知道这些共享库实际映射到内存的哪个位置:它们被编译成位置无关代码 (PIC),可以在内存中的任何地址运行。

优势:
程序的内存需求减少了。一个 DLL 只被加载到内存中一次,而此时多个应用程序可能会使用一个 DLL,从而节省了内存空间。应用程序支持和维护成本也降低了。