| From 55a0a0aac503f5012ff2df7af37107544c757f19 Mon Sep 17 00:00:00 2001 |
| From: Thomas Petazzoni <thomas.petazzoni@bootlin.com> |
| Date: Tue, 22 Oct 2019 09:56:32 +0200 |
| Subject: [PATCH kmod] Do not check for undefined symbols when building the |
| Python modules |
| |
| kmod's configure.ac uses the -Wl,--no-undefined linker flag to verify |
| at link time that all symbols of shared libraries are available, and |
| that there are no undefined symbols. |
| |
| This make perfect sense for regular shared libraries. However, for |
| Python extensions, which will be dlopen()ed inside the Python |
| interpreter, it makes less sense. |
| |
| Since Python 3.8, there is a change in python-config script and |
| Python's pkg-config file: it no longer links Python extensions with |
| the libpython library. See |
| https://docs.python.org/dev/whatsnew/3.8.html#debug-build-uses-the-same-abi-as-release-build |
| which states: |
| |
| On the other hand, pkg-config python3.8 --libs no longer contains |
| -lpython3.8. C extensions must not be linked to libpython (except on |
| Android and Cygwin, whose cases are handled by the script); this |
| change is backward incompatible on purpose. (Contributed by Victor |
| Stinner in bpo-36721.) |
| |
| So, when linking the kmod Python extensions, it currently fails with |
| numerous unresolved symbols, that were previously provided by |
| libpython: |
| |
| /home/test/autobuild/run/instance-3/output-1/host/opt/ext-toolchain/bin/../lib/gcc/powerpc64-buildroot-linux-gnu/7.4.0/../../../../powerpc64-buildroot-linux-gnu/bin/ld: libkmod/python/kmod/.libs/list_la-list.o: in function `__Pyx_PyObject_GetAttrStr': |
| list.c:(.text.__Pyx_PyObject_GetAttrStr+0x48): undefined reference to `PyObject_GetAttr' |
| /home/test/autobuild/run/instance-3/output-1/host/opt/ext-toolchain/bin/../lib/gcc/powerpc64-buildroot-linux-gnu/7.4.0/../../../../powerpc64-buildroot-linux-gnu/bin/ld: libkmod/python/kmod/.libs/list_la-list.o: in function `__pyx_tp_dealloc_4kmod_4list_ModListItem': |
| list.c:(.text.__pyx_tp_dealloc_4kmod_4list_ModListItem+0x78): undefined reference to `PyObject_CallFinalizerFromDealloc' |
| /home/test/autobuild/run/instance-3/output-1/host/opt/ext-toolchain/bin/../lib/gcc/powerpc64-buildroot-linux-gnu/7.4.0/../../../../powerpc64-buildroot-linux-gnu/bin/ld: libkmod/python/kmod/.libs/list_la-list.o: in function `__pyx_tp_dealloc_4kmod_4list_ModList': |
| list.c:(.text.__pyx_tp_dealloc_4kmod_4list_ModList+0x30): undefined reference to `PyErr_Fetch' |
| |
| [Complete log at http://autobuild.buildroot.net/results/79a/79a5a0398723e8cfea0d0aa3dec5f7649aee4c63/build-end.log] |
| |
| Linking with libpython is no longer recommended: those symbols should |
| remain unresolved in the Python extensions, as they wil be properly |
| resolved when the Python extension gets loaded into the Python |
| interpreter. |
| |
| Since we want to keep -Wl,--no-undefined globally in kmod, we leave |
| the configure.ac file unchanged, and instead, specifically in the |
| LDFLAGS used to build the Python extensions, we override |
| -Wl,--no-undefined with -Wl,-z,undefs. Ideally, -Wl,--no-undefined is |
| the same as -Wl,-z,defs, and the effect of these options can be |
| canceled on the linker command line by a following -Wl,-z,undefs (see |
| the ld man page for details). |
| |
| Upstream: https://lore.kernel.org/linux-modules/20191024174710.9441-1-thomas.petazzoni@bootlin.com/ |
| Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> |
| Cc: Victor Stinner <victor.stinner@gmail.com> |
| --- |
| Makefile.am | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/Makefile.am b/Makefile.am |
| index c5c2f06..8e9c90d 100644 |
| --- a/Makefile.am |
| +++ b/Makefile.am |
| @@ -173,7 +173,7 @@ CPYTHON_MODULE_CFLAGS = \ |
| $(AM_CFLAGS) -DCPYTHON_COMPILING_IN_PYPY=0 \ |
| $(PYTHON_NOWARN) $(PYTHON_CFLAGS) \ |
| -fvisibility=default |
| -CPYTHON_MODULE_LDFLAGS = $(AM_LDFLAGS) -module -avoid-version -shared |
| +CPYTHON_MODULE_LDFLAGS = $(AM_LDFLAGS) -module -avoid-version -shared -Wl,-z,undefs |
| |
| if BUILD_PYTHON |
| pkgpyexec_LTLIBRARIES = \ |
| -- |
| 2.21.0 |
| |