在我的程序中,我有如下代码
/* libname may be a relative path */
void loadLib(char const *libname) {
void *handle = dlopen(libname);
/* ... */
dlclose(handle);
}
在里面/* .. */
,我需要读取内存映射文件/proc/self/maps
,找到libname
映射到的虚拟内存地址,我还需要打开库以找到其中的某些部分。为此,我需要dlopen
通过在各个位置(例如,在ldconfig
缓存文件中)搜索找到的绝对名称。我怎样才能收到该文件名?
这就是我最终得到的结果(是的,这是 C++ 代码,但是 C 标记对这个问题很有意义,因为dlopen
它与 C++ 和 C 一起使用,我的问题同时适用于两者,POSIX 为 C 指定了它。)。
boost::shared_ptr<void> dl;
if(void *handle = dlopen(libfile, RTLD_LAZY)) {
dl.reset(handle, &dlclose);
} else {
printdlerr();
return -1;
}
/* update sofile to be an absolute file name */
{
struct link_map *map;
dlinfo(dl.get(), RTLD_DI_LINKMAP, &map);
if(!map) {
return -1;
}
char *real = realpath(map->l_name, NULL);
if(!real)
return -1;
sofile.reset(real, &free);
}
libfile
是相对/纯文件名。该映射将产生一个非普通的文件名(即不是foo.so
但可能是./foo.so
)。之后我用来realpath
获取最终的绝对路径名。它工作得很好!