gpt4 book ai didi

linux - RHEL/apache 上的 QApplication/QThread 崩溃(__get_tls_addr 返回 0)

转载 作者:太空狗 更新时间:2023-10-29 11:44:35 25 4
gpt4 key购买 nike

我们的应用程序仅在 Apache 下的 RHEL6 上运行时崩溃(即使以 httpd -X 独立启动)。当使用自定义小型 http 服务器或在另一台装有 Ubuntu 的机器上运行时,它工作正常。

这是堆栈跟踪:

Program received signal SIGSEGV, Segmentation fault.
0x00007fffe8f96d9f in ?? () from /opt/QtSDK/Desktop/Qt/4.8.1/gcc/lib/libQtCore.so.4
(gdb) bt
#0 0x00007fffe8f96d9f in ?? () from /opt/QtSDK/Desktop/Qt/4.8.1/gcc/lib/libQtCore.so.4
#1 0x00007fffe8f93a39 in QThread::currentThread() () from /opt/QtSDK/Desktop/Qt/4.8.1/gcc/lib/libQtCore.so.4
#2 0x00007fffe90a05bc in QCoreApplicationPrivate::QCoreApplicationPrivate(int&, char**, unsigned int) ()
from /opt/QtSDK/Desktop/Qt/4.8.1/gcc/lib/libQtCore.so.4
#3 0x00007fffe7cbec63 in QApplicationPrivate::QApplicationPrivate(int&, char**, QApplication::Type, int) ()
from /opt/QtSDK/Desktop/Qt/4.8.1/gcc/lib/libQtGui.so.4
#4 0x00007fffe7cc811c in QApplication::QApplication(int&, char**, int) () from /opt/QtSDK/Desktop/Qt/4.8.1/gcc/lib/libQtGui.so.4

互联网上有几个类似的问题,但没有一个列出任何答案:

根据 Qt 源代码,我认为 QThreadData::current() 返回 NULL。但为什么会发生这种情况?

现在,我通过反汇编发现 __get_tls_addr 返回 0(我想对于 Qt static threaddata var)。现在,当我运行自定义 http 服务器而不是 apache 时,__get_tls_addr 会返回有效指针。

我发现如果我将 -ftls-model=initial-exec 更改为 -ftls-model=global-dynamic 那么它可以在 RHEL/apache 中运行。我仍然不明白的是为什么,apache 具体是什么。

最佳答案

initial-execlocal-exec 模型只对通过exec 启动的应用程序有意义。如果模块不是主模块,而是一个库,那么事情应该会失败。他们失败了。

您发现从库中使用 TLS 需要一组不同的标志,这与构建独立的可执行文件时不同。人们希望 qmake mkspecs 在相关的编译器上解决这个问题......

参见 the tls-model attribute reference .

关于linux - RHEL/apache 上的 QApplication/QThread 崩溃(__get_tls_addr 返回 0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25203763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com