是否可以从共享对象库中的主程序中调用函数?
我目前没有代码,但我想到了我编写的软件的插件系统,并且由于安全原因想知道这是否可行。一些伪代码:
/* 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();
}
答案 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!