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

标签 linux apache qt rhel

我们的应用程序仅在 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/

相关文章:

node.js - 环境变量的基本概念是什么?

linux - 使用 'grep' 和 'man' 以及一些选项输出文本

php - svn export 使我的页面空白

apache .htaccess重写-我可以将其移到httpd.conf中吗

c++ - Qt编译错误: C2280: attempting to reference a deleted function

需要 Linux Cap_Kill 帮助

php - 强制 fwrite 在 PHP 中使用\n 而不是\r\n

java - 如何在 Apache 中禁用来自 mod_jk 代理应用程序服务器的某些响应 header 的压缩

c++ - QT中如何让弹出窗口成为顶层窗口?

qt - 如何在QT中使QComboBox成为MultiSelect?