共享库加载时静态变量损坏

Static variable corruption on shared library loading

本文关键字:变量 损坏 静态 加载 共享      更新时间:2023-10-16

谁能解释为什么加载共享库会损坏静态变量?

  • Linux 上的输出 (AltLinux, openSUSE(: 1 true 0
  • Windows上的输出(使用MinGW(:
  • 1真1

Qt 5.3.1: https://github.com/ipostanogov/variables-destroyer

这取决于平台和编译器。一种解决方案是将此静态变量初始化为代码中的预期值。

可能,当您加载共享库时,它有另一个核心副本(带有空列表(。 加载共享库后,您可以访问第二个副本,或者此静态列表第二次初始化(同样,加载库后它将为空(。尝试比较库加载前后的此列表地址,您将获得答案。无论如何,问题似乎在于使用静态变量的两个实例。

你应该确保动态库链接到你用来构建程序的同一个Qt库。这应该不是问题,因为 QT 是二进制兼容的,但是,我在 Windows 上经常看到此错误,我们切换到具有不同 ABI 的较新编译器(mingw 4.8(。也许这就是你看到的效果。

观察到此行为是因为全局偏移表 (GOT(,ld.so 用于初始化可执行映像。实际上,上面示例中的静态字段初始化了两次。第一次在可执行文件加载期间,第二次在库加载期间。来自 ld.lib 的"dl_init_internal"过程的"static_initialization_and_destruction"过程调用。