我有一个不是我写的.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
答案 0 :(得分:2)
这显然是C ++符号的(mangled)名称,这意味着您尝试使用的库是用C ++编写的。您应该尝试将程序与标准C ++运行时库链接。
答案 1 :(得分:2)
您无法区分dlopen
和dlsym
错误(您应该)。
您得到的错误来自dlopen
,这意味着/tmp/lib.so
依赖于您的标准C ++运行时库(通常是libstdc++.so
)符号,但它本身并不与{{{{1}相关联。 1}}。
要解决此问题,您必须通过
使libstdc++.so
可用
libstdc++.so
而不是g++
相关联,或将gcc
添加到链接行,或-lstdc++
dlopen("libstdc++.so", RTLD_GLOBAL)
之前致电dlopen
。