2017-11-09 3 views
0

概要:は、ライブラリーは、(の.so)動的に異なるコンパイラでビルドされた別のライブラリをロードすることができます

私は1つのライブラリが動的に別の別のロードとコンパイラの差がある場合、私は思ったんだけどとのトラブルを抱えています根本的な原因。

問題の詳細:libgbm.soに

私のアプリケーションへのリンクを動的にlibpvrGBMWSEGL.soをロードしgbm_backend機能を要求します。

#libgbm.so 

module = dlopen("/usr/lib/libpvrGBMWSEGL.so", RTLD_NOW | RTLD_GLOBAL) 
dlsym(module, entrypoint) 

提供された記号を使用しようとすると、セグメント違反が発生します。

分析:libpvrGBMWSEGL.soは独自のバイナリブロブとして提供さ

:迅速な分析は、それがリナロGCCで5.3から2016.02

一方、動的にそれを呼び出すライブラリlibgbmがBuildroot GCC 6.4.0

> strings libgbm.so | grep GCC 
GCC: (Buildroot 2017.11-git-00884-g7af8140-dirty) 6.4.0 

で質問を構築した

> strings libpvrGBMWSEGL.so | grep GCC GCC: (Linaro GCC 5.3-2016.02) 5.3.1 20160113 

を構築したことを示しています

これら2つのライブラリは、私が使用している方法で互換性がありますか?

答えて

2

多くのプラットフォームでは、コンパイラが従う予定の公開ABIドキュメントがあります。 C++とそのプラットフォームのABIの上にはItanium C++ ABIがあります(これはItaniumともう何も関係なく、Itaniumのコンピューティングへの永続的貢献になるでしょう)。

これはライブラリにまで及んでいませんが、 Linux用のlibcs​​は数多くあり、glibcに対してコンパイルおよびリンクされたものはBionic libc(Android)上で実行されず、逆も同様です。基本的にC++の標準ライブラリ(そしてGCCに付属する実装でさえ、オプションとして若干異なるABIが付属しています)でも同じことが当てはまります。

ARMでは、かなりの量のサブアーキテクチャのバリエーションもあります。

概要は次のとおりです。誰もが努力をした場合、その後、あなたが働くやろうとしているもの。そうでない場合は、おそらくそうではありませんC++のためにこの権利を得ることはCの場合よりも難しいです。

関連する問題