【问题标题】:Double delete of static variable when linking two vendor supplied libraries链接两个供应商提供的库时双重删除静态变量
【发布时间】:2015-10-14 13:12:45
【问题描述】:

我有一个类似于这个问题的问题:c++ linux double destruction of static variable. linking symbols overlap 只有我的问题是两个供应商提供的库,所以我无权访问代码。供应商有两个动态库,并且链接到任何一个都可以正常工作,但是链接到这两个库会导致程序完成运行时至少一个静态变量的双重删除。供应商主要针对 Windows,并且在引用的问题中,他们在该平台上使用适当的 dllexport 属性;我认为他们只是在 linux 上错过了它,我不希望它被修复。链接到他们的库以隐藏符号时我可以做些什么,或者我可以在他们的库上运行一些命令来更改静态变量名称吗?

【问题讨论】:

    标签: c++ linux static-variables dynamic-library


    【解决方案1】:

    您可以使用dlopen 和dlclose 或它们的Windows 等效项(LoadLibrary 和FreeLibrary),而不是直接链接库。

    使用这些函数,您可以访问供应商提供的库中的所有方法,但您可以明确控制它们的初始化程序和反初始化程序何时运行。

    因此,在应用程序退出时,您可以卸载其中一个库,重新分配另一个将要删除的变量,然后让它再次被删除。

    或者,您可以在根本不运行第二个库的析构函数的情况下强制关闭应用程序(向自己发送终止信号,使用_exit 中止,注销终结器,可能还有其他方式......)。引用 atexit(3) 手册页:

    如果其中一个注册函数调用_exit(2),则不会调用任何剩余的函数,并且不会执行由exit(3)执行的其他进程终止步骤。

    您甚至可以使用上面的atexit hack 而不必使用dlopen - 您可以直接链接库。

    作为替代方案,您可以从内存中已加载的库之一中找到反初始化器并重写它。我认为这不是一个好主意,但在技术上是可行的。

    【讨论】:

      猜你喜欢
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多