dlsym以无限循环结束

时间:2015-10-21 12:37:33

标签: java c++ dlopen dlsym

我正在尝试构建一个Linux库(* .so)以在Java应用程序中使用它。这个库本身加载一个带有本机函数的dll文件。

这是我的C ++代码:

__delspec(dllexport) void __cdecl GetDllVersion(void){
    typedef int(*GetDllVersion)(int*,int*,int*,int*);

    void* lib = dlopen("~/lib.dll",RTLD_NOW);
    cout << "Loading Symbol..." << endl;
    GetDllVersion getVer=  (GetDllVersion) dlsym(lib,"GetDllVersion");

    dlclose(lib);

}

代码编译时wineg++ -shared lib.cpp -o libexports.so -Wl,--no-as-needed -ldl没有错误。

Java应用程序打印出#34;正在加载符号......&#34;在循环中,然后没有任何消息。我可以确定这必须与dlsym()做一些事情。

使用nm -D lib.so我可以查看lib.so.函数GetDllVersion()确实是这个库中的一个符号。

有人可以告诉我为什么存在无限循环并且Java VM正在终止?

问候Wurmi

1 个答案:

答案 0 :(得分:0)

这一行:

void* lib = dlopen("~/lib.dll",RTLD_NOW);

总是会失败,因为dlopen不会进行波浪扩展(通常,只有 shell会这样做)。您确实应该检查dlopen返回值。

这一行:

GetDllVersion getVer=  (GetDllVersion) dlsym(lib,"GetDllVersion");

等同于dlsym(RTLD_DEFAULT, ...)(因为RTLD_DEFAULT == 0lib == NULL),因此会返回指向您已经处于的函数的指针,从而导致无限递归,并最终导致崩溃堆栈疲惫。

相关问题