linux dladdr()函数 dli_fname是相对路径
时间: 2024-02-09 07:08:39 浏览: 19
`dladdr()`函数返回的共享库路径名`dli_fname`是相对路径或绝对路径都有可能,取决于共享库在运行时是如何被加载的。
如果在程序中使用`dlopen()`函数动态加载共享库,则`dli_fname`将是一个相对路径,表示共享库相对于程序当前工作目录的路径。如果共享库是在程序加载时自动链接的,则`dli_fname`将是共享库的绝对路径。
因此,在使用`dladdr()`函数获取共享库路径时,需要根据实际情况进行处理。
以下是一个示例代码,演示了如何处理`dladdr()`函数返回的共享库路径:
```c
#include <stdio.h>
#include <dlfcn.h>
#include <limits.h>
int main()
{
void *ptr = NULL;
Dl_info info;
char resolved_path[PATH_MAX];
// 使用dlsym()函数获取共享库中某个符号的地址
ptr = dlsym(RTLD_DEFAULT, "malloc");
// 使用dladdr()函数获取该地址所在的共享库路径
if (dladdr(ptr, &info)) {
// 如果共享库路径是相对路径,则将其转换为绝对路径
if (realpath(info.dli_fname, resolved_path)) {
printf("Shared library path: %s\n", resolved_path);
} else {
printf("Failed to resolve shared library path.\n");
}
} else {
printf("Failed to get shared library information.\n");
}
return 0;
}
```
在这个示例代码中,我们使用`dlsym()`函数获取了`malloc()`函数在共享库中的地址,然后使用`dladdr()`函数获取该地址所在的共享库路径。如果共享库路径是相对路径,则使用`realpath()`函数将其转换为绝对路径,并将转换后的路径打印到控制台上。