据我了解 动态加载意味着在加载或运行时将库(或任何其他二进制文件)加载到内存中。所以在下面的程序中,当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);
}
答案 0 :(得分:6)
这两个术语都是相似的,因为它们指的是推迟确定要使用的确切库,直到程序运行,但已经表明了不同的方面。
当显式加载库时(例如,使用dlopen()),会发生动态加载,而当动态链接的可执行文件被加载并由OS隐式处理时,会发生动态链接。目的不同。
在第一种情况下,动态加载库用于解析来自不同库的符号,这些库是可选的,或者具有互斥的符号,并且在程序运行之前无法确定要使用的库。
例如,程序可以根据配置文件的内容确定它需要与特定数据库交互,并且只有在读取了配置文件后才需要加载数据库特定库。它需要等到运行时解析配置文件,然后调用dlopen()。
或者,动态链接的可执行文件(与大多数可执行文件一样)将在链接时确定其所需库的列表,并且这些库将在程序开始在运行时执行之前自动解析。此选项与加载静态链接的可执行文件相反,主要用于保存内核内存和可执行文件大小,因为内核只需要为使用该库的所有可执行文件加载一次。您可以在动态链接的可执行文件上运行程序ldd,以确定所有必需的库。
答案 1 :(得分:1)
动态加载表示在加载或运行时将库(或任何其他二进制文件)加载到内存中。
可以设想动态加载类似于插件,即exe可以在动态加载发生之前实际执行(例如,可以使用C或C ++中的LoadLibrary调用创建动态加载)
动态链接是指在加载或运行时完成的链接,而不是在创建exe时的链接。
如果在创建exe时动态链接链接器的工作量很小。为了使动态链接器工作,它实际上也必须加载库。因此它也称为链接加载器。