Diferença entre vincular o OpenMP com -fopenmp e -lgomp

Eu tenho enfrentado um problema estranho nos últimos dias. Criamos algumas bibliotecas usando o GCC 4.8, que vinculam estaticamente algumas de suas dependências - por exemplo. log4cplus ou impulso. Para essas bibliotecas, criamos ligações Python usando boost-python.

Toda vez que uma biblioteca desse tipo usa TLS (como o log4cplus faz na inicialização estática ou o stdlibc ++ faz ao lançar uma exceção - não apenas durante a fase de inicialização), tudo falha em um segfault - e toda vez que o endereço da variável local do encadeamento é 0 .

Eu tentei de tudo, como recompilar, garantir que -fPIC seja usado, garantir que -tls-model = global-dynamic seja usado, etc. Sem sucesso. Hoje, descobri que o motivo dessas falhas tem sido a nossa maneira de vincular o OpenMP. Fizemos isso usando "-lgomp" em vez de apenas "-fopenmp". Desde que mudei isso tudo funciona bem - sem falhas, sem nada. Bem!

Mas eu realmente gostaria de saber qual era a causa do problema. Então, qual é a diferença entre essas duas possibilidades de vincular no OpenMP?

Temos uma máquina CentOS 5 aqui onde instalamos um GCC-4.8 em / opt / local / gcc48 e também temos certeza de que o libgomp proveniente de / opt / local / gcc48 foi usado, assim como o libstdc ++ de lá (DL_DEBUG usava).

Alguma ideia? Não encontrei nada no Google - ou usei as palavras-chave erradas :)

questionAnswers(1)

yourAnswerToTheQuestion