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

Luv*_*Luv 22 linker operating-system loading dynamic

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

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

Des*_*Ice 19

动态加载意味着在加载或运行时将库(或任何其他二进制文件)加载到内存中.

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

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

在动态链接的情况下,链接器在创建exe时执行的工作量很小.为了使动态链接器工作,它实际上也必须加载库.因此它也称为链接加载器.

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


nav*_*aid 11

该答案将假设您知道基本的Linux命令。

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

在此处输入图片说明

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

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

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

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

维基百科摘录:

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

如果您仍然感到困惑,请先阅读以下精彩文章:Linux动态库剖析并构建动态加载示例以了解它,然后返回此答案。

这是我的输出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)
Run Code Online (Sandbox Code Playgroud)

如您所见,它dl是一个动态可执行文件,当您运行时libdl,它依赖于ld.soLinux动态链接器动态链接dl。列表中的其他3个库也是如此。

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


use*_*120 10

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

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

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


小智 5

我也在读《恐龙书》,对加载和链接概念感到困惑。这是我的理解:

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

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

  3. 因此,对于动态链接,内存中只有一个库代码副本,对于动态加载而言可能并非如此。这就是为什么动态链接需要操作系统支持才能检查其他进程的内存的原因。对于许多程序共享的语言子例程库,此功能非常重要。