可以在共享对象库中调用主程序中的函数吗?
我目前没有代码,但我想为我写的一个软件的插件系统,并想知道这是否可能,因为安全原因。一些伪代码:
/* 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();
}发布于 2013-02-16 19:05:00
我会说是的:因为function()已经被加载到进程的地址空间中,所以它可以访问进程的函数,至少“以某种方式”。
要保持事物的严格分离,请使用不同的进程。
发布于 2013-02-16 22:43:39
这是有问题的,因为当你编译库的时候,它会有一个未解析的指向unresolved ()的链接。相反,如果您需要在主模块中具有库调用函数,最好在库中具有指向存根函数的指针,然后在运行时使用从主模块到库的初始化调用来设置这些指针。我们在我们的“回调”函数的商业产品中经常使用这种方法。下面是我们代码中的一个示例:
在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的设计是一样的!
https://stackoverflow.com/questions/14909164
复制相似问题