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

时间:2012-04-07 06:56:33

标签: dynamic linker operating-system loading

  

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

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

8 个答案:

答案 0 :(得分:19)

动态加载表示在加载或运行时将库(或任何其他二进制文件)加载到内存中。

可以设想动态加载类似于插件,即exe可以在动态加载发生之前实际执行(例如,可以使用C或C ++中的LoadLibrary调用创建动态加载)

动态链接是指在加载或运行时完成的链接,而不是在创建exe时的链接。

如果在创建exe时动态链接链接器的工作量很小。为了使动态链接器工作,它实际上也必须加载库。因此它也称为链接加载器。

因此,你提到的句子可能有意义,但它们仍然很模糊,因为我们无法推断它所指的语境。你能告诉我们你在哪里找到这些句号以及作者在什么背景下谈论?

答案 1 :(得分:8)

动态加载是指在启动后将可执行文件或库映射(或不常复制)到进程的内存中。动态链接是指在编译时解析符号 - 将其名称与地址或偏移相关联。

以下是Jeff Darcy在quora的完整答案的链接

http://www.quora.com/Systems-Programming/What-is-the-exact-difference-between-Dynamic-loading-and-dynamic-linking/answer/Jeff-Darcy

答案 2 :(得分:4)

我也在阅读“恐龙书”,并且与装载和链接概念相混淆。以下是我的理解:

  1. 动态加载和链接都在运行时发生,并将所需内容加载到内存中。

  2. 关键区别在于动态加载检查例程是否由加载程序加载,而动态链接检查例程是否在内存中。

  3. 因此,对于动态链接,库代码只有一个副本是内存,对于动态加载可能不是这样。这就是为什么动态链接需要os支持来检查其他进程的内存。此功能对语言子程序库非常重要,语言子程序库由许多程序共享。

答案 3 :(得分:2)

动态链接器是一个运行时程序,它在开始执行该程序之前加载并绑定程序的所有动态依赖项。动态链接器将找到程序需要的动态库,这些库需要哪些库(等等),然后它将加载所有这些库并确保所有对函数的引用然后正确指向正确的位置。例如,即使是最基本的“hello world”程序通常也需要C库来显示输出,因此动态链接器将在加载hello world程序之前加载C库,并确保对printf()的任何调用都是正确的代码。

答案 4 :(得分:2)

Dynamic Loading:在主内存中加载例程。

Dynamic Linking:在执行期间在主内存中加载例程,如果在执行时间之前发生调用则推迟到执行时间。

动态加载不需要操作系统的特殊支持,程序员有责任检查主内存中是否存在要加载的例程。

动态链接需要操作系统的特殊支持,通过动态链接加载的例程可以在各个进程之间共享。

  

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

声明不完整。“主程序已加载到主存储器中并且已执行。”未指定何时加载程序。

如果我们认为它是在 1 st 语句指定时加载,那么动态加载

答案 5 :(得分:2)

这个答案假设你知道基本的Linux命令。

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

enter image description here

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

在共享库中调用函数时,您有两个选项。

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

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

摘自维基百科:

  

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

如果您仍然感到困惑,请先阅读这篇精彩文章:Anatomy of Linux 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.sodl动态链接,当您运行libm时,Linux动态链接器。对于列表中的其他3个库也是如此。

ld未在此列表中显示,因为它用作动态加载的库。在要求{{1}}加载它之前,它不会加载。

答案 6 :(得分:1)

我们使用动态加载来实现更好的空间利用

  • 通过动态加载,程序在被调用之前不会加载所有例程都以可重定位的加载格式保存在磁盘上。主程序被加载到内存中并被执行。
  • 当例程需要调用另一个例程时,调用例程首先检查是否已经加载。如果没有,则调用可重定位的链接加载器以将所需的例程加载到内存中并更新程序的地址表以反映此更改。然后将控制传递给新加载的例程

<强>优点

  1. 永远不会加载未使用的例程。这在程序代码时最有用 在需要处理诸如此类的不常发生的情况下很大 错误例程。在这种情况下,虽然程序代码很大,但使用的代码 会很小。
  2. 动态加载不需要O.S.It的特殊支持 用户有责任设计自己的程序以利用 但是,O.S可以提供​​库来帮助程序员

答案 7 :(得分:0)

有两种类型的链接静态和动态,当在运行时执行输出文件而没有任何依赖项(files = Library)时,这种类型的链接称为静态,其中Dynamic是两种类型1.Dynamic Loading Linking 2。动态运行时链接。这些描述如下

动态链接是指在运行时将库文件带到主存储器并进行链接的链接。(无论函数调用是否已链接)。

动态运行时链接指的是在需要时进行链接,这意味着在此时发生函数调用时链接在运行时期间。所有函数都没有链接,这在代码编写方面有所不同。