gpt4 book ai didi

dynamic - 动态加载和动态链接的区别?

转载 作者:行者123 更新时间:2023-12-03 00:13:11 29 4
gpt4 key购买 nike

Routine is not loaded until it is called. All routines are kept on disk in a re-locatable load format. The main program is loaded into memory & is executed. This is called Dynamic Linking.

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

最佳答案

此答案假设您了解基本的 Linux 命令。

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

enter image description here

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

在调用共享库中的函数时,您有两种选择。

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

另一个选项是动态加载 - 当您的程序运行时,程序的工作就是打开该库。此类程序通常与 libdl 链接,它提供了打开共享库的功能。

摘自维基百科:

Dynamic loading is a mechanism by which a computer program can, at runtime, load a library (or other binary) into memory, retrieve theaddresses of functions and variables contained in the library, executethose functions or access those variables, and unload the library frommemory. It is one of the 3 mechanisms by which a computer program canuse some other software; the other two are static linking and dynamiclinking. Unlike static linking and dynamic linking, dynamic loadingallows a computer program to start up in the absence of theselibraries, to discover available libraries, and to potentially gainadditional functionality.

如果您仍然感到困惑,请首先阅读这篇精彩的文章:Anatomy of Linux dynamic libraries并构建 dynamic loading example感受一下,然后再回到这个答案。

这是我的 ldd ./dl 输出:

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)

如您所见,dl 是一个依赖于 libdl 的动态可执行文件,它由 Linux 的 ld.so 动态链接。运行 dl 时的动态链接器。列表中的其他 3 个库也是如此。

libm 未显示在此列表中,因为它用作动态加载的库。在 ld 被要求加载之前它不会被加载。

关于dynamic - 动态加载和动态链接的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10052464/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com