Przez ostatnie kilka dni zmagałem się z dziwnym problemem. Tworzymy biblioteki używając GCC 4.8, które statycznie łączą niektóre zależności - np. log4cplus lub boost. Dla tych bibliotek utworzyliśmy powiązania Python za pomocą boost-python.Różnica między łączeniem OpenMP z -fopenmp i -lgomp
Za każdym razem, gdy taka biblioteka korzystała z TLS (np. Log4cplus w swojej statycznej inicjalizacji lub stdlibC++ robi podczas zgłaszania wyjątku - nie tylko podczas fazy inicjalizacji), cała sprawa rozbiła się w segfaultie - i za każdym razem, gdy adres wątku jest lokalny zmienna została 0.
Próbowałem wszystkiego jak rekompilacja, zapewnienie -fPIC jest używane, zapewnienie -tls-model = globalna-dynamiczna jest używana, itp. Brak sukcesu. Wtedy dowiedziałem się, że powodem tych awarii był nasz sposób na połączenie OpenMP. Zrobiliśmy to za pomocą "-lgomp" zamiast po prostu używając "-fopenmp". Odkąd to zmieniłem, wszystko działa dobrze - bez wypadków, bez niczego. W porządku!
Ale naprawdę chciałbym wiedzieć, jaka była przyczyna problemu. Jaka jest więc różnica między tymi dwoma możliwościami połączenia w OpenMP?
Mamy tutaj maszynę CentOS 5, w której zainstalowaliśmy GCC-4.8 w/opt/local/gcc48 i jesteśmy również pewni, że libgomp pochodzący z/opt/local/gcc48 został użyty tak samo jak libstdC++ od tego miejsca (użyty DL_DEBUG).
Wszelkie pomysły? Nie znalazłem nic w Google - lub użyłem niewłaściwych słów kluczowych :)
-pthread lub -lpthread był tam – duselbaer
Skompiluj z '-v' i porównaj dane wyjściowe ... –
Dodanie opcji -v jako opcji linkera pokazuje, że -fopenmp domyślnie dodaje na koniec -lgomp. Wszystko inne pozostaje takie samo. Bez -fopenp mam "-lstdC++ -lm -lgcc_s -lpthread -lc -lgcc_s" i z -fopenmp staje się "-lstdC++ -lm -lgomp -lgcc_s -lpthread -lc -lgcc_s". Nadal nie widzę przyczyny awarii, ponieważ wszystkie te biblioteki są połączone dynamicznie :( – duselbaer