私は.soライブラリ(やはり私が開発したもの)を使うプログラムを作っています。 .soを使用するプログラムを再起動しなくても、開発中に.soを更新して再配布できるようにしたいです。私のシステム(Ubuntu 15.04)では、dlopen、dlsym、dlcloseがこれを引き起こす可能性があることを示しました。ファイルを置き換え、古いライブラリを閉じて、同じファイルパスを介して新しいバージョンを開き、シンボルを再ロードするだけです。このコンテンツが必要です。しかし、以前のバージョンも開いたままにしたい場合はどうすればよいですか?
私はまだ試していませんが、Nバージョンのライブラリに対してN個の異なるファイルパスを使用してこれを達成できると思います。しかし、私は同じパスを使用することを好みます。しかし、私はそれを動作させることはできません。私がこうすれば:
- 古いと思います。
- DLシンボル
- プログラムの外でrm .soを実行し、最新バージョンに置き換えます。
- dlopen .so (今回は新しいバージョンのハンドルを取得したい)
- DLシンボル
...その後、同じライブラリハンドルの2つのコピーで終わるようです。参照回数が増えたので、今はdlcloseを2回する必要があるようです。ステップ5でdlsymで以前のバージョンを入手しました。だからdlopenは私の新しいファイルを見ることができません。参照カウントメカニズムがファイルの内容ではなく、パスなどでファイルをインデックス化しているようです。内容を調べてライブラリを識別しようとするのがとても奇妙だと思います。
必要に応じて行うことができますか、それとも2つの異なるファイルパスを使用する必要がありますか?この場合はあまり問題ではありませんが、気になります。そしてdlopenのマニュアルページは、開いているライブラリがすでに開いているライブラリかどうかを判断するためにdlopenが使用するロジックを指定しないようです。