动态加载和动态链接的区别?

2024-03-26

例程在被调用之前不会被加载。所有例程都以可重定位加载格式保存在磁盘上。主程序被加载到内存中并被执行。这称为动态链接。

为什么这称为动态链接?不应该是动态加载吗,因为在动态加载中调用例程之前不会加载,而在动态链接中,链接会推迟到执行时。


此答案假设您了解基本的 Linux 命令。

在 Linux 中,有两种类型的库:静态库或共享库。

为了调用静态库中的函数,您需要将库静态链接到可执行文件中,从而生成静态二进制文件。

当调用共享库中的函数时,您有两种选择。

第一个选项是动态链接,这是常用的 - 编译可执行文件时,您必须指定程序使用的共享库,否则它甚至无法编译。当您的程序启动时,系统的工作就是打开这些库,可以使用以下命令列出这些库:ldd命令。

另一个选项是动态加载 - 当程序运行时,程序的工作就是打开该库。此类程序通常与 libdl 链接,它提供了打开共享库的功能。

摘自维基百科:

动态加载是计算机程序在运行时可以使用的一种机制 时间,将库(或其他二进制文件)加载到内存中,检索 库中包含的函数和变量的地址,执行 这些函数或访问这些变量,并从中卸载库 记忆。它是计算机程序可以实现的 3 种机制之一 使用其他一些软件;另外两个是静态链接和动态链接 链接。与静态链接和动态链接不同,动态加载 允许计算机程序在没有这些的情况下启动 库,发现可用的库,并有可能获得 附加功能。

如果您仍然感到困惑,请首先阅读这篇精彩的文章:Linux动态库剖析 https://developer.ibm.com/tutorials/l-dynamic-libraries并建立动态加载示例 https://developer.ibm.com/tutorials/l-dynamic-libraries/#dynamic-loading-example感受一下,然后再回到这个答案。

这是我的输出ldd ./dl:

linux-vdso.so.1 =>  (0x00007fffe6b94000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f400f1e0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f400ee10000)
/lib64/ld-linux-x86-64.so.2 (0x00007f400f400000)

如你看到的,dl是一个动态可执行文件,依赖于libdl,它是动态链接的ld.so,运行时的Linux动态链接器dl。列表中的其他 3 个库也是如此。

libm未显示在此列表中,因为它用作动态加载的库。直到ld被要求加载它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态加载和动态链接的区别? 的相关文章