4

我正在将一个 DLL 从 Windows 移植到 Linux(实际上是 OS X)。我使用这篇StackOverflow 文章来进行更改。

即我已经将 Windows“bool DllMain()”移植到 Linux 方式:

__attribute__((constructor)) void dllLoad();

__attribute__((destructor)) void dllUnload();

...但两者都是 void 返回类型。如果构造函数中不满足条件,我需要能够执行与 Windows 相同的操作并返回 FALSE,以便 dlopen() 失败并且 .so 不加载。

如何让调用 dlopen() 失败?

4

2 回答 2

3

答案是不可能的。如上所述,您不能在构造函数中出错 - 无论是异常还是 exit()

于 2013-03-25T15:50:34.173 回答
1

你需要以不同的方式处理这个问题。

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

您可以清楚地控制插件的代码,否则您甚至无法向其中添加这些 API。因此,您在任一平台上的所有“dllmain”都需要设置一些全局“有效”状态信息。然后,您只需调用一个已知的 API,如“ModuleIsValid()”,其全部工作就是简单地读取该状态信息并返回 true/false。如果它返回 false,则关闭库并报告失败。

于 2015-02-20T21:22:07.787 回答