【问题标题】:c/c++ Linux equivalent of "bool DllMain()" - but I need to return failure to dlopen()c/c++ Linux 等效于“bool DllMain()”-但我需要将失败返回给 dlopen()
【发布时间】:2013-03-22 18:11:26
【问题描述】:

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

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

__attribute__((constructor)) void dllLoad();

__attribute__((destructor)) void dllUnload();

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

如何让调用 dlopen() 失败?

【问题讨论】:

  • 尝试抛出异常。我不知道这是否可行,但如果 dlopen 是理智的(并且可能是理智的)它应该抓住它并指示失败。
  • 如果不满足共享库中的某些运行时条件,您希望 dlopen 失败吗?
  • 这和C有什么关系? C 没有正式的构造函数。
  • @tjameson 这不是 C++ 意义上的构造函数。它是动态库加载时调用的特殊函数。
  • @JamesMcLaughlin - 嗯,不知道。这实际上很酷。

标签: c++ c macos dll dlopen


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      相关资源
      最近更新 更多