【问题标题】:What is the difference between dynamic linking and dynamic loading动态链接和动态加载有什么区别
【发布时间】:2014-02-08 11:53:28
【问题描述】:

据我了解 动态加载意味着在加载或运行时将库(或任何其他二进制文件)加载到内存中。所以在下面的程序中,当调用动态加载器的 dlopen() 将进入图片时,如果库尚未加载,它会将 lib 加载到内存中。

动态链接是指在加载或运行时完成的链接。它解决了外部引用。 所以在下面的程序中 dlsym() 函数将要求余弦函数,动态链接将出现在图片中,符号将被解析。

int main(int argc, char **argv) {
    void *handle;
    double (*cosine)(double);
    char *error;

    handle = dlopen ("/lib/libm.so.6", RTLD_LAZY);
    if (!handle) {
        fputs (dlerror(), stderr);
        exit(1);
    }

    cosine = dlsym(handle, "cos");
    if ((error = dlerror()) != NULL)  {
        fputs(error, stderr);
        exit(1);
    }

【问题讨论】:

    标签: linker operating-system loader


    【解决方案1】:

    这两个术语的相似之处在于它们指的是推迟确定要使用的确切库,直到程序运行,但已经开始表示不同的方面。

    动态加载发生在显式加载库时(例如使用 dlopen()),而动态链接发生在动态链接的可执行文件被加载并由操作系统隐式处理时。目的不同。

    在第一种情况下,动态加载库用于解析来自不同库的可选符号或具有互斥符号的符号,并且在程序运行之前无法确定要使用哪个库。

    例如,程序可以根据配置文件的内容确定它需要与特定数据库交互,并且只有在读取配置文件后才需要加载数据库特定库。它需要等到配置文件在运行时被解析,然后调用 dlopen()。

    或者,动态链接的可执行文件(与大多数可执行文件一样)将在链接时确定其所需库的列表,并且这些库将在程序开始在运行时执行之前自动解析。此选项与加载静态链接的可执行文件相反,主要是为了节省内核内存和可执行文件大小,因为内核只需要为使用该库的所有可执行文件加载一次库。您可以在动态链接的可执行文件上运行程序 ldd 以确定所有必需的库。

    【讨论】:

    • 据我所知,ldd 命令用于打印共享库依赖项,因此对共享库的访问是通过动态链接实现的,因此所有必需的共享库如 libc 已确定并解决在程序开始执行之前,这叫做动态链接,对吗?
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-16
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 2011-05-08
      • 2013-06-19
      • 1970-01-01
      相关资源
      最近更新 更多