Разница между связыванием OpenMP с -fopenmp и -lgomp

Последние несколько дней я боролся со странной проблемой. Мы создаем некоторые библиотеки, используя GCC 4.8, которые статически связывают некоторые из их зависимостей - например. log4cplus или boost. Для этих библиотек мы создали привязки Python с использованием boost-python.

Каждый раз, когда такая библиотека использует TLS (как это делает log4cplus при статической инициализации или stdlibc ++ при вызове исключения - не только на этапе инициализации), все это приводит к сбою в segfault - и каждый раз, когда адрес локальной переменной потока равен 0 ,

Я перепробовал все, например, перекомпиляцию, убедившись, что -fPIC используется, что -tls-model = global-dynamic используется и т. Д. Безуспешно. Затем сегодня я узнал, что причиной этих сбоев был наш способ соединения OpenMP. Мы сделали это с помощью «-lgomp» вместо простого «-fopenmp». С тех пор как я это изменил, все работает нормально - ни сбоев, ни с чем. Отлично!

Но мне бы очень хотелось узнать, в чем причина проблемы. Так в чем же разница между этими двумя возможностями связывания в OpenMP?

У нас есть машина CentOS 5, где мы установили GCC-4.8 в / opt / local / gcc48, и мы также уверены, что использовалась libgomp из / opt / local / gcc48 и библиотека libstdc ++ оттуда (DL_DEBUG используемый).

Есть идеи? В Google ничего не найдено - или я использовал неправильные ключевые слова :)

Ответы на вопрос(1)

Ваш ответ на вопрос