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

Dynamic 动态加载和动态链接之间的区别?,dynamic,linker,operating-system,loading,Dynamic,Linker,Operating System,Loading,在调用例程之前,不会加载该例程。所有例程都以可重新定位的加载格式保存在磁盘上。主程序加载到内存并执行。这称为动态链接 为什么称之为动态链接?它不应该是动态加载吗?因为在动态加载中调用例程之前不会加载例程,而在动态链接中,链接延迟到执行时。动态加载意味着在加载或运行时将库(或任何其他二进制文件)加载到内存中 动态加载可以想象为与插件类似,即在动态加载发生之前可以实际执行exe(例如,动态加载可以使用C或C++中的LoadLibrary调用创建) 动态链接是指在加载或运行时进行的链接,而不是在创建e

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


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

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

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

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

在动态链接的情况下,创建exe时链接器所做的工作最少。动态链接器要工作,实际上也必须加载库。因此,它也称为链接加载器


因此,您引用的句子可能有意义,但它们仍然相当模糊,因为我们无法推断它引用的上下文。您能告诉我们您在哪里找到这些行以及作者在谈论什么上下文吗?

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

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

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


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

动态链接是指在运行时将库文件带到主内存并进行链接的链接…(无论这些文件链接的函数调用如何)


动态运行时链接是指在需要时进行链接,这意味着无论何时在运行时发生函数调用,都会进行链接。并非所有函数都被链接,这在代码编写方面有所不同。

动态加载:调用时在主内存中加载例程

动态链接:
在执行期间将例程加载到主内存中,如果调用发生在执行之前,则将延迟到执行时


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

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

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

语句不完整。“主程序已加载到主内存并已执行。”未指定加载程序的时间

如果我们认为它是按第一语句指定加载的,那么它的<强>动态加载< /强>

我也读了《恐龙书》,并与加载和链接概念混淆。以下是我的理解:

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

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

  • 因此,对于动态链接,内存中只有库代码的一个副本,这对于动态加载可能不正确。这就是为什么动态链接需要操作系统支持来检查其他进程的内存。这一特性对于许多程序共享的语言子程序库非常重要


  • 这个答案假设您知道基本的Linux命令

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

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

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

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

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

    摘自维基百科:

    动态加载是一种机制,通过它,计算机程序可以在运行时 时间,将库(或其他二进制文件)加载到内存中,检索 地址o
    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)