dlopen() を介してプラグイン システムを利用する (C) プログラムを作成しています。私が直面している障害は、メインプログラムが、それらを呼び出したプラグインを本当に知る必要があるいくつかの関数をエクスポートすることです (ほとんどの場合、記録を保持するため、メインプログラムに関数ポインターのようなものを追加するため、プラグインを適切にアンロードできます)。プログラム)。
これを行うためのきれいな方法が見つからないようです。これまでに思いついたオプション:
- プラグインがその名前を提供することを要求するか、ロード時に関数への引数として与えるいくつかのデータを提供します。
- すべての関数が誰から呼び出されたかを気にするわけではないため、このオプションは好きではありません。さらに、プラグインが誰であるかについて嘘をつくのをできるだけ難しくしたいと思います
- backtrace() を使用して、前の関数のオブジェクト名を判別します。
- これはかなり醜く、移植性がないようです。
- プラグインがその名前を含むファイルレベルの構造体 (または他の変数) を配置することを要求します (議論のために「plugin_info」と呼びましょう)。次に、プラグインをロードするときに dlsym() を使用して変数を検索し、その名前で (ハッシュのように) インデックスを付けます。次に、プラグインが関数を呼び出すために使用する #define マクロを挿入し、マクロを
&plugin_info引数として追加します。- これは私が今使っているものですが、ハックのようです。1 つには、マクロに「&plugin_info」を渡す必要があります。「plugin_info」だけを渡すと、プラグインではなく、メイン プログラムから「plugin_info」がプルされます。アドレスで参照すると、正しいものでコンパイルされ、再配置されないようになります。このオプションは未定義の動作のように見えるので嫌いですが、機能します。また、マクロは、プラグイン開発者が関数呼び出しに問題がある場合 (間違った引数の型を渡すなど)、少し混乱させる可能性があります。
他のアイデアやテクニックがあれば、ぜひ知りたいです。