QApplication / QThread在RHEL / apache中崩溃(__get_tls_addr返回0)

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

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

  • https://trac.videolan.org/vlc/ticket/8616
  • https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=675373
  • https://www.virtualbox.org/ticket/12923?cversion=0&cnum_hist=5

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

现在,我通过反汇编find的是__get_tls_addr返回0(对于Qt静态线程数据var我想)。 现在,当我运行自定义http服务器,而不是apache, __get_tls_addr确实返回有效的指针。

我发现,如果我将-ftls-model=initial-exec更改为-ftls-model=global-dynamic那么它在RHEL / apache中工作。 我还是不明白的是为什么,关于apache的具体是什么。

initial-execlocal-exec模型对于以exec开始的应用程序来说只是有意义的。 如果这个模块不是主模块,而是一个库,事情就会失败。 而他们做不到。

你已经发现,从库中使用TLS需要与构建独立可执行文件时不同的一组标志。 希望qmake mkspecs能够处理相关的编译器。

请参阅tls-model属性参考 。