我有错误的共享库(未定义的符号)。
当我第一次调用 dlopen() 时,我得到一个 NULL 结果,并从 dlerror() 得到正确的错误消息。
如果我忽略错误消息并使用相同的参数调用 dlopen(),我第二次得到一个非空句柄(这表明库已成功加载)。这显然是错误的。
这个问题在 Ubuntu 11.04 下出现(IIRC,10.10 没有这个问题)。Centos 5.5 没有出现这个问题。
特别是,这个问题发生在 Tcl 解释器中。它将尝试加载共享库,首先使用规范化的绝对路径,如果再次失败,则使用用户提供的确切路径字符串。就我而言,两者都应该失败,但第二次调用在 Ubuntu 11.04 下错误地成功了。
奇怪的是,我只能使用我的确切生产共享库来重现这个问题。如果我制作了一个精简的共享库,它就可以正常工作。
像这样的程序足以显示我的生产库的问题:
#include <stdio.h>
#include <dlfcn.h>
int main()
{
void* h;
h = dlopen("./prod.so", RTLD_NOW | RTLD_LOCAL);
printf("h is %p\n", h);
printf("err is %s\n", dlerror());
h = dlopen("./prod.so", RTLD_NOW | RTLD_LOCAL);
printf("h is %p\n", h);
}