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

这是有问题的,因为当你编译这个库时,它会有一个未解析的到 discute() 的链接。相反,如果您需要在主模块中有库调用函数,最好在库中有指向存根函数的指针,然后在运行时通过从主模块到库的初始化调用来设置这些指针。我们在商业产品中大量使用这种方法来实现“回调”功能。这是我们代码中的一个示例:

在 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;
}

在主模块.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 回答