Сбой в QApplication/QThread на RHEL / apache (get tls addr возвращает 0)


Наше приложение аварийно завершает работу только при запуске на RHEL6 под управлением apache (даже если запускается автономно как 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.

1 2

1 ответ:

Модель initial-exec и local-exec имеет смысл только для приложения, которое начинается с exec'd. предполагается, что все завершится неудачей, если модуль не является основным модулем, а библиотекой. И они терпят неудачу.

Вы обнаружили, что для использования TLS из библиотеки требуется другой набор флагов, чем при создании автономного исполняемого файла. Хотелось бы, чтобы qmake mkspecs позаботились об этом на соответствующих компиляторах...

Смотрите ссылку на атрибут tls-model.