bpo-21536: C extensions are no longer linked to libpython (GH-12946)
On Unix, C extensions are no longer linked to libpython. It is now possible to load a C extension built using a shared library Python with a statically linked Python. When Python is embedded, libpython must not be loaded with RTLD_LOCAL, but RTLD_GLOBAL instead. Previously, using RTLD_LOCAL, it was already not possible to load C extensions which were not linked to libpython, like C extensions of the standard library built by the "*shared*" section of Modules/Setup. distutils, python-config and python-config.py have been modified.
This commit is contained in:
parent
d7befad328
commit
8c3ecc6bac
|
@ -277,6 +277,10 @@ the full reference.
|
||||||
| | simply skip the extension. | |
|
| | simply skip the extension. | |
|
||||||
+------------------------+--------------------------------+---------------------------+
|
+------------------------+--------------------------------+---------------------------+
|
||||||
|
|
||||||
|
.. versionchanged:: 3.8
|
||||||
|
|
||||||
|
On Unix, C extensions are no longer linked to libpython.
|
||||||
|
|
||||||
|
|
||||||
.. class:: Distribution
|
.. class:: Distribution
|
||||||
|
|
||||||
|
|
|
@ -851,16 +851,19 @@ Changes in the Python API
|
||||||
Changes in the C API
|
Changes in the C API
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
|
* On Unix, C extensions are no longer linked to libpython. When Python is
|
||||||
|
embedded, ``libpython`` must not be loaded with ``RTLD_LOCAL``, but
|
||||||
|
``RTLD_GLOBAL`` instead. Previously, using ``RTLD_LOCAL``, it was already not
|
||||||
|
possible to load C extensions which were not linked to ``libpython``, like C
|
||||||
|
extensions of the standard library built by the ``*shared*`` section of
|
||||||
|
``Modules/Setup``.
|
||||||
|
|
||||||
* Use of ``#`` variants of formats in parsing or building value (e.g.
|
* Use of ``#`` variants of formats in parsing or building value (e.g.
|
||||||
:c:func:`PyArg_ParseTuple`, :c:func:`Py_BuildValue`, :c:func:`PyObject_CallFunction`,
|
:c:func:`PyArg_ParseTuple`, :c:func:`Py_BuildValue`, :c:func:`PyObject_CallFunction`,
|
||||||
etc.) without ``PY_SSIZE_T_CLEAN`` defined raises ``DeprecationWarning`` now.
|
etc.) without ``PY_SSIZE_T_CLEAN`` defined raises ``DeprecationWarning`` now.
|
||||||
It will be removed in 3.10 or 4.0. Read :ref:`arg-parsing` for detail.
|
It will be removed in 3.10 or 4.0. Read :ref:`arg-parsing` for detail.
|
||||||
(Contributed by Inada Naoki in :issue:`36381`.)
|
(Contributed by Inada Naoki in :issue:`36381`.)
|
||||||
|
|
||||||
|
|
||||||
Changes in the C API
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
* Instances of heap-allocated types (such as those created with
|
* Instances of heap-allocated types (such as those created with
|
||||||
:c:func:`PyType_FromSpec`) hold a reference to their type object.
|
:c:func:`PyType_FromSpec`) hold a reference to their type object.
|
||||||
Increasing the reference count of these type objects has been moved from
|
Increasing the reference count of these type objects has been moved from
|
||||||
|
|
|
@ -714,20 +714,5 @@ class build_ext(Command):
|
||||||
# don't extend ext.libraries, it may be shared with other
|
# don't extend ext.libraries, it may be shared with other
|
||||||
# extensions, it is a reference to the original list
|
# extensions, it is a reference to the original list
|
||||||
return ext.libraries + [pythonlib]
|
return ext.libraries + [pythonlib]
|
||||||
else:
|
|
||||||
return ext.libraries
|
return ext.libraries
|
||||||
elif sys.platform == 'darwin':
|
|
||||||
# Don't use the default code below
|
|
||||||
return ext.libraries
|
|
||||||
elif sys.platform[:3] == 'aix':
|
|
||||||
# Don't use the default code below
|
|
||||||
return ext.libraries
|
|
||||||
else:
|
|
||||||
from distutils import sysconfig
|
|
||||||
if sysconfig.get_config_var('Py_ENABLE_SHARED'):
|
|
||||||
pythonlib = 'python{}.{}{}'.format(
|
|
||||||
sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff,
|
|
||||||
sysconfig.get_config_var('ABIFLAGS'))
|
|
||||||
return ext.libraries + [pythonlib]
|
|
||||||
else:
|
|
||||||
return ext.libraries
|
|
||||||
|
|
|
@ -1460,7 +1460,7 @@ libinstall: build_all $(srcdir)/Modules/xxmodule.c
|
||||||
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
|
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
|
||||||
$(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/PatternGrammar.txt
|
$(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/PatternGrammar.txt
|
||||||
|
|
||||||
python-config: $(srcdir)/Misc/python-config.in Misc/python-config.sh
|
python-config: $(srcdir)/Misc/python-config.in $(srcdir)/Misc/python-config.sh
|
||||||
@ # Substitution happens here, as the completely-expanded BINDIR
|
@ # Substitution happens here, as the completely-expanded BINDIR
|
||||||
@ # is not available in configure
|
@ # is not available in configure
|
||||||
sed -e "s,@EXENAME@,$(BINDIR)/python$(LDVERSION)$(EXE)," < $(srcdir)/Misc/python-config.in >python-config.py
|
sed -e "s,@EXENAME@,$(BINDIR)/python$(LDVERSION)$(EXE)," < $(srcdir)/Misc/python-config.in >python-config.py
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
On Unix, C extensions are no longer linked to libpython.
|
||||||
|
|
||||||
|
It is now possible to load a C extension built using a shared library Python
|
||||||
|
with a statically linked Python.
|
||||||
|
|
||||||
|
When Python is embedded, ``libpython`` must not be loaded with ``RTLD_LOCAL``,
|
||||||
|
but ``RTLD_GLOBAL`` instead. Previously, using ``RTLD_LOCAL``, it was already
|
||||||
|
not possible to load C extensions which were not linked to ``libpython``, like
|
||||||
|
C extensions of the standard library built by the ``*shared*`` section of
|
||||||
|
``Modules/Setup``.
|
||||||
|
|
||||||
|
distutils, python-config and python-config.py have been modified.
|
|
@ -47,9 +47,7 @@ for opt in opt_flags:
|
||||||
print(' '.join(flags))
|
print(' '.join(flags))
|
||||||
|
|
||||||
elif opt in ('--libs', '--ldflags'):
|
elif opt in ('--libs', '--ldflags'):
|
||||||
libs = ['-lpython' + pyver + sys.abiflags]
|
libs = getvar('LIBS').split() + getvar('SYSLIBS').split()
|
||||||
libs += getvar('LIBS').split()
|
|
||||||
libs += getvar('SYSLIBS').split()
|
|
||||||
# add the prefix/lib/pythonX.Y/config dir, but only if there is no
|
# add the prefix/lib/pythonX.Y/config dir, but only if there is no
|
||||||
# shared library in prefix/lib/.
|
# shared library in prefix/lib/.
|
||||||
if opt == '--ldflags':
|
if opt == '--ldflags':
|
||||||
|
|
|
@ -41,7 +41,7 @@ LIBM="@LIBM@"
|
||||||
LIBC="@LIBC@"
|
LIBC="@LIBC@"
|
||||||
SYSLIBS="$LIBM $LIBC"
|
SYSLIBS="$LIBM $LIBC"
|
||||||
ABIFLAGS="@ABIFLAGS@"
|
ABIFLAGS="@ABIFLAGS@"
|
||||||
LIBS="-lpython${VERSION}${ABIFLAGS} @LIBS@ $SYSLIBS"
|
LIBS="@LIBS@ $SYSLIBS"
|
||||||
BASECFLAGS="@BASECFLAGS@"
|
BASECFLAGS="@BASECFLAGS@"
|
||||||
LDLIBRARY="@LDLIBRARY@"
|
LDLIBRARY="@LDLIBRARY@"
|
||||||
OPT="@OPT@"
|
OPT="@OPT@"
|
||||||
|
|
Loading…
Reference in New Issue