链接两个供应商提供的库时,双重删除静态variables

我有一个类似于这个问题的问题: c ++ linux双重破坏静态variables。 链接符号重叠只有我的问题是两个供应商提供的库,所以我没有访问的代码。 供应商有两个dynamic库和链接反对任何一个工作正常,但链接两者导致双重删除至less一个静态variables,当程序运行完成。 供应商主要针对Windows,并在引用的问题中,他们使用该平台上适当的dllexport属性; 我认为他们只是错过了在Linux上,我不希望它是固定的。 有什么我可以做的时候链接到他们的图书馆来隐藏符号,或者有一些命令,我​​可以在他们的库上运行,以改变静态variables名称?

您可以使用dlopendlclose或其等效的Windows( LoadLibraryFreeLibrary )来代替直接链接库。

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

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

或者,你可以强制应用程序关闭而不运行第二个库的析构函数(发送一个kill信号,用_exit中止,取消注册终结器,可能还有其他方法…)。 从atexit(3)手册页引用:

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

你甚至可以使用上面的atexit hack不必使用dlopen – 你可以直接链接库。

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