1

共有オブジェクト ライブラリ内のメイン プログラムから関数を呼び出すことはできますか?

私は現在コードを持っていませんが、私が書いたソフトウェアのプラグイン システムについて考えており、セキュリティ上の理由からこれが可能かどうか知りたいです。擬似コード:

/* main program */
void disturbe() {
    /*some bad stuff, just the main program should be able to call*/
}

main()
    lib = load_library("foo.so");
    lib->function();
}

/* foo.so */

void function() {
    disturbe();
}
4

2 に答える 2

2

私はそう言います:function()プロセスのアドレス空間にロードされていたので、少なくとも「何らかの方法で」プロセスの機能にアクセスできました

物事を厳密に分離するには、さまざまなプロセスを使用します。

于 2013-02-16T11:05:00.370 に答える
1

ライブラリをコンパイルすると、disturve() への未解決のリンクが存在するため、これは問題です。代わりに、ライブラリにメイン モジュール内の関数を呼び出す必要がある場合は、ライブラリ内のスタブ関数へのポインタを用意し、実行時にメイン モジュールからライブラリへの初期化呼び出しでこれらのポインタを設定することをお勧めします。この方法は、商用製品の「コールバック」関数でよく使用されます。コードの例を次に示します。

library.h で:

typedef bool (*pbWMC)(DCwfile *, unc);

// stub functions for uninitialized pointers 
static bool StubbWMC(DCwfile *df, unc uch);

// variables set by Init()
static pbWMC WriteMacroChar;

library.cpp で:

// callback functions
pbWMC DCmacr::WriteMacroChar = StubbWMC;

// stub functions for uninitialized function pointers
bool DCmacr::StubbWMC(DCwfile *df, unc uch)
{
    return false;
}

// initializer called from main module
void DCmacr::InitMacroModule(DCwfile *df, pbWMC fwmc)
{
    if (df)
        DestFile = df;
    if (fwmc)
        WriteMacroChar = fwmc;
}

メインmodule.cppで:

// call to initializer
DCmacr::InitMacroModule(wf, WriteMacroChar);

// function called by library
bool HTMwr::WriteMacroChar(DCwfile *df, unc uch)
{
    HTMwfile *wf = (HTMwfile *) df;

    if (uch == 183) {  // bullet
        wf->putSpec(uch);
        return true;
    }
    return false;
}

この設計により、ライブラリの呼び出しごとに異なるコールバック関数を指定できるようになり、コードが完全にモジュール化されます。C++ を使用しますが、C と同じ設計で機能します。HTH!

于 2013-02-16T14:43:38.560 に答える