Linuxでのライブラリのバージョン管理と、それをすべて機能させる方法について詳しく学習しようとしています。コンテキストは次のとおりです。
-動的ライブラリの2つのバージョンがあり、同じインターフェイスセットを公開します(例:libsome1.so
と)libsome2.so
。
-アプリケーションはに対してリンクされていlibsome1.so
ます。
-このアプリケーションはlibdl.so
、たとえば、別のモジュールを動的にロードするために使用しますlibmagic.so
。
-今libmagic.so
に対してリンクされていlibsome2.so
ます。明らかに、リンカスクリプトを使用してシンボルを非表示にせずにlibmagic.so
、実行時のすべてのインターフェイスの呼び出しlibsome2.so
はに解決されlibsome1.so
ます。これlibVersion()
は、マクロの値に対して返される値をチェックすることで確認できますLIB_VERSION
。
-だから、次にlibmagic.so
、リンカスクリプトでコンパイルおよびリンクを試みます。リンカスクリプトは、3を除くすべてのシンボルを定義しlibmagic.so
、それによってエクスポートされます。この作品...または少なくともlibVersion()
とLIB_VERSION
値が一致する(そしてそれは、バージョン2ではない1を報告します)。
-ただし、一部のデータ構造がディスクにシリアル化されると、破損が発生しました。アプリケーションのディレクトリlibsome1.so
で、を指すようlibsome2.so
にソフトリンクを削除して作成すると、すべてが期待どおりに機能し、同じ破損は発生しません。
私は仕方がありませんが、これは、実行時リンカーのシンボルの解決におけるいくつかの競合が原因であると考えられます。私は多くのことを試しましたlibsome2.so
、すべてのシンボルが安定するようにリンクしようとしましたsymbol@@VER_2
(コマンドがnm -CD libsome2.so
まだシンボルをリストしているので、まだリストしsymbol
ていないので混乱していますsymbol@@VER_2
)...何もうまくいかないようです!!! 助けて!!!!!!
RTLD_LOCAL
とRTLD_DEEPBIND
あなたがアプリでのdlopenのフラグを。これをテストする時間はありませんが、マンページに基づいて動作するはずです。