我们的应用程序仅在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静态threaddata var,我想)。现在,当我运行自定义http服务器而不是apache时,__get_tls_addr
会返回有效指针。
我发现如果我将-ftls-model=initial-exec
更改为-ftls-model=global-dynamic
,那么它可以在RHEL / apache中使用。我还不明白为什么,apache的具体内容。
答案 0 :(得分:4)
initial-exec
和local-exec
模型仅对以exec
'd开头的应用程序有意义。如果模块不是主模块,而是库,那么事情应该会失败。他们做不到。
您发现的是,从库中使用TLS会比构建独立可执行文件时使用不同的标记集。有人希望qmake mkspecs在相关编译器上处理这个问题......