mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-12 23:09:45 +03:00
test: py: LD_PRELOAD the C++ standard library when using ASan
When the ASan runtime is linked using --as-needed, its dependency on the C++ standard library is stripped. This results to a failure to properly handled exceptions when a C++ dynamically loaded .so is used, as in the Python unit tests that load the libcamera Python module: AddressSanitizer: CHECK failed: asan_interceptors.cpp:335 "((__interception::real___cxa_throw)) != (0)" (0x0, 0x0) (tid=32679) #0 0x7fa2f32e6c19 in CheckUnwind /var/tmp/portage/sys-devel/gcc-13.3.1_p20241025/work/gcc-13-20241025/libsanitizer/asan/asan_rtl.cpp:69 #1 0x7fa2f330c9fd in __sanitizer::CheckFailed(char const*, int, char const*, unsigned long long, unsigned long long) /var/tmp/portage/sys-devel/gcc-13.3.1_p20241025/work/gcc-13-20241025/libsanitizer/sanitizer_common/sanitizer_termination.cpp:86 #2 0x7fa2f3247824 in __interceptor___cxa_throw /var/tmp/portage/sys-devel/gcc-13.3.1_p20241025/work/gcc-13-20241025/libsanitizer/asan/asan_interceptors.cpp:335 #3 0x7fa2f3247824 in __interceptor___cxa_throw /var/tmp/portage/sys-devel/gcc-13.3.1_p20241025/work/gcc-13-20241025/libsanitizer/asan/asan_interceptors.cpp:334 #4 0x7fa2efb6da8b in operator() ../../src/py/libcamera/py_main.cpp:157 [...] The issue has been reported in [1] and so far remains unfixed. Work around it by preloading the C++ standard library. [1] https://github.com/google/sanitizers/issues/934 Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
b3eba17213
commit
f326eb4bf2
2 changed files with 9 additions and 0 deletions
|
@ -112,6 +112,8 @@ common_arguments = [
|
||||||
c_arguments = []
|
c_arguments = []
|
||||||
cpp_arguments = []
|
cpp_arguments = []
|
||||||
|
|
||||||
|
cxx_stdlib = 'libstdc++'
|
||||||
|
|
||||||
if cc.get_id() == 'clang'
|
if cc.get_id() == 'clang'
|
||||||
if cc.version().version_compare('<9')
|
if cc.version().version_compare('<9')
|
||||||
error('clang version is too old, libcamera requires 9.0 or newer')
|
error('clang version is too old, libcamera requires 9.0 or newer')
|
||||||
|
@ -137,6 +139,7 @@ if cc.get_id() == 'clang'
|
||||||
cpp_arguments += [
|
cpp_arguments += [
|
||||||
'-stdlib=libc++',
|
'-stdlib=libc++',
|
||||||
]
|
]
|
||||||
|
cxx_stdlib = 'libc++'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
cpp_arguments += [
|
cpp_arguments += [
|
||||||
|
|
|
@ -24,6 +24,12 @@ py_env.append('PYTHONPATH', pypathdir)
|
||||||
if asan_enabled
|
if asan_enabled
|
||||||
py_env.append('LD_PRELOAD', asan_runtime)
|
py_env.append('LD_PRELOAD', asan_runtime)
|
||||||
|
|
||||||
|
# Preload the C++ standard library to work around a bug in ASan when
|
||||||
|
# dynamically loading C++ .so modules.
|
||||||
|
stdlib = run_command(cxx, '-print-file-name=' + cxx_stdlib + '.so',
|
||||||
|
check : true).stdout().strip()
|
||||||
|
py_env.append('LD_PRELOAD', stdlib)
|
||||||
|
|
||||||
# Disable leak detection as the Python interpreter is full of leaks.
|
# Disable leak detection as the Python interpreter is full of leaks.
|
||||||
py_env.append('ASAN_OPTIONS', 'detect_leaks=0')
|
py_env.append('ASAN_OPTIONS', 'detect_leaks=0')
|
||||||
endif
|
endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue