从加载的共享对象lib调用主程序函数

时间:2013-02-16 10:14:53

标签: c plugins shared-libraries visibility

是否可以从共享对象库中的主程序中调用函数?

我目前没有代码,但我想到了我编写的软件的插件系统,并且由于安全原因想知道这是否可行。一些伪代码:

/* 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();
}

2 个答案:

答案 0 :(得分:2)

我会说是的:当function()被加载到进程的地址空间中时,可以访问进程的函数,至少“以某种方式”。

要严格分开,请使用不同的流程。

答案 1 :(得分:1)

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

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

在main 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!