繁体   English   中英

我如何确保dlopen正常工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM