在我的程序中,我有如下代码
/* 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
了最终的绝对路径名。效果很好!
你可以用
... dlinfo(handle, RTLD_DI_LINKMAP, p)
p->l_name ...
其中p的类型为Link_map **
有关详细信息,请参见man dlinfo
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句