库(.so)可以动态加载使用不同编译器构建的另一个库

时间:2017-11-09 21:50:38

标签: linux gcc shared-libraries libraries

要点:

我遇到了一个动态加载另一个库的麻烦,我想知道编译器中的差异是否是根本原因。

问题详细信息:

我的应用程序链接到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

问题:

我是否希望这两个库以我使用它们的方式兼容?

1 个答案:

答案 0 :(得分:2)

对于许多平台,有一份已发布的ABI文档,编制者应该遵守该文档。对于C ++而言,除了那些平台ABI之外,还有Itanium C++ ABI(与Itanium无关,我将假设Itanium对计算的持久贡献)。

但这并没有扩展到图书馆。 Linux有许多libcs​​,即使架构匹配,针对glibc编译和链接的东西也不能在Bionic libc(Android)上运行,反之亦然。对于C ++标准库来说基本上是一样的(甚至GCC附带的实现也会选择略有不同的ABI)。

使用ARM,还有相当多的子架构变体。

摘要是:当每个人都努力的时候,那么你想要做的事情就会奏效。如果没有,可能不是。正确使用C ++比使用C语言更难。