[Python-Dev] Use C extensions compiled in release mode on a Python compiled in debug mode (original) (raw)
Matthias Klose doko at ubuntu.com
Thu Apr 25 03🔞54 EDT 2019
- Previous message (by thread): [Python-Dev] Use C extensions compiled in release mode on a Python compiled in debug mode
- Next message (by thread): [Python-Dev] Use C extensions compiled in release mode on a Python compiled in debug mode
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On 24.04.19 18:02, Victor Stinner wrote:
Hum, I found issues with libpython: C extensions are explicitly linked to libpython built in release mode. So a debug python loading a C extension may load libpython in release mode, whereas libpython in debug mode is already loaded.
When Python is built with --enable-shared, the python3.7 program is linked to libpython3.7m.so.1.0 on Linux. C extensions are explicitly linked to libpython3.7m as well: $ python3.7-config --ldflags ... -lpython3.7m ... Example with numpy: $ ldd /usr/lib64/python3.7/site-packages/numpy/core/umath.cpython-37m-x8664-linux-gnu.so ... libpython3.7m.so.1.0 => /lib64/libpython3.7m.so.1.0 (...) ... When Python 3.7 is compiled in debug mode, libpython gets a "d" flag for debug: libpython3.7dm.so.1.0. I see 2 solutions: (1) Use a different directory. If "libpython" gets the same filename in release and debug mode, at least, they must be installed in different directories. If libpython build in debug mode is installed in /usr/lib64/python3.7-dbg/ for example, python3.7-dbg should be compiled with -rpath /usr/lib64/python3.7-dbg/ to get the debug libpython. (2) If "libpython" gets a different filename in debug mode, C extensions should not be linked to libpython explicitly but implicitly to avoid picking the wrong libpython. For example, remove "-lpython3.7m" from "python3.7-config --ldflags" output. The option (1) rely on rpath which is discouraged by Linux vendors and may not be supported by all operating systems. The option (2) is simpler and likely more portable. Currently, C extensions of the standard library may or may not be linked to libpython depending on they are built. In practice, both work since python3.7 is already linked to libpython: so libpython is already loaded in memory before C extensions are loaded.
the purpose of python-config here is not clear. Whether it's intended to be used for linking extensions, or embedded interpreters. Currently you are using the same for both use cases.
- Previous message (by thread): [Python-Dev] Use C extensions compiled in release mode on a Python compiled in debug mode
- Next message (by thread): [Python-Dev] Use C extensions compiled in release mode on a Python compiled in debug mode
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]