我怎样才能确保dlopen正常工作

时间:2014-04-17 03:11:47

标签: c++ c linux linux-kernel

我正在尝试使用dlopen将符号加载到我的记忆中。

但是,我不确定这是否正常。

我的代码如下:

const char* lib_names[] = {"libudev.so.0.13.0"};
int lib = dlopen(lib_names[0], RTLD_NOLOAD | RTLD_LAZY | RTLD_GLOBAL);

这个lib是否可以为我判断这个共享对象是否正确打开?

感谢您的反馈

1 个答案:

答案 0 :(得分:4)

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_NOLOAD |重新打开先前使用RTLD_LOCAL加载的库RTLD_GLOBAL。 POSIX.1-2001中未指定此标志。

您可能需要删除RTLD_NOLOAD才能获得所需的行为。