繁体   English   中英

一个库(.so)是否可以动态加载使用其他编译器构建的另一个库

[英]Can a library (.so) dynamically load another library built with a different compiler

摘要:

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

问题详细信息:

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

题:

我是否应该期望这两个库在使用它们的方式上兼容?

对于许多平台,都有一个已发布的ABI文档,希望编译器可以遵循该文档。 对于C ++和这些平台ABI之上,有Itanium C ++ ABI (我认为它与Itanium无关,它将成为Itanium对计算的持久贡献)。

但是,这不会扩展到库。 Linux有许多libcs​​,即使架构相互匹配,针对glibc编译和链接的某些东西也无法在Bionic libc(Android)上运行,反之亦然。 对于C ++标准库,本质上是一样的(甚至GCC附带的实现都带有稍微不同的ABI作为选项)。

使用ARM,子架构的变化也很大。

总结是:当每个人都在努力时,那么您尝试做的事情就会奏效。 如果没有,可能不是。 对于C ++而言,正确实现比对C语言更困难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM