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

Linker 动态链接和动态加载之间有什么区别,linker,operating-system,loader,Linker,Operating System,Loader,据我所知 动态加载意味着在加载或运行时将库(或任何其他二进制文件)加载到内存中。所以在下面的程序中,当调用dynamic loader的dlopen()进入图片时,如果库尚未加载,它将把库加载到内存中 动态链接是指在加载或运行时完成的链接。它解析外部引用。 所以在下面的程序中,dlsym()函数将请求余弦函数,动态链接将出现在图片中,符号将被解析 int main(int argc, char **argv) { void *handle; double (*cosine)(do

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

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

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

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


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

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

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

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

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


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

根据我的知识,ldd命令用于打印共享库依赖项,因此通过动态链接可以访问共享库,所以,在程序开始执行之前,所有必需的共享库(如libc)都已确定并解决,这称为动态链接,对吗?