about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog125
-rw-r--r--NEWS6
-rw-r--r--conform/linknamespace.pl4
-rw-r--r--include/math.h2
-rw-r--r--math/Makefile24
-rw-r--r--math/Versions7
-rw-r--r--math/lgamma-compat.h73
-rw-r--r--math/test-signgam-main.c71
-rw-r--r--math/test-signgam-uchar-init-static.c1
-rw-r--r--math/test-signgam-uchar-init.c3
-rw-r--r--math/test-signgam-uchar-static.c1
-rw-r--r--math/test-signgam-uchar.c3
-rw-r--r--math/test-signgam-uint-init-static.c1
-rw-r--r--math/test-signgam-uint-init.c3
-rw-r--r--math/test-signgam-uint-static.c1
-rw-r--r--math/test-signgam-uint.c3
-rw-r--r--math/test-signgam-ullong-init-static.c1
-rw-r--r--math/test-signgam-ullong-init.c3
-rw-r--r--math/test-signgam-ullong-static.c1
-rw-r--r--math/test-signgam-ullong.c3
-rw-r--r--math/w_lgamma.c51
-rw-r--r--math/w_lgamma_compat.c2
-rw-r--r--math/w_lgamma_compatf.c2
-rw-r--r--math/w_lgamma_compatl.c2
-rw-r--r--math/w_lgamma_main.c59
-rw-r--r--math/w_lgammaf.c42
-rw-r--r--math/w_lgammaf_main.c44
-rw-r--r--math/w_lgammal.c49
-rw-r--r--math/w_lgammal_main.c51
-rw-r--r--sysdeps/ia64/fpu/lgamma-compat.h42
-rw-r--r--sysdeps/ia64/fpu/w_lgamma_main.c (renamed from sysdeps/ia64/fpu/w_lgamma.c)27
-rw-r--r--sysdeps/ia64/fpu/w_lgammaf_main.c (renamed from sysdeps/ia64/fpu/w_lgammaf.c)25
-rw-r--r--sysdeps/ia64/fpu/w_lgammal_main.c (renamed from sysdeps/ia64/fpu/w_lgammal.c)25
-rw-r--r--sysdeps/ieee754/ldbl-opt/w_lgamma.c6
-rw-r--r--sysdeps/ieee754/ldbl-opt/w_lgamma_compat.c7
-rw-r--r--sysdeps/ieee754/ldbl-opt/w_lgamma_compatl.c11
-rw-r--r--sysdeps/ieee754/ldbl-opt/w_lgammal.c6
-rw-r--r--sysdeps/ieee754/s_signgam.c3
-rw-r--r--sysdeps/nacl/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/aarch64/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/alpha/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/arm/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/hppa/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/i386/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/ia64/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/microblaze/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips64/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/nios2/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/sh/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/64/libm.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist5
65 files changed, 721 insertions, 204 deletions
diff --git a/ChangeLog b/ChangeLog
index 4e12f20963..51818799ea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,128 @@
+2015-11-20  Joseph Myers  <joseph@codesourcery.com>
+
+	[BZ #15421]
+	* sysdeps/ieee754/s_signgam.c (signgam): Rename to __signgam,
+	initialize with 0 and define as weak alias of __signgam.
+	* include/math.h [!_ISOMAC] (__signgam): Declare.
+	* math/Makefile (libm-calls): Add w_lgamma_compat.
+	(tests): Add test-signgam-uchar, test-signgam-uchar-init,
+	test-signgam-uint, test-signgam-uint-init, test-signgam-ullong and
+	test-signgam-ullong-init.
+	(tests-static): Add test-signgam-uchar-static,
+	test-signgam-uchar-init-static, test-signgam-uint-static,
+	test-signgam-uint-init-static, test-signgam-ullong-static and
+	test-signgam-ullong-init-static.
+	(CFLAGS-test-signgam-uchar.c): New variable.
+	(CFLAGS-test-signgam-uchar-init.c): Likewise.
+	(CFLAGS-test-signgam-uchar-static.c): Likewise.
+	(CFLAGS-test-signgam-uchar-init-static.c): Likewise.
+	(CFLAGS-test-signgam-uint.c): Likewise.
+	(CFLAGS-test-signgam-uint-init.c): Likewise.
+	(CFLAGS-test-signgam-uint-static.c): Likewise.
+	(CFLAGS-test-signgam-uint-init-static.c): Likewise.
+	(CFLAGS-test-signgam-ullong.c): Likewise.
+	(CFLAGS-test-signgam-ullong-init.c): Likewise.
+	(CFLAGS-test-signgam-ullong-static.c): Likewise.
+	(CFLAGS-test-signgam-ullong-init-static.c): Likewise.
+	* math/Versions (libm): Add GLIBC_2.23.
+	* math/lgamma-compat.h: New file.
+	* math/test-signgam-main.c: Likewise.
+	* math/test-signgam-uchar-init-static.c: Likewise.
+	* math/test-signgam-uchar-init.c: Likewise.
+	* math/test-signgam-uchar-static.c: Likewise.
+	* math/test-signgam-uchar.c: Likewise.
+	* math/test-signgam-uint-init-static.c: Likewise.
+	* math/test-signgam-uint-init.c: Likewise.
+	* math/test-signgam-uint-static.c: Likewise.
+	* math/test-signgam-uint.c: Likewise.
+	* math/test-signgam-ullong-init-static.c: Likewise.
+	* math/test-signgam-ullong-init.c: Likewise.
+	* math/test-signgam-ullong-static.c: Likewise.
+	* math/test-signgam-ullong.c: Likewise.
+	* math/w_lgamma.c: Rename to w_lgamma_main.c and replace by
+	wrapper of w_lgamma_main.c.
+	* math/w_lgamma_compat.c: New file.
+	* math/w_lgamma_compatf.c: Likewise.
+	* math/w_lgamma_compatl.c: Likewise.
+	* math/w_lgamma_main.c: New file.  Based on w_lgamma.c.  Include
+	<lgamma-compat.h>.  Condition contents on [BUILD_LGAMMA].  Support
+	defining compatibility symbols.
+	(__lgamma): Change to LGFUNC (__lgamma).  Use CALL_LGAMMA.
+	* math/w_lgammaf.c: Rename to w_lgammaf_main.c and replace by
+	wrapper of w_lgammaf_main.c.
+	* math/w_lgammaf_main.c: New file.  Based on w_lgammaf.c.  Include
+	<lgamma-compat.h>.  Condition contents on [BUILD_LGAMMA].  Support
+	defining compatibility symbols.
+	(__lgammaf): Change to LGFUNC (__lgammaf).  Use CALL_LGAMMA.
+	* math/w_lgammal.c: Rename to w_lgammal_main.c and replace by
+	wrapper of w_lgammal_main.c.
+	* math/w_lgammal_main.c: New file.  Based on w_lgammal.c.  Include
+	<lgamma-compat.h>.  Condition contents on [BUILD_LGAMMA].  Support
+	defining compatibility symbols.
+	(__lgammal): Change to LGFUNC (__lgammal).  Use CALL_LGAMMA.
+	* sysdeps/ia64/fpu/lgamma-compat.h: New file.
+	* sysdeps/ia64/fpu/w_lgamma.c: Move to ....
+	* sysdeps/ia64/fpu/w_lgamma_main.c: ...here.  Include
+	<lgamma-compat.h>.
+	(__ieee754_lgamma): Change to LGFUNC (lgamma).  Use CALL_LGAMMA.
+	(__ieee754_gamma): Define as alias.
+	* sysdeps/ia64/fpu/w_lgammaf.c: Move to ....
+	* sysdeps/ia64/fpu/w_lgammaf_main.c: ...here.  Include
+	<lgamma-compat.h>.
+	(__ieee754_lgammaf): Change to LGFUNC (lgammaf).  Use CALL_LGAMMA.
+	(__ieee754_gammaf): Define as alias.
+	* sysdeps/ia64/fpu/w_lgammal.c: Move to ....
+	* sysdeps/ia64/fpu/w_lgammal_main.c: ...here.  Include
+	<lgamma-compat.h>.
+	(__ieee754_lgammal): Change to LGFUNC (lgammal).  Use CALL_LGAMMA.
+	(__ieee754_gammal): Define as alias.
+	* sysdeps/ieee754/ldbl-opt/w_lgamma.c: Move to ....
+	* sysdeps/ieee754/ldbl-opt/w_lgamma_compat.c: ...here.  Include
+	<math/w_lgamma_compat.c>.
+	[LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)] (__lgammal_dbl_compat):
+	Define as alias of __lgamma_compat and use in defining lgammal.
+	* sysdeps/ieee754/ldbl-opt/w_lgammal.c: Move to ....
+	* sysdeps/ieee754/ldbl-opt/w_lgamma_compatl.c: ...here.  Include
+	<math/lgamma-compat.h> and <math/w_lgamma_compatl.c>.
+	(USE_AS_COMPAT): New macro.
+	(LGAMMA_OLD_VER): Undefine and redefine.
+	(lgammal): Do not define here.
+	(gammal): Only define here if [GAMMA_ALIAS].
+	* conform/linknamespace.pl (@whitelist): Remove signgam.
+	* sysdeps/nacl/libm.abilist: Update.
+	* sysdeps/unix/sysv/linux/aarch64/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/alpha/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/arm/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/hppa/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/ia64/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/microblaze/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/mips/mips32/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/mips/mips64/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/nios2/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist:
+	Likewise.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist:
+	Likewise.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist:
+	Likewise.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist:
+	Likewise.
+	* sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/sh/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist:
+	Likewise.
+	* sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist:
+	Likewise.
+	* sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise.
+	* sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.
+
 2015-11-20  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
 
 	[BZ #16364]
diff --git a/NEWS b/NEWS
index 4c00e1474c..df8ad62a82 100644
--- a/NEWS
+++ b/NEWS
@@ -42,6 +42,12 @@ Version 2.23
 * Optimized string, wcsmbs and memory functions for IBM z13.
   Implemented by Stefan Liebler.
 
+* Newly linked programs that define a variable called signgam will no longer
+  have it set by the lgamma, lgammaf and lgammal functions.  Programs that
+  require signgam to be set by those functions must ensure that they use the
+  variable provided by the GNU C Library and declared in <math.h>, without
+  defining their own copy.
+
 * The minimum GCC version that can be used to build this version of the GNU
   C Library is GCC 4.7.  Older GCC versions, and non-GNU compilers, can
   still be used to compile programs using the GNU C Library.
diff --git a/conform/linknamespace.pl b/conform/linknamespace.pl
index 94ebfd469b..d4b3142a07 100644
--- a/conform/linknamespace.pl
+++ b/conform/linknamespace.pl
@@ -40,8 +40,6 @@ close (STDSYMS) || die ("close $stdsyms_file: $!\n");
 
 # The following whitelisted symbols are also allowed for now.
 #
-# * Bug 15421: lgamma wrongly sets signgam for ISO C.
-#
 # * Bug 17576: stdin, stdout, stderr only reserved with external
 # linkage when stdio.h included (and possibly not then), not
 # generally.
@@ -52,7 +50,7 @@ close (STDSYMS) || die ("close $stdsyms_file: $!\n");
 # * False positive: matherr only used conditionally.  matherrf/matherrl are used
 # by IA64 too for the same reason.
 #
-@whitelist = qw(signgam stdin stdout stderr re_syntax_options matherr matherrf
+@whitelist = qw(stdin stdout stderr re_syntax_options matherr matherrf
 		matherrl);
 foreach my $sym (@whitelist) {
   $stdsyms{$sym} = 1;
diff --git a/include/math.h b/include/math.h
index b28c4412e2..ba7bba018a 100644
--- a/include/math.h
+++ b/include/math.h
@@ -6,6 +6,8 @@
 /* Now define the internal interfaces.  */
 extern int __matherr (struct exception *__exc);
 
+extern int __signgam;
+
 # if IS_IN (libc) || IS_IN (libm)
 hidden_proto (__finite)
 hidden_proto (__isinf)
diff --git a/math/Makefile b/math/Makefile
index 06412f3980..0ff3baa19e 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -62,7 +62,8 @@ libm-calls = e_acos e_acosh e_asin e_atan2 e_atanh e_cosh e_exp e_fmod	\
 	     s_casinh s_cacosh s_catanh s_csqrt s_cpow s_cproj s_clog10 \
 	     s_fma s_lrint s_llrint s_lround s_llround e_exp10 w_log2	\
 	     s_issignaling $(calls:s_%=m_%) x2y2m1 k_casinh	\
-	     gamma_product k_standard lgamma_neg lgamma_product
+	     gamma_product k_standard lgamma_neg lgamma_product		\
+	     w_lgamma_compat
 
 dbl-only-routines := branred doasin dosincos halfulp mpa mpatan2	\
 		     mpatan mpexp mplog mpsqrt mptan sincos32 slowexp	\
@@ -110,8 +111,13 @@ tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \
 	test-fenv-tls test-fenv-preserve test-fenv-return test-fenvinline \
 	test-nearbyint-except test-fenv-clear test-signgam-finite \
 	test-signgam-finite-c99 test-signgam-finite-c11 \
-	test-nearbyint-except-2 $(tests-static)
-tests-static = test-fpucw-static test-fpucw-ieee-static
+	test-nearbyint-except-2 test-signgam-uchar test-signgam-uchar-init \
+	test-signgam-uint test-signgam-uint-init test-signgam-ullong \
+	test-signgam-ullong-init $(tests-static)
+tests-static = test-fpucw-static test-fpucw-ieee-static \
+	       test-signgam-uchar-static test-signgam-uchar-init-static \
+	       test-signgam-uint-static test-signgam-uint-init-static \
+	       test-signgam-ullong-static test-signgam-ullong-init-static
 # We do the `long double' tests only if this data type is available and
 # distinct from `double'.
 test-longdouble-yes = test-ldouble test-ildoubl test-ldouble-finite
@@ -200,6 +206,18 @@ CPPFLAGS-test-ildoubl.c = -U__LIBC_INTERNAL_MATH_INLINES \
 CFLAGS-test-signgam-finite.c = -ffinite-math-only
 CFLAGS-test-signgam-finite-c99.c = -ffinite-math-only -std=c99
 CFLAGS-test-signgam-finite-c11.c = -ffinite-math-only -std=c11
+CFLAGS-test-signgam-uchar.c = -std=c99
+CFLAGS-test-signgam-uchar-init.c = -std=c99
+CFLAGS-test-signgam-uchar-static.c = -std=c99
+CFLAGS-test-signgam-uchar-init-static.c = -std=c99
+CFLAGS-test-signgam-uint.c = -std=c99
+CFLAGS-test-signgam-uint-init.c = -std=c99
+CFLAGS-test-signgam-uint-static.c = -std=c99
+CFLAGS-test-signgam-uint-init-static.c = -std=c99
+CFLAGS-test-signgam-ullong.c = -std=c99
+CFLAGS-test-signgam-ullong-init.c = -std=c99
+CFLAGS-test-signgam-ullong-static.c = -std=c99
+CFLAGS-test-signgam-ullong-init-static.c = -std=c99
 
 # The -lieee module sets the _LIB_VERSION_ switch to IEEE mode
 # for error handling in the -lm functions.
diff --git a/math/Versions b/math/Versions
index 551abec020..e6a597cf23 100644
--- a/math/Versions
+++ b/math/Versions
@@ -203,4 +203,11 @@ libm {
   GLIBC_2.18 {
     __issignaling; __issignalingf; __issignalingl;
   }
+  GLIBC_2.23 {
+    # The __signgam name must be exported for the signgam weak alias
+    # to work.  New symbol versions of lgamma* that set __signgam are
+    # needed to preserve compatibility with old binaries that have a
+    # dynamic symbol for signgam but not __signgam.
+    lgamma; lgammaf; lgammal; __signgam;
+  }
 }
diff --git a/math/lgamma-compat.h b/math/lgamma-compat.h
new file mode 100644
index 0000000000..1393f0e1f5
--- /dev/null
+++ b/math/lgamma-compat.h
@@ -0,0 +1,73 @@
+/* ABI compatibility for lgamma functions.
+   Copyright (C) 2015 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef LGAMMA_COMPAT_H
+#define LGAMMA_COMPAT_H 1
+
+#include <shlib-compat.h>
+
+/* XSI POSIX requires lgamma to set signgam, but ISO C does not permit
+   this.  Namespace issues can be avoided if the functions set
+   __signgam and signgam is a weak alias, but this only works if both
+   signgam and __signgam were exported from the glibc version the
+   program was linked against.  Before glibc 2.23, lgamma functions
+   set signgam which was not a weak alias for __signgam, so old
+   binaries have dynamic symbols for signgam only and the versions of
+   lgamma used for old binaries must set both signgam and __signgam.
+   Those versions also do a check of _LIB_VERSION != _ISOC_ to match
+   old glibc.
+
+   Users of this file define USE_AS_COMPAT to 0 when building the main
+   version of lgamma, 1 when building the compatibility version.  */
+
+#define LGAMMA_OLD_VER GLIBC_2_0
+#define LGAMMA_NEW_VER GLIBC_2_23
+#define HAVE_LGAMMA_COMPAT SHLIB_COMPAT (libm, LGAMMA_OLD_VER, LGAMMA_NEW_VER)
+
+/* Whether to build this version at all.  */
+#define BUILD_LGAMMA (HAVE_LGAMMA_COMPAT || !USE_AS_COMPAT)
+
+/* The name to use for this version.  */
+#if USE_AS_COMPAT
+# define LGFUNC(FUNC) FUNC ## _compat
+#else
+# define LGFUNC(FUNC) FUNC
+#endif
+
+/* If there is a compatibility version, gamma (not an ISO C function,
+   so never a problem for it to set signgam) points directly to it
+   rather than having separate versions.  */
+#define GAMMA_ALIAS (USE_AS_COMPAT ? HAVE_LGAMMA_COMPAT : !HAVE_LGAMMA_COMPAT)
+
+/* How to call the underlying lgamma_r function.  */
+#define CALL_LGAMMA(TYPE, FUNC, ARG)			\
+  ({							\
+    TYPE lgamma_tmp;					\
+    int local_signgam;					\
+    if (USE_AS_COMPAT)					\
+      {							\
+	lgamma_tmp = FUNC ((ARG), &local_signgam);	\
+	if (_LIB_VERSION != _ISOC_)			\
+	  signgam = __signgam = local_signgam;		\
+      }							\
+    else						\
+      lgamma_tmp = FUNC ((ARG), &__signgam);		\
+    lgamma_tmp;						\
+  })
+
+#endif /* lgamma-compat.h.  */
diff --git a/math/test-signgam-main.c b/math/test-signgam-main.c
new file mode 100644
index 0000000000..6aed7f4f01
--- /dev/null
+++ b/math/test-signgam-main.c
@@ -0,0 +1,71 @@
+/* Test lgamma functions do not set signgam for ISO C.
+   Copyright (C) 2015 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#undef _LIBC
+#undef _GNU_SOURCE
+#define _ISOMAC
+
+#include <math.h>
+#include <stdio.h>
+
+#define INITVAL ((TYPE) -1 / 3)
+
+#if DO_INIT
+TYPE signgam = INITVAL;
+#else
+TYPE signgam;
+#endif
+
+#define RUN_TESTS(FUNC, TYPE)					\
+  do								\
+    {								\
+      volatile TYPE a, b, c __attribute__ ((unused));		\
+      a = 0.5;							\
+      b = -0.5;							\
+      signgam = INITVAL;					\
+      c = FUNC (a);						\
+      if (signgam == INITVAL)					\
+	puts ("PASS: " #FUNC " (0.5) setting signgam");		\
+      else							\
+	{							\
+	  puts ("FAIL: " #FUNC " (0.5) setting signgam");	\
+	  result = 1;						\
+	}							\
+      signgam = INITVAL;					\
+      c = FUNC (b);						\
+      if (signgam == INITVAL)					\
+	puts ("PASS: " #FUNC " (-0.5) setting signgam");	\
+      else							\
+	{							\
+	  puts ("FAIL: " #FUNC " (-0.5) setting signgam");	\
+	  result = 1;						\
+	}							\
+    }								\
+  while (0)
+
+int
+main (void)
+{
+  int result = 0;
+  RUN_TESTS (lgammaf, float);
+  RUN_TESTS (lgamma, double);
+#ifndef NO_LONG_DOUBLE
+  RUN_TESTS (lgammal, long double);
+#endif
+  return result;
+}
diff --git a/math/test-signgam-uchar-init-static.c b/math/test-signgam-uchar-init-static.c
new file mode 100644
index 0000000000..43ac5026b6
--- /dev/null
+++ b/math/test-signgam-uchar-init-static.c
@@ -0,0 +1 @@
+#include "test-signgam-uchar-init.c"
diff --git a/math/test-signgam-uchar-init.c b/math/test-signgam-uchar-init.c
new file mode 100644
index 0000000000..4eea51e5ae
--- /dev/null
+++ b/math/test-signgam-uchar-init.c
@@ -0,0 +1,3 @@
+#define TYPE unsigned char
+#define DO_INIT 1
+#include "test-signgam-main.c"
diff --git a/math/test-signgam-uchar-static.c b/math/test-signgam-uchar-static.c
new file mode 100644
index 0000000000..a1e655dfb7
--- /dev/null
+++ b/math/test-signgam-uchar-static.c
@@ -0,0 +1 @@
+#include "test-signgam-uchar.c"
diff --git a/math/test-signgam-uchar.c b/math/test-signgam-uchar.c
new file mode 100644
index 0000000000..b613fd2ea1
--- /dev/null
+++ b/math/test-signgam-uchar.c
@@ -0,0 +1,3 @@
+#define TYPE unsigned char
+#define DO_INIT 0
+#include "test-signgam-main.c"
diff --git a/math/test-signgam-uint-init-static.c b/math/test-signgam-uint-init-static.c
new file mode 100644
index 0000000000..1afb205ed2
--- /dev/null
+++ b/math/test-signgam-uint-init-static.c
@@ -0,0 +1 @@
+#include "test-signgam-uint-init.c"
diff --git a/math/test-signgam-uint-init.c b/math/test-signgam-uint-init.c
new file mode 100644
index 0000000000..e3d064fbb8
--- /dev/null
+++ b/math/test-signgam-uint-init.c
@@ -0,0 +1,3 @@
+#define TYPE unsigned int
+#define DO_INIT 1
+#include "test-signgam-main.c"
diff --git a/math/test-signgam-uint-static.c b/math/test-signgam-uint-static.c
new file mode 100644
index 0000000000..0aa0c24a75
--- /dev/null
+++ b/math/test-signgam-uint-static.c
@@ -0,0 +1 @@
+#include "test-signgam-uint.c"
diff --git a/math/test-signgam-uint.c b/math/test-signgam-uint.c
new file mode 100644
index 0000000000..4ab783f111
--- /dev/null
+++ b/math/test-signgam-uint.c
@@ -0,0 +1,3 @@
+#define TYPE unsigned int
+#define DO_INIT 0
+#include "test-signgam-main.c"
diff --git a/math/test-signgam-ullong-init-static.c b/math/test-signgam-ullong-init-static.c
new file mode 100644
index 0000000000..84e0a195fb
--- /dev/null
+++ b/math/test-signgam-ullong-init-static.c
@@ -0,0 +1 @@
+#include "test-signgam-ullong-init.c"
diff --git a/math/test-signgam-ullong-init.c b/math/test-signgam-ullong-init.c
new file mode 100644
index 0000000000..f32957f879
--- /dev/null
+++ b/math/test-signgam-ullong-init.c
@@ -0,0 +1,3 @@
+#define TYPE unsigned long long int
+#define DO_INIT 1
+#include "test-signgam-main.c"
diff --git a/math/test-signgam-ullong-static.c b/math/test-signgam-ullong-static.c
new file mode 100644
index 0000000000..13e43854be
--- /dev/null
+++ b/math/test-signgam-ullong-static.c
@@ -0,0 +1 @@
+#include "test-signgam-ullong.c"
diff --git a/math/test-signgam-ullong.c b/math/test-signgam-ullong.c
new file mode 100644
index 0000000000..5d4f27e8a3
--- /dev/null
+++ b/math/test-signgam-ullong.c
@@ -0,0 +1,3 @@
+#define TYPE unsigned long long int
+#define DO_INIT 0
+#include "test-signgam-main.c"
diff --git a/math/w_lgamma.c b/math/w_lgamma.c
index a82b5e397c..8bb33e0472 100644
--- a/math/w_lgamma.c
+++ b/math/w_lgamma.c
@@ -1,49 +1,2 @@
-/* @(#)w_lgamma.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/* double lgamma(double x)
- * Return the logarithm of the Gamma function of x.
- *
- * Method: call __ieee754_lgamma_r
- */
-
-#include <math.h>
-#include <math_private.h>
-
-double
-__lgamma(double x)
-{
-	int local_signgam = 0;
-	double y = __ieee754_lgamma_r(x,
-				      _LIB_VERSION != _ISOC_
-				      /* ISO C99 does not define the
-					 global variable.  */
-				      ? &signgam
-				      : &local_signgam);
-	if(__builtin_expect(!isfinite(y), 0)
-	   && isfinite(x) && _LIB_VERSION != _IEEE_)
-		return __kernel_standard(x, x,
-					 __floor(x)==x&&x<=0.0
-					 ? 15 /* lgamma pole */
-					 : 14); /* lgamma overflow */
-
-	return y;
-}
-weak_alias (__lgamma, lgamma)
-strong_alias (__lgamma, __gamma)
-weak_alias (__gamma, gamma)
-#ifdef NO_LONG_DOUBLE
-strong_alias (__lgamma, __lgammal)
-weak_alias (__lgamma, lgammal)
-strong_alias (__gamma, __gammal)
-weak_alias (__gamma, gammal)
-#endif
+#define USE_AS_COMPAT 0
+#include <w_lgamma_main.c>
diff --git a/math/w_lgamma_compat.c b/math/w_lgamma_compat.c
new file mode 100644
index 0000000000..30510a5eee
--- /dev/null
+++ b/math/w_lgamma_compat.c
@@ -0,0 +1,2 @@
+#define USE_AS_COMPAT 1
+#include <w_lgamma_main.c>
diff --git a/math/w_lgamma_compatf.c b/math/w_lgamma_compatf.c
new file mode 100644
index 0000000000..e59586fe8a
--- /dev/null
+++ b/math/w_lgamma_compatf.c
@@ -0,0 +1,2 @@
+#define USE_AS_COMPAT 1
+#include <w_lgammaf_main.c>
diff --git a/math/w_lgamma_compatl.c b/math/w_lgamma_compatl.c
new file mode 100644
index 0000000000..55ca3640b3
--- /dev/null
+++ b/math/w_lgamma_compatl.c
@@ -0,0 +1,2 @@
+#define USE_AS_COMPAT 1
+#include <w_lgammal_main.c>
diff --git a/math/w_lgamma_main.c b/math/w_lgamma_main.c
new file mode 100644
index 0000000000..cdea331f1a
--- /dev/null
+++ b/math/w_lgamma_main.c
@@ -0,0 +1,59 @@
+/* @(#)w_lgamma.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/* double lgamma(double x)
+ * Return the logarithm of the Gamma function of x.
+ *
+ * Method: call __ieee754_lgamma_r
+ */
+
+#include <math.h>
+#include <math_private.h>
+
+#include <lgamma-compat.h>
+
+#if BUILD_LGAMMA
+double
+LGFUNC (__lgamma) (double x)
+{
+	double y = CALL_LGAMMA (double, __ieee754_lgamma_r, x);
+	if(__builtin_expect(!isfinite(y), 0)
+	   && isfinite(x) && _LIB_VERSION != _IEEE_)
+		return __kernel_standard(x, x,
+					 __floor(x)==x&&x<=0.0
+					 ? 15 /* lgamma pole */
+					 : 14); /* lgamma overflow */
+
+	return y;
+}
+# if USE_AS_COMPAT
+compat_symbol (libm, __lgamma_compat, lgamma, LGAMMA_OLD_VER);
+#  ifdef NO_LONG_DOUBLE
+strong_alias (__lgamma_compat, __lgammal_compat)
+compat_symbol (libm, __lgammal_compat, lgammal, LGAMMA_OLD_VER);
+#  endif
+# else
+versioned_symbol (libm, __lgamma, lgamma, LGAMMA_NEW_VER);
+#  ifdef NO_LONG_DOUBLE
+strong_alias (__lgamma, __lgammal)
+versioned_symbol (libm, __lgammal, lgammal, LGAMMA_NEW_VER);
+#  endif
+# endif
+# if GAMMA_ALIAS
+strong_alias (LGFUNC (__lgamma), __gamma)
+weak_alias (__gamma, gamma)
+#  ifdef NO_LONG_DOUBLE
+strong_alias (__gamma, __gammal)
+weak_alias (__gamma, gammal)
+#  endif
+# endif
+#endif
diff --git a/math/w_lgammaf.c b/math/w_lgammaf.c
index dac69dd32a..5fc402260c 100644
--- a/math/w_lgammaf.c
+++ b/math/w_lgammaf.c
@@ -1,40 +1,2 @@
-/* w_lgammaf.c -- float version of w_lgamma.c.
- * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
- */
-
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-#include <math.h>
-#include <math_private.h>
-
-float
-__lgammaf(float x)
-{
-	int local_signgam = 0;
-	float y = __ieee754_lgammaf_r(x,
-				      _LIB_VERSION != _ISOC_
-				      /* ISO C99 does not define the
-					 global variable.  */
-				      ? &signgam
-				      : &local_signgam);
-	if(__builtin_expect(!isfinite(y), 0)
-	   && isfinite(x) && _LIB_VERSION != _IEEE_)
-		return __kernel_standard_f(x, x,
-					   __floorf(x)==x&&x<=0.0f
-					   ? 115 /* lgamma pole */
-					   : 114); /* lgamma overflow */
-
-	return y;
-}
-weak_alias (__lgammaf, lgammaf)
-strong_alias (__lgammaf, __gammaf)
-weak_alias (__gammaf, gammaf)
+#define USE_AS_COMPAT 0
+#include <w_lgammaf_main.c>
diff --git a/math/w_lgammaf_main.c b/math/w_lgammaf_main.c
new file mode 100644
index 0000000000..ba7ff0e573
--- /dev/null
+++ b/math/w_lgammaf_main.c
@@ -0,0 +1,44 @@
+/* w_lgammaf.c -- float version of w_lgamma.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <math.h>
+#include <math_private.h>
+
+#include <lgamma-compat.h>
+
+#if BUILD_LGAMMA
+float
+LGFUNC (__lgammaf) (float x)
+{
+	float y = CALL_LGAMMA (float, __ieee754_lgammaf_r, x);
+	if(__builtin_expect(!isfinite(y), 0)
+	   && isfinite(x) && _LIB_VERSION != _IEEE_)
+		return __kernel_standard_f(x, x,
+					   __floorf(x)==x&&x<=0.0f
+					   ? 115 /* lgamma pole */
+					   : 114); /* lgamma overflow */
+
+	return y;
+}
+# if USE_AS_COMPAT
+compat_symbol (libm, __lgammaf_compat, lgammaf, LGAMMA_OLD_VER);
+# else
+versioned_symbol (libm, __lgammaf, lgammaf, LGAMMA_NEW_VER);
+# endif
+# if GAMMA_ALIAS
+strong_alias (LGFUNC (__lgammaf), __gammaf)
+weak_alias (__gammaf, gammaf)
+# endif
+#endif
diff --git a/math/w_lgammal.c b/math/w_lgammal.c
index 8abe6a018f..78dd9c5808 100644
--- a/math/w_lgammal.c
+++ b/math/w_lgammal.c
@@ -1,47 +1,2 @@
-/* w_lgammal.c -- long double version of w_lgamma.c.
- * Conversion to long double by Ulrich Drepper,
- * Cygnus Support, drepper@cygnus.com.
- */
-
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/* long double lgammal(long double x)
- * Return the logarithm of the Gamma function of x.
- *
- * Method: call __ieee754_lgammal_r
- */
-
-#include <math.h>
-#include <math_private.h>
-
-long double
-__lgammal(long double x)
-{
-	int local_signgam = 0;
-	long double y = __ieee754_lgammal_r(x,
-					    _LIB_VERSION != _ISOC_
-					    /* ISO C99 does not define the
-					       global variable.  */
-					    ? &signgam
-					    : &local_signgam);
-	if(__builtin_expect(!isfinite(y), 0)
-	   && isfinite(x) && _LIB_VERSION != _IEEE_)
-		return __kernel_standard_l(x, x,
-					   __floorl(x)==x&&x<=0.0L
-					   ? 215 /* lgamma pole */
-					   : 214); /* lgamma overflow */
-
-	return y;
-}
-weak_alias (__lgammal, lgammal)
-strong_alias (__lgammal, __gammal)
-weak_alias (__gammal, gammal)
+#define USE_AS_COMPAT 0
+#include <w_lgammal_main.c>
diff --git a/math/w_lgammal_main.c b/math/w_lgammal_main.c
new file mode 100644
index 0000000000..c3c41f6fff
--- /dev/null
+++ b/math/w_lgammal_main.c
@@ -0,0 +1,51 @@
+/* w_lgammal.c -- long double version of w_lgamma.c.
+ * Conversion to long double by Ulrich Drepper,
+ * Cygnus Support, drepper@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/* long double lgammal(long double x)
+ * Return the logarithm of the Gamma function of x.
+ *
+ * Method: call __ieee754_lgammal_r
+ */
+
+#include <math.h>
+#include <math_private.h>
+
+#include <lgamma-compat.h>
+
+#if BUILD_LGAMMA
+long double
+LGFUNC (__lgammal) (long double x)
+{
+	long double y = CALL_LGAMMA (long double, __ieee754_lgammal_r, x);
+	if(__builtin_expect(!isfinite(y), 0)
+	   && isfinite(x) && _LIB_VERSION != _IEEE_)
+		return __kernel_standard_l(x, x,
+					   __floorl(x)==x&&x<=0.0L
+					   ? 215 /* lgamma pole */
+					   : 214); /* lgamma overflow */
+
+	return y;
+}
+# if USE_AS_COMPAT
+compat_symbol (libm, __lgammal_compat, lgammal, LGAMMA_OLD_VER);
+# else
+versioned_symbol (libm, __lgammal, lgammal, LGAMMA_NEW_VER);
+# endif
+# if GAMMA_ALIAS
+strong_alias (LGFUNC (__lgammal), __gammal)
+weak_alias (__gammal, gammal)
+# endif
+#endif
diff --git a/sysdeps/ia64/fpu/lgamma-compat.h b/sysdeps/ia64/fpu/lgamma-compat.h
new file mode 100644
index 0000000000..f9748393b7
--- /dev/null
+++ b/sysdeps/ia64/fpu/lgamma-compat.h
@@ -0,0 +1,42 @@
+/* ABI compatibility for lgamma functions.  ia64 version.
+   Copyright (C) 2015 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef IA64_LGAMMA_COMPAT_H
+#define IA64_LGAMMA_COMPAT_H 1
+
+#include <math/lgamma-compat.h>
+
+#undef LGFUNC
+#if USE_AS_COMPAT
+# define LGFUNC(FUNC) __ ## FUNC ## _compat
+#else
+# define LGFUNC(FUNC) __ieee754_ ## FUNC
+#endif
+
+#undef CALL_LGAMMA
+#define CALL_LGAMMA(TYPE, FUNC, ARG)				\
+  ({								\
+    TYPE lgamma_tmp;						\
+    extern int __signgam, signgam;				\
+    lgamma_tmp = FUNC ((ARG), &__signgam, sizeof (__signgam));	\
+    if (USE_AS_COMPAT)						\
+      signgam = __signgam;					\
+    lgamma_tmp;							\
+  })
+
+#endif /* lgamma-compat.h.  */
diff --git a/sysdeps/ia64/fpu/w_lgamma.c b/sysdeps/ia64/fpu/w_lgamma_main.c
index 2006d3e806..6deffad987 100644
--- a/sysdeps/ia64/fpu/w_lgamma.c
+++ b/sysdeps/ia64/fpu/w_lgamma_main.c
@@ -53,28 +53,21 @@
 
 #include "libm_support.h"
 
+#include <lgamma-compat.h>
 
 extern double __libm_lgamma(double /*x*/, int* /*signgam*/, int /*signgamsz*/);
 
 
-double __ieee754_lgamma(double x)
+double LGFUNC (lgamma) (double x)
 {
-#ifdef __POSIX__
-    extern int    signgam;
-#else
-    int    signgam;
-#endif
-    return __libm_lgamma(x, &signgam, sizeof(signgam));
+    return CALL_LGAMMA (double, __libm_lgamma, x);
 }
-weak_alias (__ieee754_lgamma, lgamma)
-
-double __ieee754_gamma(double x)
-{
-#ifdef __POSIX__
-    extern int    signgam;
+#if USE_AS_COMPAT
+compat_symbol (libm, __lgammaf_compat, lgammaf, LGAMMA_OLD_VER);
 #else
-    int    signgam;
+versioned_symbol (libm, __ieee754_lgammaf, lgammaf, LGAMMA_NEW_VER);
+#endif
+#if GAMMA_ALIAS
+strong_alias (LGFUNC (lgammaf), __ieee754_gammaf)
+weak_alias (__ieee754_gammaf, gammaf)
 #endif
-    return __libm_lgamma(x, &signgam, sizeof(signgam));
-}
-weak_alias (__ieee754_gamma, gamma)
diff --git a/sysdeps/ia64/fpu/w_lgammaf.c b/sysdeps/ia64/fpu/w_lgammaf_main.c
index cd0b4f6666..d8e86a6f25 100644
--- a/sysdeps/ia64/fpu/w_lgammaf.c
+++ b/sysdeps/ia64/fpu/w_lgammaf_main.c
@@ -53,28 +53,21 @@
 
 #include "libm_support.h"
 
+#include <lgamma-compat.h>
 
 extern float  __libm_lgammaf(float /*x*/, int* /*signgam*/, int /*signgamsz*/);
 
 
-float __ieee754_lgammaf(float x)
+float LGFUNC (lgammaf) (float x)
 {
-#ifdef __POSIX__
-    extern int    signgam;
-#else
-    int    signgam;
-#endif
-    return __libm_lgammaf(x, &signgam, sizeof(signgam));
+    return CALL_LGAMMA (float, __libm_lgammaf, x);
 }
-weak_alias (__ieee754_lgammaf, lgammaf)
-
-float __ieee754_gammaf(float x)
-{
-#ifdef __POSIX__
-    extern int    signgam;
+#if USE_AS_COMPAT
+compat_symbol (libm, __lgammaf_compat, lgammaf, LGAMMA_OLD_VER);
 #else
-    int    signgam;
+versioned_symbol (libm, __ieee754_lgammaf, lgammaf, LGAMMA_NEW_VER);
 #endif
-    return __libm_lgammaf(x, &signgam, sizeof(signgam));
-}
+#if GAMMA_ALIAS
+strong_alias (LGFUNC (lgammaf), __ieee754_gammaf)
 weak_alias (__ieee754_gammaf, gammaf)
+#endif
diff --git a/sysdeps/ia64/fpu/w_lgammal.c b/sysdeps/ia64/fpu/w_lgammal_main.c
index e3885296eb..5c73f33430 100644
--- a/sysdeps/ia64/fpu/w_lgammal.c
+++ b/sysdeps/ia64/fpu/w_lgammal_main.c
@@ -55,25 +55,18 @@
 
 extern double __libm_lgammal(long double /*x*/, int* /*signgam*/, int /*signgamsz*/);
 
+#include <lgamma-compat.h>
 
-long double __ieee754_lgammal(long double x)
+long double LGFUNC (lgammal) (long double x)
 {
-#ifdef __POSIX__
-    extern int    signgam;
-#else
-    int    signgam;
-#endif
-    return __libm_lgammal(x, &signgam, sizeof(signgam));
+    return CALL_LGAMMA (long double, __libm_lgammal, x);
 }
-weak_alias (__ieee754_lgammal, lgammal)
-
-long double __ieee754_gammal(long double x)
-{
-#ifdef __POSIX__
-    extern int    signgam;
+#if USE_AS_COMPAT
+compat_symbol (libm, __lgammal_compat, lgammal, LGAMMA_OLD_VER);
 #else
-    int    signgam;
+versioned_symbol (libm, __ieee754_lgammal, lgammal, LGAMMA_NEW_VER);
 #endif
-    return __libm_lgammal(x, &signgam, sizeof(signgam));
-}
+#if GAMMA_ALIAS
+strong_alias (LGFUNC (lgammal), __ieee754_gammal)
 weak_alias (__ieee754_gammal, gammal)
+#endif
diff --git a/sysdeps/ieee754/ldbl-opt/w_lgamma.c b/sysdeps/ieee754/ldbl-opt/w_lgamma.c
deleted file mode 100644
index ef801c5505..0000000000
--- a/sysdeps/ieee754/ldbl-opt/w_lgamma.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <math_ldbl_opt.h>
-#include <math/w_lgamma.c>
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
-compat_symbol (libm, __lgamma, lgammal, GLIBC_2_0);
-compat_symbol (libm, __gamma, gammal, GLIBC_2_0);
-#endif
diff --git a/sysdeps/ieee754/ldbl-opt/w_lgamma_compat.c b/sysdeps/ieee754/ldbl-opt/w_lgamma_compat.c
new file mode 100644
index 0000000000..f268e65a88
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-opt/w_lgamma_compat.c
@@ -0,0 +1,7 @@
+#include <math_ldbl_opt.h>
+#include <math/w_lgamma_compat.c>
+#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
+strong_alias (__lgamma_compat, __lgammal_dbl_compat)
+compat_symbol (libm, __lgammal_dbl_compat, lgammal, GLIBC_2_0);
+compat_symbol (libm, __gamma, gammal, GLIBC_2_0);
+#endif
diff --git a/sysdeps/ieee754/ldbl-opt/w_lgamma_compatl.c b/sysdeps/ieee754/ldbl-opt/w_lgamma_compatl.c
new file mode 100644
index 0000000000..f60b3d7bcf
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-opt/w_lgamma_compatl.c
@@ -0,0 +1,11 @@
+#include <math_ldbl_opt.h>
+#undef weak_alias
+#define weak_alias(n,a)
+#define USE_AS_COMPAT 1
+#include <math/lgamma-compat.h>
+#undef LGAMMA_OLD_VER
+#define LGAMMA_OLD_VER LONG_DOUBLE_COMPAT_VERSION
+#include <math/w_lgamma_compatl.c>
+#if GAMMA_ALIAS
+long_double_symbol (libm, __gammal, gammal);
+#endif
diff --git a/sysdeps/ieee754/ldbl-opt/w_lgammal.c b/sysdeps/ieee754/ldbl-opt/w_lgammal.c
deleted file mode 100644
index 9de7ec8f7f..0000000000
--- a/sysdeps/ieee754/ldbl-opt/w_lgammal.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <math_ldbl_opt.h>
-#undef weak_alias
-#define weak_alias(n,a)
-#include <math/w_lgammal.c>
-long_double_symbol (libm, __lgammal, lgammal);
-long_double_symbol (libm, __gammal, gammal);
diff --git a/sysdeps/ieee754/s_signgam.c b/sysdeps/ieee754/s_signgam.c
index ee207d6505..9af3a75f1e 100644
--- a/sysdeps/ieee754/s_signgam.c
+++ b/sysdeps/ieee754/s_signgam.c
@@ -1,3 +1,4 @@
 #include <math.h>
 #include <math_private.h>
-int signgam;
+int __signgam = 0;
+weak_alias (__signgam, signgam)
diff --git a/sysdeps/nacl/libm.abilist b/sysdeps/nacl/libm.abilist
index d1fd77ab7f..055b0b25ba 100644
--- a/sysdeps/nacl/libm.abilist
+++ b/sysdeps/nacl/libm.abilist
@@ -367,3 +367,8 @@ GLIBC_2.22 y1l F
 GLIBC_2.22 yn F
 GLIBC_2.22 ynf F
 GLIBC_2.22 ynl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
diff --git a/sysdeps/unix/sysv/linux/aarch64/libm.abilist b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
index ead20e1c6d..2123113e25 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
@@ -398,3 +398,8 @@ GLIBC_2.18 GLIBC_2.18 A
 GLIBC_2.18 __issignaling F
 GLIBC_2.18 __issignalingf F
 GLIBC_2.18 __issignalingl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
diff --git a/sysdeps/unix/sysv/linux/alpha/libm.abilist b/sysdeps/unix/sysv/linux/alpha/libm.abilist
index 80838d3196..611dfe1aa5 100644
--- a/sysdeps/unix/sysv/linux/alpha/libm.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libm.abilist
@@ -408,6 +408,11 @@ GLIBC_2.2 feraiseexcept F
 GLIBC_2.2 fesetenv F
 GLIBC_2.2 fesetexceptflag F
 GLIBC_2.2 feupdateenv F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.3.4 GLIBC_2.3.4 A
 GLIBC_2.3.4 __c1_cabsf F
 GLIBC_2.3.4 __c1_cacosf F
diff --git a/sysdeps/unix/sysv/linux/arm/libm.abilist b/sysdeps/unix/sysv/linux/arm/libm.abilist
index be96e9594b..e65e2309cd 100644
--- a/sysdeps/unix/sysv/linux/arm/libm.abilist
+++ b/sysdeps/unix/sysv/linux/arm/libm.abilist
@@ -56,6 +56,11 @@ GLIBC_2.15 __ynf_finite F
 GLIBC_2.18 GLIBC_2.18 A
 GLIBC_2.18 __issignaling F
 GLIBC_2.18 __issignalingf F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 _LIB_VERSION D 0x4
 GLIBC_2.4 __clog10 F
diff --git a/sysdeps/unix/sysv/linux/hppa/libm.abilist b/sysdeps/unix/sysv/linux/hppa/libm.abilist
index 3304e6ec8c..9b7f40a4c9 100644
--- a/sysdeps/unix/sysv/linux/hppa/libm.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libm.abilist
@@ -368,5 +368,10 @@ GLIBC_2.2 y1l F
 GLIBC_2.2 yn F
 GLIBC_2.2 ynf F
 GLIBC_2.2 ynl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 exp2l F
diff --git a/sysdeps/unix/sysv/linux/i386/libm.abilist b/sysdeps/unix/sysv/linux/i386/libm.abilist
index e049a678cd..78b542e935 100644
--- a/sysdeps/unix/sysv/linux/i386/libm.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libm.abilist
@@ -410,4 +410,9 @@ GLIBC_2.2 feraiseexcept F
 GLIBC_2.2 fesetenv F
 GLIBC_2.2 fesetexceptflag F
 GLIBC_2.2 feupdateenv F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
diff --git a/sysdeps/unix/sysv/linux/ia64/libm.abilist b/sysdeps/unix/sysv/linux/ia64/libm.abilist
index 39eafb8ab0..6d4cc72e0e 100644
--- a/sysdeps/unix/sysv/linux/ia64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libm.abilist
@@ -339,4 +339,9 @@ GLIBC_2.2 ynl F
 GLIBC_2.2.3 GLIBC_2.2.3 A
 GLIBC_2.2.3 matherrf F
 GLIBC_2.2.3 matherrl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
index be96e9594b..e65e2309cd 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
@@ -56,6 +56,11 @@ GLIBC_2.15 __ynf_finite F
 GLIBC_2.18 GLIBC_2.18 A
 GLIBC_2.18 __issignaling F
 GLIBC_2.18 __issignalingf F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 _LIB_VERSION D 0x4
 GLIBC_2.4 __clog10 F
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
index 48ce23e978..2d31935916 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
@@ -408,4 +408,9 @@ GLIBC_2.2 feraiseexcept F
 GLIBC_2.2 fesetenv F
 GLIBC_2.2 fesetexceptflag F
 GLIBC_2.2 feupdateenv F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
diff --git a/sysdeps/unix/sysv/linux/microblaze/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/libm.abilist
index 15193f2039..149fd4f2be 100644
--- a/sysdeps/unix/sysv/linux/microblaze/libm.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/libm.abilist
@@ -367,3 +367,8 @@ GLIBC_2.18 y1l F
 GLIBC_2.18 yn F
 GLIBC_2.18 ynf F
 GLIBC_2.18 ynl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
index b285c9b733..e599e82d6e 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
@@ -369,6 +369,11 @@ GLIBC_2.2 tgammal F
 GLIBC_2.2 trunc F
 GLIBC_2.2 truncf F
 GLIBC_2.2 truncl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 exp2l F
 _gp_disp _gp_disp A
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
index ff42af1f9e..164ba55263 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
@@ -400,4 +400,9 @@ GLIBC_2.2 tgammal F
 GLIBC_2.2 trunc F
 GLIBC_2.2 truncf F
 GLIBC_2.2 truncl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
diff --git a/sysdeps/unix/sysv/linux/nios2/libm.abilist b/sysdeps/unix/sysv/linux/nios2/libm.abilist
index dae4f5e4bd..ad02eff997 100644
--- a/sysdeps/unix/sysv/linux/nios2/libm.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libm.abilist
@@ -367,3 +367,8 @@ GLIBC_2.21 y1l F
 GLIBC_2.21 yn F
 GLIBC_2.21 ynf F
 GLIBC_2.21 ynl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
index e18a51a5b7..5d2f263645 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
@@ -409,6 +409,11 @@ GLIBC_2.2 feraiseexcept F
 GLIBC_2.2 fesetenv F
 GLIBC_2.2 fesetexceptflag F
 GLIBC_2.2 feupdateenv F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
index 90bfd19e7d..8b5edb52a0 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
@@ -408,6 +408,11 @@ GLIBC_2.2 feraiseexcept F
 GLIBC_2.2 fesetenv F
 GLIBC_2.2 fesetexceptflag F
 GLIBC_2.2 feupdateenv F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
index df3457a70b..ee066837af 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
@@ -403,3 +403,8 @@ GLIBC_2.18 GLIBC_2.18 A
 GLIBC_2.18 __issignaling F
 GLIBC_2.18 __issignalingf F
 GLIBC_2.18 __issignalingl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
index ee01f69a12..6c7fc9b4fc 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
@@ -84,6 +84,11 @@ GLIBC_2.18 GLIBC_2.18 A
 GLIBC_2.18 __issignaling F
 GLIBC_2.18 __issignalingf F
 GLIBC_2.18 __issignalingl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 _LIB_VERSION D 0x4
 GLIBC_2.3 __clog10 F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
index e14605bbe7..039ed5c521 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
@@ -398,6 +398,11 @@ GLIBC_2.2 GLIBC_2.2 A
 GLIBC_2.2 fedisableexcept F
 GLIBC_2.2 feenableexcept F
 GLIBC_2.2 fegetexcept F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
index b5abd132f9..66c625daeb 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
@@ -396,6 +396,11 @@ GLIBC_2.2 y1l F
 GLIBC_2.2 yn F
 GLIBC_2.2 ynf F
 GLIBC_2.2 ynl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
diff --git a/sysdeps/unix/sysv/linux/sh/libm.abilist b/sysdeps/unix/sysv/linux/sh/libm.abilist
index 6fabd47dbb..93b84713d8 100644
--- a/sysdeps/unix/sysv/linux/sh/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sh/libm.abilist
@@ -368,5 +368,10 @@ GLIBC_2.2 y1l F
 GLIBC_2.2 yn F
 GLIBC_2.2 ynf F
 GLIBC_2.2 ynl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 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 2a5f5c7c91..d50ef4a920 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
@@ -400,6 +400,11 @@ GLIBC_2.2 feraiseexcept F
 GLIBC_2.2 fesetenv F
 GLIBC_2.2 fesetexceptflag F
 GLIBC_2.2 feupdateenv F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
index 80784c941a..b56add357b 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
@@ -399,4 +399,9 @@ GLIBC_2.2 y1l F
 GLIBC_2.2 yn F
 GLIBC_2.2 ynf F
 GLIBC_2.2 ynl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist
index df50da5464..18b8d00bec 100644
--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist
@@ -368,3 +368,8 @@ GLIBC_2.15 __ynf_finite F
 GLIBC_2.18 GLIBC_2.18 A
 GLIBC_2.18 __issignaling F
 GLIBC_2.18 __issignalingf F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
index df50da5464..18b8d00bec 100644
--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
@@ -368,3 +368,8 @@ GLIBC_2.15 __ynf_finite F
 GLIBC_2.18 GLIBC_2.18 A
 GLIBC_2.18 __issignaling F
 GLIBC_2.18 __issignalingf F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist
index df50da5464..18b8d00bec 100644
--- a/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist
@@ -368,3 +368,8 @@ GLIBC_2.15 __ynf_finite F
 GLIBC_2.18 GLIBC_2.18 A
 GLIBC_2.18 __issignaling F
 GLIBC_2.18 __issignalingf F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
index a2cb7421f4..b911aff114 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
@@ -399,4 +399,9 @@ GLIBC_2.2.5 y1l F
 GLIBC_2.2.5 yn F
 GLIBC_2.2.5 ynf F
 GLIBC_2.2.5 ynl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
index 4d37717671..168c0d87cf 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
@@ -398,3 +398,8 @@ GLIBC_2.18 GLIBC_2.18 A
 GLIBC_2.18 __issignaling F
 GLIBC_2.18 __issignalingf F
 GLIBC_2.18 __issignalingl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F