3

タイトルは短いバージョンです。長い間、C にラップされた C++ API があり、XS を介して Perl に公開されています。これは何年もうまく機能していましたが、現在、共通ライブラリの重複ロードが原因である可能性があると思われるユースケースに遭遇しました.

症状は、Tibrv の周りに社内の Perl ラッパーがあることです。また、内部で Tibrv を使用する別の C++ API のラッパーもあります。Perl スクリプトがこれらの API の両方を使用する場合、2 番目は Tib トランスポートの作成でハングします。個別に、どちらも Perl から動作します。

私は疑っていますが、これをバックアップするものは何もありません.これは何らかの形で共有状態と関係があり、PerlはデフォルトでライブラリをRTLD_LOCALセットでロードすることが問題を引き起こしている可能性があります(これは純粋な予感です). これを裏付けるものは何もありませんが、Tib がその環境をよく知っていることは知っています。その可能性はあると思います。

私の質問: Perl のdlopenようなフラグ を使用することは可能ですか? つまり、Perl/XS を再構築せずにネイティブ ライブラリが開かれているときにフラグを変更できますか?RTLD_GLOBALXSLoaderdlopen

これまでにオンラインで見たものはすべて、DynaLoader を使用する必要があることを示しているようです。DynaLoader からの使用に適した方法で (C++ シンボルをエクスポートする手段のために) lib を再構築する必要があります (現在ではありません)。

これで実際の問題が解決されるかどうかは約 10% しか確信が持てませんが、フラグを簡単にオーバーライドできるかどうかがわかればdlopen、数日間の労力を節約できる可能性があります

4

1 に答える 1