From: Kienan Stewart Date: Fri, 1 Mar 2024 18:09:51 +0000 (-0500) Subject: Fix: force _lttng python binding to be linked with g++ X-Git-Url: http://git.liburcu.org/?p=lttng-tools.git;a=commitdiff_plain;h=f2b390e97d3b6ec347fe7c4af3b46256716ae054 Fix: force _lttng python binding to be linked with g++ Observed issue ============== On Enterprise Linux 7 CI nodes, several tests using the python binding were failing with errors such as the following: ``` ERROR: ust/exit-fast/test_exit-fast =================================== Warning: Failed to produce a random seed using getrandom(), falling back to pseudo-random device seed generation which will block until its pool is initialized: getrandom() is not supported by this platform [getrandom_nonblock() random.cpp:90] Traceback (most recent call last): File "/home/jenkins/workspace/lttng-tools_master_elbuild/babeltrace_version/stable-2.0/build/std/conf/std/liburcu_version/master/platform/el7-amd64/src/lttng-tools/extras/bindings/swig/python/lttng.py", line 24, in swig_import_helper fp, pathname, description = imp.find_module('_lttng', [dirname(__file__)]) File "/usr/lib64/python3.6/imp.py", line 297, in find_module raise ImportError(_ERR_MSG.format(name), name=name) ImportError: No module named '_lttng' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "./ust/exit-fast/test_exit-fast.py", line 19, in from test_utils import * File "/home/jenkins/workspace/lttng-tools_master_elbuild/babeltrace_version/stable-2.0/build/std/conf/std/liburcu_version/master/platform/el7-amd64/src/lttng-tools/tests/utils/test_utils.py", line 24, in from lttng import * File "/home/jenkins/workspace/lttng-tools_master_elbuild/babeltrace_version/stable-2.0/build/std/conf/std/liburcu_version/master/platform/el7-amd64/src/lttng-tools/extras/bindings/swig/python/lttng.py", line 34, in _lttng = swig_import_helper() File "/home/jenkins/workspace/lttng-tools_master_elbuild/babeltrace_version/stable-2.0/build/std/conf/std/liburcu_version/master/platform/el7-amd64/src/lttng-tools/extras/bindings/swig/python/lttng.py", line 26, in swig_import_helper import _lttng ImportError: /home/jenkins/workspace/lttng-tools_master_elbuild/babeltrace_version/stable-2.0/build/std/conf/std/liburcu_version/master/platform/el7-amd64/src/lttng-tools/extras/bindings/swig/python/.libs/_lttng.so: undefined symbol: _ZNSt13runtime_errorC2EPKc ERROR: ust/exit-fast/test_exit-fast - missing test plan ``` The link mode can be seen the commands use to do the linking in the CI node build logs. For example, ``` libtool: link: gcc -shared -fPIC -DPIC .libs/lttng_wrap.o -Wl,--whole-archive ../../../../src/common/.libs/libsessiond-comm.a ../../../../src/common/.libs/libcommon-gpl.a -Wl,--no-whole-archive -Wl,-rpath -Wl,/home/jenkins/workspace/lttng-tools_master_elbuild/babeltrace_version/stable-2.0/build/std/conf/std/liburcu_version/master/platform/el8-amd64/src/lttng-tools/src/lib/lttng-ctl/.libs -Wl,-rpath -Wl,/build/lib64 -L/home/jenkins/workspace/lttng-tools_master_elbuild/babeltrace_version/stable-2.0/build/std/conf/std/liburcu_version/master/platform/el8-amd64/deps/build/lib64 ../../../../src/lib/lttng-ctl/.libs/liblttng-ctl.so -lxml2 -L/build/lib64 -lurcu -lurcu-common -lurcu-cds -lrt -pthread -g -O2 -pthread -Wl,-soname -Wl,_lttng.so.0 -o .libs/_lttng.so.0.0.0 ``` Cause ===== Automake chooses the link mode based on the types of files in the library or executable. Given that the generated bindings are only C code, automake uses the gcc link mode. Solution ======== By adding a dummy (non existant) C++ source file to the library, automake can be 'forced' to the switch the link mode to `g++`. Example link command in `g++` mode: ``` libtool: link: g++-10 -std=gnu++11 -fPIC -DPIC -shared -nostdlib /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/10/crtbeginS.o .libs/lttng_wrap.o -Wl,--whole-archive ../../../../src/common/.libs/libsessiond-comm.a ../../../../src/common/.libs/libcommon-gpl.a -Wl,--no-whole-archive -Wl,-rpath -Wl,/home/kstewart/src/efficios/lttng/master/src/lttng-tools/src/lib/lttng-ctl/.libs -Wl,-rpath -Wl,/home/kstewart/src/efficios/lttng/master/usr/lib -Wl,-rpath -Wl,/home/kstewart/src/efficios/lttng/master/usr/lib ../../../../src/lib/lttng-ctl/.libs/liblttng-ctl.so -lxml2 -L/home/kstewart/src/efficios/lttng/master/usr/lib /home/kstewart/src/efficios/lttng/master/usr/lib/liburcu.so /home/kstewart/src/efficios/lttng/master/usr/lib/liburcu-cds.so /home/kstewart/src/efficios/lttng/master/usr/lib/liburcu-common.so -lrt -L/usr/lib/gcc/x86_64-linux-gnu/10 -L/usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/10/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/10/../../.. -lstdc++ -lm -lc -lgcc_s /usr/lib/gcc/x86_64-linux-gnu/10/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/crtn.o -g -O2 -fuse-ld=lld -pthread -Wl,-soname -Wl,_lttng.so.0 -o .libs/_lttng.so.0.0.0 ``` Known drawbacks =============== None. Change-Id: I5f1dedec435089518e36cc12cd09c2bb151adb67 Signed-off-by: Kienan Stewart Signed-off-by: Jérémie Galarneau --- diff --git a/extras/bindings/swig/python/Makefile.am b/extras/bindings/swig/python/Makefile.am index 5d9bcc127..d9cdd680d 100644 --- a/extras/bindings/swig/python/Makefile.am +++ b/extras/bindings/swig/python/Makefile.am @@ -34,6 +34,11 @@ _lttng_la_LIBADD = $(top_builddir)/src/lib/lttng-ctl/liblttng-ctl.la \ $(top_builddir)/src/common/libsessiond-comm.la \ $(top_builddir)/src/common/libcommon-gpl.la +# Use this fake source file to force the link mode of the library +# from gcc to g++. The library contains only C code, but depends on +# libstdc++. +nodist_EXTRA__lttng_la_SOURCES = dummy.cpp + lttng_wrap.c: lttng.i $(SWIG) -python -I. -I$(top_srcdir)/src/common/sessiond-comm lttng.i