From 41d778fbfbee6e97c6ac355938086b30a8b29f56 Mon Sep 17 00:00:00 2001 From: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> Date: Tue, 6 Dec 2022 17:20:37 -0800 Subject: dlsym pow --- src/bun.js/bindings/glibc-versions-hack.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'src/bun.js/bindings/glibc-versions-hack.cpp') diff --git a/src/bun.js/bindings/glibc-versions-hack.cpp b/src/bun.js/bindings/glibc-versions-hack.cpp index 345321b94..73b096011 100644 --- a/src/bun.js/bindings/glibc-versions-hack.cpp +++ b/src/bun.js/bindings/glibc-versions-hack.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #ifndef _STAT_VER #if defined(__aarch64__) @@ -34,7 +35,6 @@ extern "C" int __wrap_statx(int fd, const char* path, int flags, } extern "C" int __real_fcntl(int fd, int cmd, ...); -extern "C" double __real_pow(double x, double y); extern "C" double __real_exp(double x); extern "C" double __real_log(double x); @@ -54,13 +54,14 @@ extern "C" int __wrap_fcntl64(int fd, int cmd, ...) va_end(va); } -// I couldn't figure out what has changed in pow, exp, log in glibc 2.29. -// Interestingly despite compiling with -fno-omit-frame-pointer, GCC -// optimises the following to a jmp anyway. - extern "C" double __wrap_pow(double x, double y) { - return __real_pow(x, y); + static void* pow_ptr = nullptr; + if (UNLIKELY(pow_ptr == nullptr)) { + pow_ptr = dlsym(RTLD_DEFAULT, "pow"); + } + + return ((double (*)(double, double))pow_ptr)(x, y); } extern "C" double __wrap_exp(double x) -- cgit v1.2.3