レガシーライブラリを構築するためのC ++ ABIの混在

ここに状況がありますが、最近のGCC(4.3.3)を使用しているC ++コードベースがありますが、GCC 3.2.3を使用してビルドされた古いライブラリとリンクする必要があります。利用可能なライブラリの新しいバージョンはありません、私はそれなしで行くことはできません、それは再構築することはできませんので、クローズソースです。

これは、GCC 4.3.3と3.2.3の間にABIの非互換性があるので、問題を提起するように思われるので、私はこれを解決するために私のオプションが何であるかを見極めようとしています。

いくつかの追加の詳細:

  • コードベースのすべてを-fabi-version = 1で再構築して正しいABIバージョンを取得できますが、libstdc ++バージョン6の新しい機能に依存しています。
  • コードベース外のすべてのC ++ライブラリの依存関係はオープンソースなので、この1つのライブラリを除き、必要に応じて再構築できます。
  • リビルドできない、または再構築が困難な多くのCライブラリ依存関係。
  • 古いライブラリはいくつかのlibstdc ++バージョン5の機能に依存しているようです

私はこれまでに試したことがあります:

  • すべてのC ++コードと依存ライブラリを-fabi-version = 1でリビルドし、libstdc ++バージョン6とリンクします。これは、C ++標準ライブラリシンボルの未定義のシンボルエラーがいくつか発生して失敗します。
  • 上記と同じですが、libstdc ++ 5の共有ライブラリにリンクされていますが、これはリンカの問題を解決しますが、実行時に2つのバージョンがレガシーライブラリ内で混在してクラッシュする原因になります。

このページは次のとおりです: http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html これは、ライブラリ間のさまざまな依存関係を満たすためにアプリケーションでC ++ ABIのバージョンを混在させることが可能であることを示すようです。しかし、私は何かが欠けていない限り、ここでうまくいくとは思われません。

何か案は?

5
古いlibstdc ++を静的に共有ライブラリにリンクすると、リンカオプション -Bsymbolic - exclude-libs が役立ちます。
追加された 著者 Zan Lynx,

1 答え

はい、回避策は次のとおりです。

  • 古いC ++ライブラリに "C"インタフェースを作成し、3.2.3でコンパイルして動作するようにします。
  • 新しいコンパイラでCインタフェースを使用できるようになりました。

C ++の「ラッパー」コードをCライブラリの周りに書くことができますので、C ++として使用しますが、このコードは新しいコンパイラでビルドされます。

3
追加された
古いlibstdc ++を静的に共有ライブラリにリンクすると、リンカオプション -Bsymbolic - exclude-libs が役立ちます。
追加された 著者 Zan Lynx,
別の名前を持つ限り、ライブラリ自体が古いlibstdc ++のものを使用していることは本当に重要ではありません(そして必要ならばいつでもそれをエイリアスすることができますが、とにかくそれは確かです)。 LD_LIBRARY_PATHの問題を起こさないでください(またはDLL-hellではなくUNIX上で)。いずれにしても、そのライブラリのCインタフェースのみを使用します。うまくいけば、ちょうどあなたが必要とするビットに比較的薄いインターフェイス。
追加された 著者 CashCow,
もちろん、これにはグルーコードを追加することの欠点がありますが、Cコンパイラ/バージョンのすべてのペアで作業する利点があります。
追加された 著者 kibibu,
それは合理的なアプローチのようです。私が共有ライブラリを作成しても、以前のlibstdc ++共有ライブラリには依然として依存関係があります。私は同じ問題を抱えていませんか?または、古いバージョンで静的にリンクする必要がありますか?
追加された 著者 Paul D.,
もう少し掘り下げた後は、libstdc ++を古いGCCからこの共有ライブラリに静的にリンクすることが適切だと思われます。しかし、これとリンクするだけでは十分ではありません。ライブラリの境界を越えてシンボルが共有されるため、以前と同じ問題が発生することになります。私はあなたがアプリケーション内でdlopenを実行し、RTLD_NOW | RTLD_DEEPBIND | RTLD_LOCAL。
追加された 著者 Paul D.,
静的にリンクしていない場合(またはライブラリをロードする際に手を加えなかった場合)、シンボル解決はどのように機能しますか?彼らは異なる名前を持っていますが、彼らは同じシンボルの多くを持っています。 2つのライブラリの読み込み順に依存しますか?あなたは私のアプリケーションとこのライブラリとの間に軽量のCインタフェースしか使用していないが、アプリケーションがライブラリからlibstdc ++シンボルを引き出すかどうかは分かりません。
追加された 著者 Paul D.,