From 87b1dc93005d1ce02f19fb3d9431382f917cd829 Mon Sep 17 00:00:00 2001 From: Dakoda Greaves Date: Thu, 1 Dec 2022 16:55:03 -0800 Subject: [PATCH] compat: add interface overrides for libm wraps pow.3 exp.3 and log.3 to explicitly use backward compatible glibc symbols. this is needed to stay compatible with old linux versions with minor releases --- configure.ac | 3 +++ src/compat/glibc_compat.cpp | 42 +++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/configure.ac b/configure.ac index c4cc779e1..e44c22f95 100644 --- a/configure.ac +++ b/configure.ac @@ -504,7 +504,10 @@ if test x$use_glibc_compat != xno; then AC_MSG_RESULT($fdelt_type) AC_DEFINE_UNQUOTED(FDELT_TYPE, $fdelt_type,[parameter and return value type for __fdelt_chk]) AX_CHECK_LINK_FLAG([[-Wl,--wrap=__divmoddi4]], [COMPAT_LDFLAGS="$COMPAT_LDFLAGS -Wl,--wrap=__divmoddi4"]) + AX_CHECK_LINK_FLAG([[-Wl,--wrap=exp]], [COMPAT_LDFLAGS="$COMPAT_LDFLAGS -Wl,--wrap=exp"]) + AX_CHECK_LINK_FLAG([[-Wl,--wrap=log]], [COMPAT_LDFLAGS="$COMPAT_LDFLAGS -Wl,--wrap=log"]) AX_CHECK_LINK_FLAG([[-Wl,--wrap=log2f]], [COMPAT_LDFLAGS="$COMPAT_LDFLAGS -Wl,--wrap=log2f"]) + AX_CHECK_LINK_FLAG([[-Wl,--wrap=pow]], [COMPAT_LDFLAGS="$COMPAT_LDFLAGS -Wl,--wrap=pow"]) else AC_SEARCH_LIBS([clock_gettime],[rt]) fi diff --git a/src/compat/glibc_compat.cpp b/src/compat/glibc_compat.cpp index fc3aa6d52..a29b91ec7 100644 --- a/src/compat/glibc_compat.cpp +++ b/src/compat/glibc_compat.cpp @@ -73,3 +73,45 @@ extern "C" float __wrap_log2f(float x) { return log2f_old(x); } + +extern "C" double exp_old(double x); +#ifdef __i386__ +__asm(".symver exp_old,exp@GLIBC_2.0"); +#elif defined(__amd64__) +__asm(".symver exp_old,exp@GLIBC_2.2.5"); +#elif defined(__arm__) +__asm(".symver exp_old,exp@GLIBC_2.4"); +#elif defined(__aarch64__) +__asm(".symver exp_old,exp@GLIBC_2.17"); +#endif +extern "C" double __wrap_exp(double x) { + return exp_old(x); +} + +extern "C" double log_old(double x); +#ifdef __i386__ +__asm(".symver log_old,log@GLIBC_2.0"); +#elif defined(__amd64__) +__asm(".symver log_old,log@GLIBC_2.2.5"); +#elif defined(__arm__) +__asm(".symver log_old,log@GLIBC_2.4"); +#elif defined(__aarch64__) +__asm(".symver log_old,log@GLIBC_2.17"); +#endif +extern "C" double __wrap_log(double x) { + return log_old(x); +} + +extern "C" double pow_old(double x, double y); +#ifdef __i386__ +__asm(".symver pow_old,pow@GLIBC_2.0"); +#elif defined(__amd64__) +__asm(".symver pow_old,pow@GLIBC_2.2.5"); +#elif defined(__arm__) +__asm(".symver pow_old,pow@GLIBC_2.4"); +#elif defined(__aarch64__) +__asm(".symver pow_old,pow@GLIBC_2.17"); +#endif +extern "C" double __wrap_pow(double x, double y) { + return pow_old(x,y); +}