[英]how can I be sure dlopen work properly
我正在尝试使用dlopen将符号加载到内存中。
但是,我不确定是否可以正常工作。
我的代码如下:
const char* lib_names[] = {"libudev.so.0.13.0"};
int lib = dlopen(lib_names[0], RTLD_NOLOAD | RTLD_LAZY | RTLD_GLOBAL);
这个lib可以为我判断是否可以正确打开此共享库吗?
感谢您的任何反馈
dlopen()
返回void *
指针。 指针是传递给其他动态链接加载器函数的句柄。 因此,将您的返回类型更改为void *
。
void *lib = dlopen(...)
您可以检查lib
以查看库是否正确打开。 如果lib
为NULL,则该库无法打开。 如果lib
不为NULL,则库成功打开。 使用dlerror()
可获得文本错误字符串,说明无法打开库的原因。 例如:
void *lib = dlopen(...)
if (lib == NULL) {
fprintf(stderr, "Shared library failed to open: %s\n", dlerror());
exit(1);
}
请注意,设置了RTLD_NOLOAD
标志后, dlopen()
实际上不会打开该库。 从手册页:
不要加载库。 这可用于测试库是否已驻留(如果不是,则dlopen()返回NULL;如果已驻留,则返回库的句柄)。 此标志还可以用于在已经加载的库上提升标志。 例如,以前使用RTLD_LOCAL加载的库可以使用RTLD_NOLOAD | |重新打开。 RTLD_GLOBAL。 POSIX.1-2001中未指定此标志。
您可能需要删除RTLD_NOLOAD
才能获得所需的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.