Linux上に(別の共有ライブラリを介して)依存関係の1つとしてロードするlibfoo.so.1
(つまり)実行可能ファイルがあります。SONAME
また、別のシステムライブラリにリンクし、システムライブラリはシステムバージョンにリンクしますlibfoo.so.2
。その結果、との両方が 実行中に読み込まれ、バージョン1のライブラリから関数を呼び出すはずだったコードは、バージョン2の新しいシステムライブラリから(バイナリ非互換の)関数を呼び出すことになります。これは、一部のシンボルが同じままであるためです。その結果、通常、スタックスマッシングとそれに続くセグメンテーションフォールトが発生します。libfoo.so.1
libfoo.so.2
現在、古いバージョンに対してリンクしているライブラリはクローズドソースのサードパーティライブラリであり、どのバージョンlibfoo
に対してコンパイルするかを制御することはできません。と仮定すると、残っている他の唯一のオプションは、現在リンクしているシステムライブラリの束を再構築しlibfoo.so.2
てリンクすることlibfoo.so.1
です。
古いものにリンクするローカルコピーでシステムライブラリを置き換えることを回避する方法はありますlibfoo
か?両方のライブラリをロードして、正しいバージョンのシンボルを呼び出すコードを作成できますか?だから私はいくつかの特別なシンボルレベルのバージョン管理が必要ですか?