动态链接和动态加载有什么区别

2023-12-21

我认为 动态加载意味着在加载或运行时将库(或任何其他二进制文件)加载到内存中。因此,在下面的程序中,当 dlopen() 调用的动态加载器将出现时,如果库尚未加载,它将把库加载到内存中。

动态链接是指在加载或运行时完成的链接。它解决了外部引用。 因此,在下面的程序中,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);
    }

这两个术语的相似之处在于,它们都指的是推迟确定要使用的确切库,直到程序运行,但含义不同。

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

第一种情况,动态加载库用于解析来自不同库的符号,这些符号是可选的或具有互斥的符号,并且直到程序运行时才能确定使用哪个库。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态链接和动态加载有什么区别 的相关文章

随机推荐