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.
| | simply skip the extension. | |
+------------------------+--------------------------------+---------------------------+
+ .. versionchanged:: 3.8
+
+ On Unix, C extensions are no longer linked to libpython.
+
.. class:: Distribution
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.
:c:func:`PyArg_ParseTuple`, :c:func:`Py_BuildValue`, :c:func:`PyObject_CallFunction`,
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.
(Contributed by Inada Naoki in :issue:`36381`.)
-
-Changes in the C API
---------------------------
-
* Instances of heap-allocated types (such as those created with
:c:func:`PyType_FromSpec`) hold a reference to their type object.
Increasing the reference count of these type objects has been moved from
# don't extend ext.libraries, it may be shared with other
# extensions, it is a reference to the original list
return ext.libraries + [pythonlib]
- else:
- 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
+
+ return ext.libraries
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
$(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
@ # is not available in configure
sed -e "s,@EXENAME@,$(BINDIR)/python$(LDVERSION)$(EXE)," < $(srcdir)/Misc/python-config.in >python-config.py
--- /dev/null
+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.
print(' '.join(flags))
elif opt in ('--libs', '--ldflags'):
- libs = ['-lpython' + pyver + sys.abiflags]
- libs += getvar('LIBS').split()
- libs += getvar('SYSLIBS').split()
+ libs = getvar('LIBS').split() + getvar('SYSLIBS').split()
# add the prefix/lib/pythonX.Y/config dir, but only if there is no
# shared library in prefix/lib/.
if opt == '--ldflags':
LIBC="@LIBC@"
SYSLIBS="$LIBM $LIBC"
ABIFLAGS="@ABIFLAGS@"
-LIBS="-lpython${VERSION}${ABIFLAGS} @LIBS@ $SYSLIBS"
+LIBS="@LIBS@ $SYSLIBS"
BASECFLAGS="@BASECFLAGS@"
LDLIBRARY="@LDLIBRARY@"
OPT="@OPT@"