Bug in linking to gomp with python; causes crash in matplotlib.

Hello,

I've encountered a strange bug that appears to be either in gcc's gomp
implementation or in how python loads extension modules linked against
gomp. Here's the error:

Using gcc (multiple versions) on linux, I compile an empty c extension
module and pass -lgomp as a linker arg. If I import it, running a
simple script in matplotlib causes a segfault. Not passing -lgomp or
not loading the empty module makes the code works fine. More
specifically, if I compile:

#include "Python.h"
static struct PyMethodDef methods[] = {
  {0, 0, 0, 0}
};
PyMODINIT_FUNC initempty(void) {
  Py_InitModule4("empty", methods, 0, 0, PYTHON_API_VERSION);
}

using ``ext_modules = [Extension("empty", ["empty.c"], extra_link_args
= ["-lgomp"])]``, then

import empty
import matplotlib.pylab as plt

plt.figure()
plt.plot([0,1], [0,1], '-b')
plt.show()

causes the program to segfault (removing ``import empty`` makes it
fine). Looking at a traceback:

#0 0x00f78bc7 in __cxa_allocate_exception () from /usr/lib/libstdc++.so.6
#1 0x008f51f2 in py_to_agg_transformation_matrix (obj=0x8223f58,
errors=false) at src/agg_py_transforms.cpp:20
#2 0x008fdd73 in _path_module::update_path_extents (this=0x8e45f90,
args=...) at src/path.cpp:378
#3 0x009048bd in
Py::ExtensionModule<_path_module>::invoke_method_varargs (this=<value
optimized out>, method_def=0x8e9ae30, args=...) at
./CXX/Python2/ExtensionModule.hxx:184
#4 0x008f0d96 in method_varargs_call_handler
(_self_and_name_tuple=0x8e6eeac, _args=0x94e683c) at
CXX/Python2/cxx_extensions.cxx:1714
#5 0x080dc0d0 in PyEval_EvalFrameEx ()
#6 0x080dddf2 in PyEval_EvalCodeEx ()

While occurring in some of matplotlib's extension code (and I haven't
found another library that crashes it), the fact that the deciding
factor is whether I link against gomp indicates the it's probably
upstream somewhere.

I encountered this error a year ago and asked about it on the
matplotlib mailing list, but found a quick workaround then, and with
deadline pressure I forgot about it. However, it's come up again, and
then I was asked to bump it to python-dev, which is why I'm posting it
here.

I can reproduce it on the following systems. In all cases, matplotlib
is compiled from source on the development branch (r8969) and uses
QT4Agg as the backend, as is numpy, scipy, etc. If needed, I can
track down more versions.

gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.4, 64bit, Python 2.6.6, ubuntu 10.10
gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3, 64bit, Python 2.6.5, ubuntu 10.04
gcc (Ubuntu 4.4.1-4ubuntu9) 4.4.1, 32bit, Python 2.6.4, ubuntu 9.10

gcc 4.5.2 (source build), Python 2.6.5, ubuntu 10.04. On this build,
the given source example does not produce the result, and I haven't
been able to tweak it so it does. However, linking to a much larger
extension library that uses many different parts of openmp causes
exactly the same crash. If I recompile that library without openmp
support, then everything works fine; with openmp support it corrupts
something and matplotlib crashes in exactly the same way.

gcc 4.3.2, Python 2.6.2, ubuntu 9.04 (I don't have access to this
system any more, since it got upgraded, but it had the same problem a
year ago).

I'd be happy to provide any more information if needed. I attached
example code that reproduces it. Let me know if I should file a bug
report (and where to file it -- which is why I haven't yet).

Thanks,

--Hoyt

python-gomp-bug.tar.gz (672 Bytes)

···

++++++++++++++++++++++++++++++++++++++++++++++++
+ Hoyt Koepke
+ University of Washington Department of Statistics
+ http://www.stat.washington.edu/~hoytak/
+ hoytak@...149...
++++++++++++++++++++++++++++++++++++++++++

An associated bug report would be appreciated (mailing list
discussions are useful for raising awareness, but are more likely to
be forgotten over time than bug reports): http://bugs.python.org

Cheers,
Nick.

···

On Sun, Feb 20, 2011 at 3:43 PM, Hoyt Koepke <hoytak@...931...> wrote:

I'd be happy to provide any more information if needed. I attached
example code that reproduces it. Let me know if I should file a bug
report (and where to file it -- which is why I haven't yet).

--
Nick Coghlan | ncoghlan@...149... | Brisbane, Australia

An associated bug report would be appreciated (mailing list
discussions are useful for raising awareness, but are more likely to
be forgotten over time than bug reports): http://bugs.python.org

Just did that; thanks!

-- Hoyt

···

++++++++++++++++++++++++++++++++++++++++++++++++
+ Hoyt Koepke
+ University of Washington Department of Statistics
+ http://www.stat.washington.edu/~hoytak/
+ hoytak@...149...
++++++++++++++++++++++++++++++++++++++++++