3

dlopen() を介してプラグイン システムを利用する (C) プログラムを作成しています。私が直面している障害は、メインプログラムが、それらを呼び出したプラグインを本当に知る必要があるいくつかの関数をエクスポートすることです (ほとんどの場合、記録を保持するため、メインプログラムに関数ポインターのようなものを追加するため、プラグインを適切にアンロードできます)。プログラム)。

これを行うためのきれいな方法が見つからないようです。これまでに思いついたオプション:

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

他のアイデアやテクニックがあれば、ぜひ知りたいです。

4

1 に答える 1

2
  1. プラグインをアドレス空間に招待したので、嘘をついたり、呼び出し元に属するメモリを上書きしたり、必要rm -rf ~に応じてプラグインを上書きしたりできます。これが問題になる場合は、権限を持たない別のプロセスでサンドボックス化する必要があります。
  2. 実際、これは恐ろしく移植性がありません。
  3. これは一般的に正しい考えですが、あなたはそれを台無しにして醜いものにしました。の定義に追加staticするplugin_infoと、完全に明確に定義された動作が得られ、ハッカーはありません。
于 2011-01-22T13:22:04.880 に答える