动态加载和动态链接之间的区别?(difference between dynamic loading

2019-06-23 11:09发布

程序不加载,直到它被调用。 所有程序都在一个可重新定位的负载格式保存在磁盘上。 主程序被加载到存储器及被执行。 这就是所谓的动态链接。

为什么这个被称为动态链接? 它不应该是动态加载,因为没有加载程序,直到它被称为动态加载,其中在动态链接,链接推迟到执行时间。

Answer 1:

动态加载装置加载或运行时期间加载所述程序库(或任何其他二进制为此事)到存储器中。

动态加载可以想像为类似于插件,即一个exe实际上可以执行动态负载发生之前(可以用C或C LoadLibrary调用来创建例如动态加载++)

动态链接是指在创建EXE时所加载或运行时间,而不是过程中进行链接。

在动态链接链接器在创建EXE确实最小工作。对于动态链接到实际工作的情况下它具有加载库too.Hence它也被称为链接加载。

因此,您所指的句子可能是有意义的,但他们仍然是相当模糊的,因为我们不能推断其所提到in.Can你告诉我们你在哪里找到这些线和在什么情况下是笔者谈论的背景?



Answer 2:

动态加载是指映射(或不经常拷贝)的可执行文件或库到进程的内存,它已经开始了。 动态链接是指解析符号 - 编译时间后 - 他们与地址或偏移的名字相关联。

这里是Quora的链接到完整的答案由杰夫·达西

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



Answer 3:

我也读了“恐龙书”,并与负载和连接概念混淆。 这是我的理解:

  1. 无论动态加载和链接发生在运行时,和负载他们需要什么到内存中。

  2. 关键的区别是,动态加载检查例程是由加载器加载而动态链接检查该例程是在存储器中。

  3. 因此,对于动态链接,只有一个库代码的拷贝内存,这可能是动态加载不正确的。 这就是为什么动态链接需要操作系统的支持,以检查其他进程的内存。 此功能对于语言子程序库,这是由很多程序共享非常重要。



Answer 4:

动态链接器加载和绑定的所有程序的动态依赖关系开始执行该程序前的运行时间程序。 动态连接器会找到一个程序需要什么动态库,哪些库的库要求(等等),那么它会加载所有这些库,并确保到功能的所有引用,然后正确地指向正确的地方。 例如,连最基本的“Hello World”程序通常需要C库显示输出等动态连接器将装载Hello World程序之前加载C库,并确保任何调用的printf()去以正确的代码。



Answer 5:

Dynamic Loading:在通话主内存中加载程序。

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

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

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

程序不加载,直到它被调用。 所有程序都在一个可重新定位的负载格式保存在磁盘上。 主程序被加载到存储器及被执行。 这就是所谓的动态链接。

该声明是不完整的。 “主要程序被加载到主存储器及执行”。 加载程序时没有指定。

如果我们认为它是装上调用作为1 声明 ,然后指定其动态加载



Answer 6:

这个答案会想你知道基本的Linux命令。

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

为了调用函数在静态库您需要的库静态链接到你的可执行文件,造成了静态二进制。

当调用共享库中的函数,你有两个选择。

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

另一种选择是动态加载 - 你的程序运行的时候,它是程序的工作,打开库。 这样的程序通常与libdl,它提供打开一个共享库的能力相关。

维基百科摘录:

动态加载是一种机制,通过该计算机程序可以在运行时,则装入一个库(或其它二进制)到存储器中,检索包含在库函数和变量的地址,执行这些功能或访问这些变量,以及卸载图书馆从内存中。 它是3种机制,通过该计算机程序可以使用一些其他软件中的一个; 另外两个是静态链接和动态链接。 不同于静态链接和动态链接,动态加载允许计算机程序在没有这些库的启动,以发现可用的库,并可能获得额外的功能。

如果你还在迷茫,第一次读到这真棒文章: 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)

正如你所看到的, dl是一个动态的可执行文件,取决于libdl ,这是由动态链接ld.so在运行时,Linux动态链接器dl 。 同样是在列表中的其他3个库如此。

libm未出现在此列表中显示,因为它是作为一个动态加载库。 它不加载,直到ld被要求加载它。



Answer 7:

我们使用动态加载,实现更高的空间利用率

  • 有了动态加载未加载的程序,直到它被调用所有例程在可重定位负载保持在磁盘上format.The主程序被加载到存储器中,并被执行。
  • 当一个程序需要调用其它程序,调用程序首先检查是否已经loaded.If没有,重定位链接程序叫到所需的日常加载到内存和更新程序的地址表,以反映这种change.Then控制传递给新加载的程序

好处

  1. 一个未使用的常规那么不会装载。这是当该程序代码是大其中需要不频繁发生的情况下作为错误来处理这种routines.In这种情况下,尽管该程序代码是大最有用的,所使用的代码将是小的。
  2. 动态加载不需要特别的支持OSIt是用户的责任来设计他们的计划,采取method.However的优势,OS可以提供​​库来帮助程序员


Answer 8:

有两种类型的在运行时链接静态和动态的,当输出文件没有任何依赖关系执行(文件=库)此类型的链接被称为静态这里作为动态是两种类型的1.Dynamic加载链接2.Dynamic运行时链接。这些说明如下

动态链接是指连接,同时运行时,其中库文件被带到主存储器和链接。(不考虑功能的调用这些被链接)。

动态运行时链接是指在需要的时候连接,这意味着只要有一个函数调用当时联runtime..Not在所有的功能链接发生,这不同于在代码编写。



文章来源: difference between dynamic loading and dynamic linking?