1

私のオープンソースプロジェクトArthaでは、パッシブデスクトップ通知をユーザーに表示するためにlibnotifyを使用しています。

libnotifyを静的にリンクする代わりに、実行時に共有オブジェクト(.so)ファイルのルックアップが行われdlload、ターゲットマシンで使用可能な場合、ArthaはそのGUIで通知機能を公開します。アプリ上。dlloadstart、 filename paramを使用した呼び出しlibnotify.so.1が行われ、null以外のポインターが返された場合、機能が公開されます。

このモデルで繰り返し発生する問題は、ライブラリのバージョン番号がバンプされるたびに、Arthaのコードを更新する必要があることです。現在、このような事態が発生libnotify.so.4するのは最新です。

Linuxシステムコール(アプリが実行されているディストリビューションに関係なく)はありますか?これは、特定のライブラリの共有オブジェクトが実行時に利用可能かどうかを教えてくれますか?1から10に変更してライブラリを列挙するブルートフォースオプションが存在することを私は知っています。私は解決策が醜くてエレガントではないと思います。

また、これがautoconfを介して対処できる場合、そのソリューションも歓迎されます。つまり、ビルド時に、ターゲットマシンに基づいて、生成されたconfigure.hはに渡すことができる正しい.so名を持っている必要がありますdlload

PS:優れたディストリビューションは、リンクを作成するスタイルに従って、libnotify.so.xプログラマーが実行できるようにし、dlload("libnotify.so", RTLD_LAZY).soという番号の正しいバージョンがロードされると思います。残念ながら、Ubuntuを含め、すべてのディストリビューションがこれに準拠しているわけではありません。

4

1 に答える 1

1

答えは:あなたはしません。

dlopen()はそのようなことを処理するようには設計されておらず、必要なシンボルが含まれているという理由だけでシステム上で見つけたバージョンをロードしようとするのは良い方法ではありません。

異なるsonameは異なるABIを持ち、異なるABIは、異なるセット(または異なるサイズ)のパラメーターを予期している同じ正確なシンボル名を呼び出す可能性があることを意味します。これにより、デバッグが非常に困難なクラッシュや誤動作が発生します。

共有オブジェクトのバージョンがどのように機能するか、およびABIとは何かについて読む必要があります。

libfoo.soリンクはリンクエディタ()用にありld、通常は-develその理由でパッケージとともにインストールされます。また、リンクではなく、リンカースクリプトを含むテキストファイルである場合もあります。多くの場合、意図して、実行しようとしていることを正確に回避します。

于 2014-07-23T09:14:07.053 に答える