アプリケーションmyapp.exe
がg++
を使用して構築され、libstdc++.so
なしの環境にインストールできるように、フラグ-static-libstdc++
を使用するとします。 myapp.exe
は、シャードライブラリからdlopen
経由で動的にロードできる一部の機能plugf
のプラグインサポートを追加しています。標準ライブラリで静的にリンクするときの動的プラグインのサポート方法
libplug.so
がlibstdc++
にリンクしているようなプラグインライブラリの場合は、どうすればmyapp.exe
と連携できるのでしょうか?
libstdc++
が同じ動的にロードされた標準ライブラリを使用することができますmyapp.exe
とlibplug.so
両方以来、動的にリンクされている場合、これは簡単ですが、それは最高の静的にリンクされた標準ライブラリでこれを行う方法を私にははっきりしません。
私が検討しているアプローチはlibplug.so
もフラグ-static-libstdc++
を使用して、標準ライブラリのそのバージョンが使用されていることを確認するために、それはあるだろう意味でしょうversion script
{
global: plugf;
local: *;
};
を使用することですメモリにロードされたlibstdc++
の2つのコピー。 ORDの違反があるので、このアプローチはC++の標準に恵まれないことは知っていますが、どんな形でもlibstdc++
がサポートしていますか? manualセクションのMultiple ABI testing
セクションは、同様のシナリオを参照しています。
悲しいことに、libplug.soとマッチするように動的/静的リンクされたlibstdC++を配布する必要があります。実行時に2つのコピーがロードされます。そして、あなたのプラグインがあるバージョンのlibstdC++でポインタを返し、別のバージョンでそれを解放すれば、あなたは困ってしまうかもしれません。 – Mikhail
私はそれが本当だとは思わない。割り当ては標準のcライブラリによって処理され、 '-static-libstdC++'は 'libc'を静的にリンクさせないので、両方とも同じ' libc.so'を使用します。 – rnickb
オブジェクトはlibstdC++の '__gnu_cxx :: new_allocator'で割り当てられていると思います。おそらく、両方とも同じ' libc.so'を指していると思います。個人的な経験から私はMSVCのRTを使って上記の問題を抱えていました。 – Mikhail