共享库加载时静态变量损坏
Static variable corruption on shared library loading
谁能解释为什么加载共享库会损坏静态变量?
- 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"过程调用。
相关文章:
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- 变量周围的堆栈'sortArray'已损坏
- 变量周围的堆栈'folderPath'已损坏
- 运行时检查失败 #2 - 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 - 变量"l1"周围的堆栈已损坏
- 围绕变量的堆栈是损坏的 c++
- C++:此代码可以编译,但引发运行时检查失败 #2 - 围绕变量周围的堆栈'num'已损坏。发生
- 数组变量周围的堆栈已损坏
- 运行时检查失败 - 变量周围的堆栈已损坏
- 我的 c 字符串复制函数正在损坏其他变量的堆栈
- 位字段附近的变量会损坏吗?
- 调试:运行时检查失败 #2 - 变量"LoggerThread"周围的堆栈已损坏
- 如何在 arm 平台中调试 c 程序中的全局变量损坏
- 类私有变量损坏
- 共享库加载时静态变量损坏
- 堆栈周围变量损坏.为什么会这样呢?
- 变量损坏c++字符串Visual Studio 2005