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

gau*_*t87 4 linker operating-system loader

据我所知,动态加载意味着在加载或运行时将库(或任何其他二进制文件)加载到内存中.所以在下面的程序中,当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);
    }
Run Code Online (Sandbox Code Playgroud)

waT*_*eim 8

这两个术语都是相似的,因为它们指的是推迟确定要使用的确切库,直到程序运行,但已经表示不同的方面.

显式加载库时会发生动态加载(例如,使用dlopen()),而动态链接发生时动态链接会在加载并由OS隐式处理时动态链接发生.目的不同.

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

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

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


Vig*_*r A 1

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

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

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

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