链接两个供应商提供的库时,对静态变量进行双重删除

Double delete of static variable when linking two vendor supplied libraries

本文关键字:变量 静态 删除 两个 供应商 链接      更新时间:2023-10-16

我有一个类似这个问题的问题:c++ linux静态变量的双重销毁。链接符号重叠,只有我的问题是与两个供应商提供的库,所以我不能访问代码。供应商有两个动态库,对其中任何一个的链接都很好,但是对两个库的链接都会导致在程序运行结束时至少对一个静态变量进行双重删除。供应商的主要目标是windows,并且在参考问题中,他们在该平台上使用适当的dllexport属性;我想他们只是在linux上漏掉了它,我不希望它被修复。当链接到他们的库以隐藏符号时,是否有一些我可以做的事情,或者是否有一些命令我可以在他们的库上运行以更改静态变量名称?

您可以使用dlopendlclose或它们的Windows等效(LoadLibraryFreeLibrary),而不是直接链接到库。

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

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

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

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

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

作为一种替代方法,您可以从内存中加载的库之一中找到该消值设定项并重写它。我不认为这是个好主意,但在技术上是可行的。