From d730280c0266bb128848c0663c7ea6d41606dcdd Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 13 Sep 2022 10:34:41 +0200 Subject: [PATCH] Fix compilation on Linux, glibc 2.34, and CentOS libraries A continuation of previous fix for malloc hooks which got removed from the new glibc library. The pre-compiled jemalloc has definitions which interpose hooks in glibc leading to linking errors with multiple hook definitions. A simple fix is to skip doing the workaround when using jemalloc from pre-compiled libraries. This will likely be revisited in the future, but for now it is important to fix compilation errors for developers. --- build_files/cmake/platform/platform_unix.cmake | 7 +++++++ intern/libc_compat/CMakeLists.txt | 6 ++++++ intern/libc_compat/libc_compat.c | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake index 7791112c6ab..b3ddd5f8087 100644 --- a/build_files/cmake/platform/platform_unix.cmake +++ b/build_files/cmake/platform/platform_unix.cmake @@ -33,9 +33,16 @@ if(NOT DEFINED LIBDIR) # Choose the best suitable libraries. if(EXISTS ${LIBDIR_NATIVE_ABI}) set(LIBDIR ${LIBDIR_NATIVE_ABI}) + set(WITH_LIBC_MALLOC_HOOK_WORKAROUND True) elseif(EXISTS ${LIBDIR_CENTOS7_ABI}) set(LIBDIR ${LIBDIR_CENTOS7_ABI}) set(WITH_CXX11_ABI OFF) + if(WITH_MEM_JEMALLOC) + # jemalloc provides malloc hooks. + set(WITH_LIBC_MALLOC_HOOK_WORKAROUND False) + else() + set(WITH_LIBC_MALLOC_HOOK_WORKAROUND True) + endif() if(CMAKE_COMPILER_IS_GNUCC AND CMAKE_C_COMPILER_VERSION VERSION_LESS 9.3) diff --git a/intern/libc_compat/CMakeLists.txt b/intern/libc_compat/CMakeLists.txt index f8fede5673b..e691dc825d9 100644 --- a/intern/libc_compat/CMakeLists.txt +++ b/intern/libc_compat/CMakeLists.txt @@ -35,3 +35,9 @@ set(LIB add_c_flag(-ffast-math) blender_add_lib(bf_intern_libc_compat "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") + +if(WITH_LIBC_MALLOC_HOOK_WORKAROUND) + target_compile_definitions(bf_intern_libc_compat + PRIVATE WITH_LIBC_MALLOC_HOOK_WORKAROUND + ) +endif() diff --git a/intern/libc_compat/libc_compat.c b/intern/libc_compat/libc_compat.c index c160db4e584..12ce0deb660 100644 --- a/intern/libc_compat/libc_compat.c +++ b/intern/libc_compat/libc_compat.c @@ -128,7 +128,7 @@ float __powf_finite(float x, float y) # endif /* __GLIBC_PREREQ(2, 31) */ -# if __GLIBC_PREREQ(2, 34) +# if __GLIBC_PREREQ(2, 34) && defined(WITH_LIBC_MALLOC_HOOK_WORKAROUND) void *(*__malloc_hook)(size_t __size, const void *) = NULL; void *(*__realloc_hook)(void *__ptr, size_t __size, const void *) = NULL;