在没有符号表的共享lib文件中调用函数

时间:2014-01-30 19:41:52

标签: c shared-libraries

我有一个不是我写的.so lib文件。 这是一个QNX arm-le系统,其中eclipse为ide。

如果我用ida pro打开文件,我可以看到很多导出的函数。

我想调用其中一个函数。

我试过了:

    handle = dlopen ("/tmp/lib.so", RTLD_LAZY);
    if (!handle) {
       fputs (dlerror(), stderr);
       exit(1);
    }

    cosine = dlsym(handle, "cos");
    if ((error = dlerror()) != NULL)  {
        fputs(error, stderr);
        exit(1);
    }

这给了

unknown symbol: _ZTVN10__cxxabiv120__si_class_type_infoE
unknown symbol: _ZTVN10__cxxabiv120__si_class_type_infoE
unknown symbol: _ZTVN10__cxxabiv120__si_class_type_infoE
unknown symbol: _ZTISt9exception
Unresolved symbols

2 个答案:

答案 0 :(得分:2)

这显然是C ++符号的(mangled)名称,这意味着您尝试使用的库是用C ++编写的。您应该尝试将程序与标准C ++运行时库链接。

答案 1 :(得分:2)

您无法区分dlopendlsym错误(您应该)。

您得到的错误来自dlopen,这意味着/tmp/lib.so依赖于您的标准C ++运行时库(通常是libstdc++.so)符号,但它本身并不与{{{{1}相关联。 1}}。

要解决此问题,您必须通过

使libstdc++.so可用
  • 将您的测试计划与libstdc++.so而不是g++相关联,或将gcc添加到链接行,或
  • 在尝试-lstdc++ dlopen("libstdc++.so", RTLD_GLOBAL)之前致电dlopen