2013-03-22 23 views
4

我移植从Windows到Linux(OS X实际上)的DLL。 我用这个StackOverflow article来做这个改变。C/C++的Linux相当于 “布尔的DllMain()” - 但我需要返回失败dlopen()的

即我已经移植Windows的 “布尔的DllMain()” 到Linux的方法:

__attribute__((constructor)) void dllLoad(); 

__attribute__((destructor)) void dllUnload(); 

...但都无效的返回类型。我需要能够像Windows那样执行相同的操作,并且在构造函数中没有满足条件时返回FALSE,以便dlopen()失败并且不加载.so。

如何获取调用dlopen()失败?

+2

尝试抛出异常。我不知道这是否会起作用,但如果dlopen是理智的(也可能是),它应该抓住它并表明失败。 – Wug 2013-03-22 18:15:23

+0

如果共享库中的某些运行时条件未满足,您希望dlopen失败? – 2013-03-22 18:17:49

+0

这与C有什么关系? C没有正式的构造函数。 – tjameson 2013-03-22 18:19:41

回答

3

答案是这是不可能的。 如前所述上面,你不能在构造出错误 - 无论是异常或退出()

1

你需要以不同的方式接近这一点。

如果您正在动态加载库,那么您还必须使用GetProcAddress()和dlsym()来实际执行任何操作。 dlsym()是你前进的道路。

你明确地控制了插件的代码,否则你甚至不能将这些API添加到它。所以,在任一平台上你所有的'dllmain'都需要设置一些全局'有效'的状态信息。然后你只需调用一个已知的API,如“ModuleIsValid()”,它的整个工作就是读取状态信息&返回true/false。如果它返回false,则关闭库并报告失败。

相关问题