5

たとえば、mylib.so と実行時にリンクする C++ プログラムがあります。次に、同じプログラムが dlopen()/dlsym() を使用して myplugin.so から関数をロードします。動的ライブラリは mylib.so に依存しています。

私の質問は次のとおりです。プログラムとプラグインの関数は、プログラム用に予約された同じメモリ領域で mydlib.so で定義された同じグローバルにアクセスしますか? 後者がデフォルトの動作である場合、それを変更することは可能ですか?

前もって感謝します =)!

4

1 に答える 1

1

これを行うメイン プログラムのグローバルは、dlopen動的にロードされるコードから見えるようにする必要があります。ただし、これまでに見た最善のアドバイス (特に漠然とした移植性の高いコードを使用する場合) は、関数呼び出しのみをリンカー分割を介して渡し、どちらの方向にも変数をエクスポートしないことです。また、ロードされたコードがその API の興味深い部分をローダーに登録するための API がある場合も最適です (たとえば、「baz で foobar を描画するためにこのSPIを提供する方法は次のとおりです」)。すべてを一緒にマッシュアップするのではなく、コールバック。

[編集]: これを行うもう 1 つの理由は、弱いリンクをサポートしていないプラットフォームでシミュレートしている場合です。.soこれは、起動時に明示的にエクスポートするのではなく、動的ライブラリによってエクスポートされた API から SPI を構築するメイン プログラムであることを除いて、私がリストした他のものとよく似ています。これは実際には 2 番目に良い方法ですが、望むよりも自分が持っているものでやり遂げることになります (まあ、なんらかの接続ライブラリを作成して作業を行う準備ができていない限り)。

于 2010-05-07T10:03:10.083 に答える