要点:
我遇到了一个动态加载另一个库的麻烦,我想知道编译器中的差异是否是根本原因。
问题详细信息:
我的应用程序链接到libgbm.so,它动态加载libpvrGBMWSEGL.so然后请求gbm_backend函数。
#libgbm.so
module = dlopen("/usr/lib/libpvrGBMWSEGL.so", RTLD_NOW | RTLD_GLOBAL)
dlsym(module, entrypoint)
当我尝试使用提供的符号时,会引发分段错误。
分析:
libpvrGBMWSEGL.so作为专有二进制blob提供。快速分析显示它是使用Linaro GCC 5.3-2016.02
构建的> strings libpvrGBMWSEGL.so | grep GCC
GCC: (Linaro GCC 5.3-2016.02) 5.3.1 20160113
同时动态调用它的库libgbm是使用Buildroot GCC 6.4.0
构建的> strings libgbm.so | grep GCC
GCC: (Buildroot 2017.11-git-00884-g7af8140-dirty) 6.4.0
问题:
我是否希望这两个库以我使用它们的方式兼容?
答案 0 :(得分:2)
对于许多平台,有一份已发布的ABI文档,编制者应该遵守该文档。对于C ++而言,除了那些平台ABI之外,还有Itanium C++ ABI(与Itanium无关,我将假设Itanium对计算的持久贡献)。
但这并没有扩展到图书馆。 Linux有许多libcs,即使架构匹配,针对glibc编译和链接的东西也不能在Bionic libc(Android)上运行,反之亦然。对于C ++标准库来说基本上是一样的(甚至GCC附带的实现也会选择略有不同的ABI)。
使用ARM,还有相当多的子架构变体。
摘要是:当每个人都努力的时候,那么你想要做的事情就会奏效。如果没有,可能不是。正确使用C ++比使用C语言更难。