| 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 |