From 20e72ae0d0545c356ef1dba18767102b0984fcd7 Mon Sep 17 00:00:00 2001 From: Geza Lore Date: Mon, 8 Jun 2026 11:55:38 +0100 Subject: [PATCH] Configure: Fall back on dynamic malloc libraries if static not available (#7736) When configured with --enable-partial-static (default on), only the availability of static libraries were checked. Some platform only package dynamic libs. If the static library is not found, fall back on trying the dynamic one. --- configure.ac | 93 ++++++++++++++++++++++++++++------------------------ 1 file changed, 51 insertions(+), 42 deletions(-) diff --git a/configure.ac b/configure.ac index 2cc95c267..6917f0c4b 100644 --- a/configure.ac +++ b/configure.ac @@ -421,6 +421,15 @@ AC_DEFUN([_MY_LDLIBS_CHECK_OPT], _MY_LDLIBS_CHECK_IFELSE($2, $1="$$1 $2") ]) +AC_DEFUN([_MY_LDLIBS_CHECK_SET], + [# _MY_LDLIBS_CHECK_SET(variable, flag) -- Check if linker supports specific + # options. If it does, set variable to flag, only if not previously set + # (so the first supported flag wins and the rest are not tested). + if test "$$1" = ""; then + _MY_LDLIBS_CHECK_IFELSE($2, $1="$2") + fi + ]) + # Add the coverage flags early as they influence later checks. if test "$CFG_WITH_DEV_GCOV" = "yes"; then _MY_CXX_CHECK_OPT(CXX,--coverage) @@ -589,11 +598,6 @@ if test "$CFG_ENABLE_PARTIAL_STATIC" = "yes"; then _MY_LDLIBS_CHECK_OPT(CFG_LDFLAGS_SRC, -static-libgcc) _MY_LDLIBS_CHECK_OPT(CFG_LDFLAGS_SRC, -static-libstdc++) _MY_LDLIBS_CHECK_OPT(CFG_LDFLAGS_SRC, -Xlinker -gc-sections) - LTCMALLOC="-Wl,--whole-archive -l:libtcmalloc_minimal.a -Wl,--no-whole-archive" - LJEMALLOC="-Wl,--whole-archive -l:libjemalloc.a -Wl,--no-whole-archive" -else - LTCMALLOC=-ltcmalloc_minimal - LJEMALLOC=-ljemalloc fi AC_SUBST(CFG_LDFLAGS_SRC) AC_SUBST(CFG_LDFLAGS_VERILATED) @@ -609,51 +613,56 @@ _MY_LDLIBS_CHECK_OPT(CFG_LIBS, -latomic) _MY_LDLIBS_CHECK_OPT(CFG_LIBS, -lbcrypt) _MY_LDLIBS_CHECK_OPT(CFG_LIBS, -lpsapi) -# Check if jemalloc is available based on --enable-jemalloc -# jemalloc is preferred over tcmalloc when both are available +# Figure out which malloc library to use: +# - Prefer jemalloc over tcmalloc (it's faster) +# - If partial static link enabled, prefer static libraries, +# but fall back on dynamic if static is not available + +# Test for jemalloc CFG_HAVE_JEMALLOC=no -_MY_LDLIBS_CHECK_IFELSE( - $LJEMALLOC, - [if test "$CFG_WITH_JEMALLOC" != "no"; then - CFG_LIBS="$LJEMALLOC $CFG_LIBS"; - CFG_HAVE_JEMALLOC=yes; - # If using jemalloc, add some extra options to make the compiler not assume - # it is using its own versions of the standard library functions - _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-fno-builtin-malloc) - _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-fno-builtin-calloc) - _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-fno-builtin-realloc) - _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-fno-builtin-free) +if test "$CFG_WITH_JEMALLOC" != "no"; then + if test "$CFG_ENABLE_PARTIAL_STATIC" = "yes"; then + _MY_LDLIBS_CHECK_SET(CFG_LIBS_MALLOC, -Xlinker --whole-archive -l:libjemalloc.a -Xlinker --no-whole-archive) + fi + _MY_LDLIBS_CHECK_SET(CFG_LIBS_MALLOC, -ljemalloc) + if test "$CFG_LIBS_MALLOC" != ""; then + CFG_HAVE_JEMALLOC=yes AC_DEFINE([HAVE_JEMALLOC],[1],[Defined if have jemalloc]) - fi], - [if test "$CFG_WITH_JEMALLOC" = "yes"; then - AC_MSG_ERROR([--enable-jemalloc was given but test for ${LJEMALLOC} failed]) - fi]) + elif test "$CFG_WITH_JEMALLOC" = "yes"; then + AC_MSG_ERROR([--enable-jemalloc was given but jemalloc is not available]) + fi +fi AC_SUBST(HAVE_JEMALLOC) -# Check if tcmalloc is available based on --enable-tcmalloc -# Only use tcmalloc if jemalloc was not found/enabled -if test "$CFG_HAVE_JEMALLOC" = "yes"; then - AC_MSG_NOTICE([jemalloc found, skipping tcmalloc check]) -else +# Test for tcmalloc CFG_HAVE_TCMALLOC=no -_MY_LDLIBS_CHECK_IFELSE( - $LTCMALLOC, - [if test "$CFG_WITH_TCMALLOC" != "no"; then - CFG_LIBS="$LTCMALLOC $CFG_LIBS"; - CFG_HAVE_TCMALLOC=yes; - # If using tcmalloc, add some extra options to make the compiler not assume - # it is using its own versions of the standard library functions - _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-fno-builtin-malloc) - _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-fno-builtin-calloc) - _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-fno-builtin-realloc) - _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-fno-builtin-free) +if test "$CFG_HAVE_JEMALLOC" = "yes"; then + AC_MSG_NOTICE([jemalloc found, skipping check for tcmalloc]) +elif test "$CFG_WITH_TCMALLOC" != "no"; then + if test "$CFG_ENABLE_PARTIAL_STATIC" = "yes"; then + _MY_LDLIBS_CHECK_SET(CFG_LIBS_MALLOC, -Xlinker --whole-archive -l:libtcmalloc_minimal.a -Xlinker --no-whole-archive) + fi + _MY_LDLIBS_CHECK_SET(CFG_LIBS_MALLOC, -ltcmalloc_minimal) + if test "$CFG_LIBS_MALLOC" != ""; then + CFG_HAVE_TCMALLOC=yes AC_DEFINE([HAVE_TCMALLOC],[1],[Defined if have tcmalloc]) - fi], - [if test "$CFG_WITH_TCMALLOC" = "yes"; then - AC_MSG_ERROR([--enable-tcmalloc was given but test for ${LTCMALLOC} failed]) - fi]) + elif test "$CFG_WITH_TCMALLOC" = "yes"; then + AC_MSG_ERROR([--enable-tcmalloc was given but tcmalloc is not available]) + fi fi AC_SUBST(HAVE_TCMALLOC) + +if test "$CFG_HAVE_JEMALLOC" = "yes" || test "$CFG_HAVE_TCMALLOC" = "yes"; then + # If using custom malloc, add some extra options to make the compiler not assume + # it is using its own versions of the standard library functions + _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-fno-builtin-malloc) + _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-fno-builtin-calloc) + _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-fno-builtin-realloc) + _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-fno-builtin-free) +fi + +# Finished with libraries +CFG_LIBS="$CFG_LIBS_MALLOC $CFG_LIBS" AC_SUBST(CFG_LIBS) # Need C++14 at least