diff --git a/math/Versions b/math/Versions
index 87aa6590ed..a887602f2f 100644
--- a/math/Versions
+++ b/math/Versions
@@ -577,6 +577,6 @@ libm {
   }
   GLIBC_2.29 {
     # No SVID compatible error handling.
-    exp; exp2; log;
+    exp; exp2; log; log2;
   }
 }
diff --git a/math/w_log2.c b/math/w_log2.c
new file mode 100644
index 0000000000..148d5d48e1
--- /dev/null
+++ b/math/w_log2.c
@@ -0,0 +1,8 @@
+#include <math-type-macros-double.h>
+#undef __USE_WRAPPER_TEMPLATE
+#define __USE_WRAPPER_TEMPLATE 1
+#undef declare_mgen_alias
+#define declare_mgen_alias(a, b)
+#include <w_log2_template.c>
+versioned_symbol (libm, __log2, log2, GLIBC_2_29);
+libm_alias_double_other (__log2, log2)
diff --git a/math/w_log2_compat.c b/math/w_log2_compat.c
index 61e7170ae1..4459ce275f 100644
--- a/math/w_log2_compat.c
+++ b/math/w_log2_compat.c
@@ -23,10 +23,12 @@
 #include <libm-alias-double.h>
 
 
-#if LIBM_SVID_COMPAT
+#if LIBM_SVID_COMPAT && (SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_29) \
+			 || defined NO_LONG_DOUBLE \
+			 || defined LONG_DOUBLE_COMPAT)
 /* wrapper log2(x) */
 double
-__log2 (double x)
+__log2_compat (double x)
 {
   if (__builtin_expect (islessequal (x, 0.0), 0) && _LIB_VERSION != _IEEE_)
     {
@@ -44,5 +46,17 @@ __log2 (double x)
 
   return  __ieee754_log2 (x);
 }
-libm_alias_double (__log2, log2)
+# if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_29)
+compat_symbol (libm, __log2_compat, log2, GLIBC_2_1);
+# endif
+# ifdef NO_LONG_DOUBLE
+weak_alias (__log2_compat, log2l)
+# endif
+# ifdef LONG_DOUBLE_COMPAT
+/* Work around gas bug "multiple versions for symbol".  */
+weak_alias (__log2_compat, __log2_compat_alias)
+
+LONG_DOUBLE_COMPAT_CHOOSE_libm_log2l (
+  compat_symbol (libm, __log2_compat_alias, log2l, FIRST_VERSION_libm_log2l), );
+# endif
 #endif
diff --git a/sysdeps/i386/fpu/w_log2.c b/sysdeps/i386/fpu/w_log2.c
new file mode 100644
index 0000000000..eafbe5cf3e
--- /dev/null
+++ b/sysdeps/i386/fpu/w_log2.c
@@ -0,0 +1 @@
+#include <sysdeps/../math/w_log2.c>
diff --git a/sysdeps/ia64/fpu/e_log2.S b/sysdeps/ia64/fpu/e_log2.S
index 17893a2ede..eecd72a63a 100644
--- a/sysdeps/ia64/fpu/e_log2.S
+++ b/sysdeps/ia64/fpu/e_log2.S
@@ -385,7 +385,7 @@ LOCAL_OBJECT_END(T_table)
 
 
 .section .text
-GLOBAL_LIBM_ENTRY(log2)
+WEAK_LIBM_ENTRY(log2)
 
 { .mfi
   alloc r32=ar.pfs,1,4,4,0
@@ -653,8 +653,14 @@ SPECIAL_LOG2:
   br.ret.sptk b0;;
 }
 
-GLOBAL_LIBM_END(log2)
-libm_alias_double_other (log2, log2)
+WEAK_LIBM_END(log2)
+libm_alias_double_other (__log2, log2)
+#ifdef SHARED
+.symver log2,log2@@GLIBC_2.29
+.weak __log2_compat
+.set __log2_compat,__log2
+.symver __log2_compat,log2@GLIBC_2.2
+#endif
 
 
 LOCAL_LIBM_ENTRY(__libm_error_region)
diff --git a/sysdeps/ieee754/dbl-64/e_log2.c b/sysdeps/ieee754/dbl-64/e_log2.c
index 916eb466f8..6bb1c05d99 100644
--- a/sysdeps/ieee754/dbl-64/e_log2.c
+++ b/sysdeps/ieee754/dbl-64/e_log2.c
@@ -18,6 +18,9 @@
 
 #include <math.h>
 #include <stdint.h>
+#include <math-svid-compat.h>
+#include <shlib-compat.h>
+#include <libm-alias-double.h>
 #include "math_config.h"
 
 #define T __log2_data.tab
@@ -37,7 +40,7 @@ top16 (double x)
 }
 
 double
-__ieee754_log2 (double x)
+__log2 (double x)
 {
   /* double_t for better performance on targets with FLT_EVAL_METHOD==2.  */
   double_t z, r, r2, r4, y, invc, logc, kd, hi, lo, t1, t2, t3, p;
@@ -136,6 +139,13 @@ __ieee754_log2 (double x)
   y = lo + r2 * p + hi;
   return y;
 }
-#ifndef __ieee754_log2
-strong_alias (__ieee754_log2, __log2_finite)
+#ifndef __log2
+strong_alias (__log2, __ieee754_log2)
+strong_alias (__log2, __log2_finite)
+# if LIBM_SVID_COMPAT
+versioned_symbol (libm, __log2, log2, GLIBC_2_29);
+libm_alias_double_other (__log2, log2)
+# else
+libm_alias_double (__log2, log2)
+# endif
 #endif
diff --git a/sysdeps/ieee754/dbl-64/w_log2.c b/sysdeps/ieee754/dbl-64/w_log2.c
new file mode 100644
index 0000000000..1cc8931700
--- /dev/null
+++ b/sysdeps/ieee754/dbl-64/w_log2.c
@@ -0,0 +1 @@
+/* Not needed.  */
diff --git a/sysdeps/m68k/m680x0/fpu/w_log2.c b/sysdeps/m68k/m680x0/fpu/w_log2.c
new file mode 100644
index 0000000000..eafbe5cf3e
--- /dev/null
+++ b/sysdeps/m68k/m680x0/fpu/w_log2.c
@@ -0,0 +1 @@
+#include <sysdeps/../math/w_log2.c>
diff --git a/sysdeps/mach/hurd/i386/libm.abilist b/sysdeps/mach/hurd/i386/libm.abilist
index 144bdb9cac..f319580964 100644
--- a/sysdeps/mach/hurd/i386/libm.abilist
+++ b/sysdeps/mach/hurd/i386/libm.abilist
@@ -1071,3 +1071,4 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
diff --git a/sysdeps/unix/sysv/linux/aarch64/libm.abilist b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
index 6785ac6aa2..c01ff24dfe 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
@@ -1035,3 +1035,4 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
diff --git a/sysdeps/unix/sysv/linux/alpha/libm.abilist b/sysdeps/unix/sysv/linux/alpha/libm.abilist
index 132ea00288..f5ec8742dc 100644
--- a/sysdeps/unix/sysv/linux/alpha/libm.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libm.abilist
@@ -1046,6 +1046,7 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
 GLIBC_2.3.4 __c1_cabsf F
 GLIBC_2.3.4 __c1_cacosf F
 GLIBC_2.3.4 __c1_cacoshf F
diff --git a/sysdeps/unix/sysv/linux/arm/libm.abilist b/sysdeps/unix/sysv/linux/arm/libm.abilist
index 45a233785d..9b7d87b329 100644
--- a/sysdeps/unix/sysv/linux/arm/libm.abilist
+++ b/sysdeps/unix/sysv/linux/arm/libm.abilist
@@ -456,6 +456,7 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
 GLIBC_2.4 _LIB_VERSION D 0x4
 GLIBC_2.4 __clog10 F
 GLIBC_2.4 __clog10f F
diff --git a/sysdeps/unix/sysv/linux/hppa/libm.abilist b/sysdeps/unix/sysv/linux/hppa/libm.abilist
index b0689ff6c5..d193f99561 100644
--- a/sysdeps/unix/sysv/linux/hppa/libm.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libm.abilist
@@ -767,4 +767,5 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
 GLIBC_2.4 exp2l F
diff --git a/sysdeps/unix/sysv/linux/i386/libm.abilist b/sysdeps/unix/sysv/linux/i386/libm.abilist
index 3afd304881..eae2c55d38 100644
--- a/sysdeps/unix/sysv/linux/i386/libm.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libm.abilist
@@ -1078,3 +1078,4 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
diff --git a/sysdeps/unix/sysv/linux/ia64/libm.abilist b/sysdeps/unix/sysv/linux/ia64/libm.abilist
index 637fd150c2..9796e8d37b 100644
--- a/sysdeps/unix/sysv/linux/ia64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libm.abilist
@@ -1008,3 +1008,4 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
index 45a233785d..9b7d87b329 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
@@ -456,6 +456,7 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
 GLIBC_2.4 _LIB_VERSION D 0x4
 GLIBC_2.4 __clog10 F
 GLIBC_2.4 __clog10f F
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
index b1689c2e65..f73ad1a35c 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
@@ -807,3 +807,4 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
diff --git a/sysdeps/unix/sysv/linux/microblaze/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/libm.abilist
index ae59dfbd66..dcb7dbba91 100644
--- a/sysdeps/unix/sysv/linux/microblaze/libm.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/libm.abilist
@@ -768,3 +768,4 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
index 38c665147a..1146e2d6fd 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
@@ -767,4 +767,5 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
 GLIBC_2.4 exp2l F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
index 09777c71c7..d9c830da42 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
@@ -1035,3 +1035,4 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
diff --git a/sysdeps/unix/sysv/linux/nios2/libm.abilist b/sysdeps/unix/sysv/linux/nios2/libm.abilist
index 59fc049b86..0902ca01f2 100644
--- a/sysdeps/unix/sysv/linux/nios2/libm.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libm.abilist
@@ -768,3 +768,4 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
index 7788f76e81..3e9e5e75fd 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
@@ -813,6 +813,7 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
 GLIBC_2.4 __fpclassifyl F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
index cae3604a00..7a3c6be1f4 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
@@ -812,6 +812,7 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
 GLIBC_2.4 __fpclassifyl F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
index 732825e015..d50c82c7c8 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
@@ -1079,3 +1079,4 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
index 59f083dda7..cbf2ad3ca6 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
@@ -491,6 +491,7 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
 GLIBC_2.3 _LIB_VERSION D 0x4
 GLIBC_2.3 __clog10 F
 GLIBC_2.3 __clog10f F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
index 5a68b2701b..382455c9cf 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
@@ -1036,6 +1036,7 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
 GLIBC_2.4 __fpclassifyl F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
index 364f7e63d4..92b794bf12 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
@@ -1036,6 +1036,7 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
 GLIBC_2.4 __fpclassifyl F
diff --git a/sysdeps/unix/sysv/linux/sh/libm.abilist b/sysdeps/unix/sysv/linux/sh/libm.abilist
index 489f34db57..3320f1403a 100644
--- a/sysdeps/unix/sysv/linux/sh/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sh/libm.abilist
@@ -767,4 +767,5 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
 GLIBC_2.4 exp2l F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
index 288986f228..2a10a0ffb9 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
@@ -1043,6 +1043,7 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
 GLIBC_2.4 __fpclassifyl F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
index 11fb7e4597..ebbc58da91 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
@@ -1035,3 +1035,4 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
index 9fd399d31a..3e02619df9 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
@@ -1069,3 +1069,4 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
index bbea57551d..03cd62fd6f 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
@@ -1069,3 +1069,4 @@ GLIBC_2.28 fsubl F
 GLIBC_2.29 exp F
 GLIBC_2.29 exp2 F
 GLIBC_2.29 log F
+GLIBC_2.29 log2 F
