【Linux】详解动态库链接和加载&&对可执行程序底层的理解
在Linux系统中,动态链接库(Dynamic Shared Object, DSO)是一种在运行时由程序加载的库。这种方式可以减少程序的大小,因为不是将所有的库代码都打包进可执行文件,只需在运行时根据需要加载相应的库。
动态链接和加载通常涉及几个关键概念:
- 动态链接器(Dynamic Linker):在Linux系统中,动态链接器通常是
/lib/ld-linux.so.2
。它负责在程序运行时加载共享库。 - 环境变量
LD_LIBRARY_PATH
:指定查找共享库的路径。 - 系统调用
dlopen
,dlsym
,dlclose
和dlerror
:用于在运行时打开、查找和关闭动态库中的函数。
下面是一个简单的例子,展示如何在C程序中使用动态链接库:
#include <stdio.h>
#include <dlfcn.h>
int main() {
void *handle;
double (*cosine)(double);
char *error;
// 打开动态库
handle = dlopen("libm.so", RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
return 1;
}
// 查找库中的函数
cosine = dlsym(handle, "cos");
if ((error = dlerror()) != NULL) {
fprintf(stderr, "%s\n", error);
return 1;
}
// 使用动态库中的函数
printf("Cosine of 1.0 is: %f\n", (*cosine)(1.0));
// 关闭动态库
if (dlclose(handle) < 0) {
fprintf(stderr, "%s\n", dlerror());
return 1;
}
return 0;
}
在这个例子中,我们使用了动态链接器打开了libm.so
(数学库),并查找了cos
函数。然后我们使用cosine
函数计算并打印了1.0的余弦值。最后,我们关闭了对库的链接。
编译这个程序时,你需要链接到-ldl
,以便使用动态链接库相关的函数。例如:
gcc -o dynamic_loading dynamic_loading.c -ldl
这样就会生成一个名为dynamic_loading
的可执行文件,你可以运行它来查看余弦值的结果。
评论已关闭