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