我们的应用程序仅在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。 但为什么会发生这种情况?
现在,我通过反汇编find的是__get_tls_addr
返回0(对于Qt静态线程数据var我想)。 现在,当我运行自定义http服务器,而不是apache, __get_tls_addr
确实返回有效的指针。
我发现,如果我将-ftls-model=initial-exec
更改为-ftls-model=global-dynamic
那么它在RHEL / apache中工作。 我还是不明白的是为什么,关于apache的具体是什么。
initial-exec
和local-exec
模型对于以exec
开始的应用程序来说只是有意义的。 如果这个模块不是主模块,而是一个库,事情就会失败。 而他们做不到。
你已经发现,从库中使用TLS需要与构建独立可执行文件时不同的一组标志。 希望qmake mkspecs能够处理相关的编译器。
请参阅tls-model属性参考 。