about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog172
-rw-r--r--NEWS8
-rw-r--r--conform/linknamespace.pl8
-rw-r--r--include/math.h2
-rw-r--r--manual/arith.texi8
-rw-r--r--math/Makefile23
-rw-r--r--math/ieee-math.c6
-rw-r--r--math/lgamma-compat.h1
-rw-r--r--math/libm-test-support.c7
-rw-r--r--math/math-svid-compat.h90
-rw-r--r--math/math.h66
-rw-r--r--math/test-matherr-2.c49
-rw-r--r--math/test-matherr-3.c44
-rw-r--r--math/test-matherr.c28
-rw-r--r--math/w_acos_compat.c1
-rw-r--r--math/w_acosf_compat.c1
-rw-r--r--math/w_acosh_compat.c1
-rw-r--r--math/w_acoshf_compat.c1
-rw-r--r--math/w_acoshl_compat.c1
-rw-r--r--math/w_acosl_compat.c1
-rw-r--r--math/w_asin_compat.c1
-rw-r--r--math/w_asinf_compat.c1
-rw-r--r--math/w_asinl_compat.c1
-rw-r--r--math/w_atan2_compat.c1
-rw-r--r--math/w_atan2f_compat.c1
-rw-r--r--math/w_atan2l_compat.c1
-rw-r--r--math/w_atanh_compat.c1
-rw-r--r--math/w_atanhf_compat.c1
-rw-r--r--math/w_atanhl_compat.c1
-rw-r--r--math/w_cosh_compat.c1
-rw-r--r--math/w_coshf_compat.c1
-rw-r--r--math/w_coshl_compat.c1
-rw-r--r--math/w_exp10_compat.c1
-rw-r--r--math/w_exp10f_compat.c1
-rw-r--r--math/w_exp10l_compat.c1
-rw-r--r--math/w_exp2_compat.c1
-rw-r--r--math/w_exp2f_compat.c1
-rw-r--r--math/w_exp2l_compat.c1
-rw-r--r--math/w_fmod_compat.c1
-rw-r--r--math/w_fmodf_compat.c1
-rw-r--r--math/w_fmodl_compat.c1
-rw-r--r--math/w_hypot_compat.c1
-rw-r--r--math/w_hypotf_compat.c1
-rw-r--r--math/w_hypotl_compat.c1
-rw-r--r--math/w_j0_compat.c1
-rw-r--r--math/w_j0f_compat.c1
-rw-r--r--math/w_j0l_compat.c1
-rw-r--r--math/w_j1_compat.c1
-rw-r--r--math/w_j1f_compat.c1
-rw-r--r--math/w_j1l_compat.c1
-rw-r--r--math/w_jn_compat.c1
-rw-r--r--math/w_jnf_compat.c1
-rw-r--r--math/w_jnl_compat.c1
-rw-r--r--math/w_lgamma_main.c1
-rw-r--r--math/w_lgamma_r_compat.c1
-rw-r--r--math/w_lgammaf_main.c1
-rw-r--r--math/w_lgammaf_r_compat.c1
-rw-r--r--math/w_lgammal_main.c1
-rw-r--r--math/w_lgammal_r_compat.c1
-rw-r--r--math/w_log10_compat.c1
-rw-r--r--math/w_log10f_compat.c1
-rw-r--r--math/w_log10l_compat.c1
-rw-r--r--math/w_log2_compat.c1
-rw-r--r--math/w_log2f_compat.c1
-rw-r--r--math/w_log2l_compat.c1
-rw-r--r--math/w_log_compat.c1
-rw-r--r--math/w_logf_compat.c1
-rw-r--r--math/w_logl_compat.c1
-rw-r--r--math/w_pow_compat.c1
-rw-r--r--math/w_powf_compat.c1
-rw-r--r--math/w_powl_compat.c1
-rw-r--r--math/w_remainder_compat.c2
-rw-r--r--math/w_remainderf_compat.c2
-rw-r--r--math/w_remainderl_compat.c2
-rw-r--r--math/w_scalb_compat.c1
-rw-r--r--math/w_scalbf_compat.c1
-rw-r--r--math/w_scalbl_compat.c1
-rw-r--r--math/w_sinh_compat.c1
-rw-r--r--math/w_sinhf_compat.c1
-rw-r--r--math/w_sinhl_compat.c1
-rw-r--r--math/w_sqrt_compat.c1
-rw-r--r--math/w_sqrtf_compat.c1
-rw-r--r--math/w_sqrtl_compat.c1
-rw-r--r--math/w_tgamma_compat.c1
-rw-r--r--math/w_tgammaf_compat.c1
-rw-r--r--math/w_tgammal_compat.c1
-rw-r--r--sysdeps/generic/math_private.h5
-rw-r--r--sysdeps/ia64/fpu/libm_error.c8
-rw-r--r--sysdeps/ia64/fpu/libm_support.h39
-rw-r--r--sysdeps/ia64/fpu/s_matherrf.c5
-rw-r--r--sysdeps/ia64/fpu/s_matherrl.c5
-rw-r--r--sysdeps/ieee754/dbl-64/w_exp_compat.c1
-rw-r--r--sysdeps/ieee754/flt-32/w_expf_compat.c1
-rw-r--r--sysdeps/ieee754/k_standard.c1
-rw-r--r--sysdeps/ieee754/k_standardf.c1
-rw-r--r--sysdeps/ieee754/k_standardl.c1
-rw-r--r--sysdeps/ieee754/ldbl-128/w_expl_compat.c1
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/w_expl_compat.c1
-rw-r--r--sysdeps/ieee754/ldbl-96/w_expl_compat.c1
-rw-r--r--sysdeps/ieee754/s_lib_version.c22
-rw-r--r--sysdeps/ieee754/s_matherr.c8
-rw-r--r--sysdeps/powerpc/powerpc32/power4/fpu/w_sqrt_compat.S1
-rw-r--r--sysdeps/powerpc/powerpc32/power4/fpu/w_sqrtf_compat.S1
-rw-r--r--sysdeps/powerpc/powerpc32/power5/fpu/w_sqrt_compat.S1
-rw-r--r--sysdeps/powerpc/powerpc32/power5/fpu/w_sqrtf_compat.S1
-rw-r--r--sysdeps/sparc/sparc32/fpu/w_sqrt_compat.S1
-rw-r--r--sysdeps/sparc/sparc32/fpu/w_sqrtf_compat.S1
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/w_sqrt_compat-vis3.S1
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/w_sqrtf_compat-vis3.S1
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/fpu/w_sqrt_compat.S1
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/fpu/w_sqrtf_compat.S1
-rw-r--r--sysdeps/sparc/sparc64/fpu/w_sqrt_compat.S1
-rw-r--r--sysdeps/sparc/sparc64/fpu/w_sqrtf_compat.S1
113 files changed, 524 insertions, 175 deletions
diff --git a/ChangeLog b/ChangeLog
index 768f235a08..f1a1e0b047 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,175 @@
+2017-08-21  Joseph Myers  <joseph@codesourcery.com>
+
+	* math/math.h [__USE_MISC] (_LIB_VERSION_TYPE): Remove.
+	[__USE_MISC] (_LIB_VERSION): Likewise.
+	[__USE_MISC] (struct exception): Likewise.
+	[__USE_MISC] (matherr): Likewise.
+	[__USE_MISC] (DOMAIN): Likewise.
+	[__USE_MISC] (SING): Likewise.
+	[__USE_MISC] (OVERFLOW): Likewise.
+	[__USE_MISC] (UNDERFLOW): Likewise.
+	[__USE_MISC] (TLOSS): Likewise.
+	[__USE_MISC] (PLOSS): Likewise.
+	[__USE_MISC] (HUGE): Likewise.
+	[__USE_XOPEN] (MAXFLOAT): Define even if [__USE_MISC].
+	* math/math-svid-compat.h: New file.
+	* conform/linknamespace.pl (@whitelist): Remove matherr, matherrf
+	and matherrl.
+	* include/math.h [!_ISOMAC] (__matherr): Remove.
+	* manual/arith.texi (FP Exceptions): Do not document matherr.
+	* math/Makefile (tests): Change test-matherr to test-matherr-3.
+	(tests-internal): New variable.
+	(install-lib): Do not add libieee.a.
+	(non-lib.a): Likewise.
+	(extra-objs): Do not add libieee.a and ieee-math.o.
+	(CPPFLAGS-s_lib_version.c): Remove variable.
+	($(objpfx)libieee.a): Remove rule.
+	($(addprefix $(objpfx), $(tests-internal)): Depend on $(libm).
+	* math/ieee-math.c: Remove.
+	* math/libm-test-support.c (matherr): Remove.
+	* math/test-matherr.c: Use <support/test-driver.c>.  Add copyright
+	and license notices.  Include <math-svid-compat.h> and
+	<shlib-compat.h>.
+	(matherr): Undefine as macro.  Use compat_symbol_reference.
+	(_LIB_VERSION): Likewise.
+	* math/test-matherr-2.c: New file.
+	* math/test-matherr-3.c: Likewise.
+	* sysdeps/generic/math_private.h (__kernel_standard): Remove
+	declaration.
+	(__kernel_standard_f): Likewise.
+	(__kernel_standard_l): Likewise.
+	* sysdeps/ieee754/s_lib_version.c: Do not include <math.h> or
+	<math_private.h>.  Include <math-svid-compat.h>.
+	(_LIB_VERSION): Undefine as macro.
+	(_LIB_VERSION_INTERNAL): Always initialize to _POSIX_.  Define
+	only if [LIBM_SVID_COMPAT || !defined SHARED].  If
+	[LIBM_SVID_COMPAT], use compat_symbol.
+	* sysdeps/ieee754/s_matherr.c: Do not include <math.h> or
+	<math_private.h>.  Include <math-svid-compat.h>.
+	(matherr): Undefine as macro.
+	(__matherr): Define only if [LIBM_SVID_COMPAT].  Use
+	compat_symbol.
+	* sysdeps/ia64/fpu/libm_error.c: Include <math-svid-compat.h>.
+	[_LIBC && LIBM_SVID_COMPAT] (matherrf): Use
+	compat_symbol_reference.
+	[_LIBC && LIBM_SVID_COMPAT] (matherrl): Likewise.
+	[_LIBC && !LIBM_SVID_COMPAT] (matherrf): Define as macro.
+	[_LIBC && !LIBM_SVID_COMPAT] (matherrl): Likewise.
+	* sysdeps/ia64/fpu/libm_support.h: Include <math-svid-compat.h>.
+	(MATHERR_D): Remove declaration.
+	[!_LIBC] (_LIB_VERSION_TYPE): Likewise
+	[!LIBM_BUILD] (_LIB_VERSIONIMF): Likewise.
+	[LIBM_BUILD] (pmatherrf): Likewise.
+	[LIBM_BUILD] (pmatherr): Likewise.
+	[LIBM_BUILD] (pmatherrl): Likewise.
+	(DOMAIN): Likewise.
+	(SING): Likewise.
+	(OVERFLOW): Likewise.
+	(UNDERFLOW): Likewise.
+	(TLOSS): Likewise.
+	(PLOSS): Likewise.
+	* sysdeps/ia64/fpu/s_matherrf.c: Include <math-svid-compat.h>.
+	(__matherrf): Define only if [LIBM_SVID_COMPAT].  Use
+	compat_symbol.
+	* sysdeps/ia64/fpu/s_matherrl.c: Include <math-svid-compat.h>.
+	(__matherrl): Define only if [LIBM_SVID_COMPAT].  Use
+	compat_symbol.
+	* math/lgamma-compat.h: Include <math-svid-compat.h>.
+	* math/w_acos_compat.c: Likewise.
+	* math/w_acosf_compat.c: Likewise.
+	* math/w_acosh_compat.c: Likewise.
+	* math/w_acoshf_compat.c: Likewise.
+	* math/w_acoshl_compat.c: Likewise.
+	* math/w_acosl_compat.c: Likewise.
+	* math/w_asin_compat.c: Likewise.
+	* math/w_asinf_compat.c: Likewise.
+	* math/w_asinl_compat.c: Likewise.
+	* math/w_atan2_compat.c: Likewise.
+	* math/w_atan2f_compat.c: Likewise.
+	* math/w_atan2l_compat.c: Likewise.
+	* math/w_atanh_compat.c: Likewise.
+	* math/w_atanhf_compat.c: Likewise.
+	* math/w_atanhl_compat.c: Likewise.
+	* math/w_cosh_compat.c: Likewise.
+	* math/w_coshf_compat.c: Likewise.
+	* math/w_coshl_compat.c: Likewise.
+	* math/w_exp10_compat.c: Likewise.
+	* math/w_exp10f_compat.c: Likewise.
+	* math/w_exp10l_compat.c: Likewise.
+	* math/w_exp2_compat.c: Likewise.
+	* math/w_exp2f_compat.c: Likewise.
+	* math/w_exp2l_compat.c: Likewise.
+	* math/w_fmod_compat.c: Likewise.
+	* math/w_fmodf_compat.c: Likewise.
+	* math/w_fmodl_compat.c: Likewise.
+	* math/w_hypot_compat.c: Likewise.
+	* math/w_hypotf_compat.c: Likewise.
+	* math/w_hypotl_compat.c: Likewise.
+	* math/w_j0_compat.c: Likewise.
+	* math/w_j0f_compat.c: Likewise.
+	* math/w_j0l_compat.c: Likewise.
+	* math/w_j1_compat.c: Likewise.
+	* math/w_j1f_compat.c: Likewise.
+	* math/w_j1l_compat.c: Likewise.
+	* math/w_jn_compat.c: Likewise.
+	* math/w_jnf_compat.c: Likewise.
+	* math/w_jnl_compat.c: Likewise.
+	* math/w_lgamma_main.c: Likewise.
+	* math/w_lgamma_r_compat.c: Likewise.
+	* math/w_lgammaf_main.c: Likewise.
+	* math/w_lgammaf_r_compat.c: Likewise.
+	* math/w_lgammal_main.c: Likewise.
+	* math/w_lgammal_r_compat.c: Likewise.
+	* math/w_log10_compat.c: Likewise.
+	* math/w_log10f_compat.c: Likewise.
+	* math/w_log10l_compat.c: Likewise.
+	* math/w_log2_compat.c: Likewise.
+	* math/w_log2f_compat.c: Likewise.
+	* math/w_log2l_compat.c: Likewise.
+	* math/w_log_compat.c: Likewise.
+	* math/w_logf_compat.c: Likewise.
+	* math/w_logl_compat.c: Likewise.
+	* math/w_pow_compat.c: Likewise.
+	* math/w_powf_compat.c: Likewise.
+	* math/w_powl_compat.c: Likewise.
+	* math/w_remainder_compat.c: Likewise.
+	* math/w_remainderf_compat.c: Likewise.
+	* math/w_remainderl_compat.c: Likewise.
+	* math/w_scalb_compat.c: Likewise.
+	* math/w_scalbf_compat.c: Likewise.
+	* math/w_scalbl_compat.c: Likewise.
+	* math/w_sinh_compat.c: Likewise.
+	* math/w_sinhf_compat.c: Likewise.
+	* math/w_sinhl_compat.c: Likewise.
+	* math/w_sqrt_compat.c: Likewise.
+	* math/w_sqrtf_compat.c: Likewise.
+	* math/w_sqrtl_compat.c: Likewise.
+	* math/w_tgamma_compat.c: Likewise.
+	* math/w_tgammaf_compat.c: Likewise.
+	* math/w_tgammal_compat.c: Likewise.
+	* sysdeps/ieee754/dbl-64/w_exp_compat.c: Likewise.
+	* sysdeps/ieee754/flt-32/w_expf_compat.c: Likewise.
+	* sysdeps/ieee754/k_standard.c: Likewise.
+	* sysdeps/ieee754/k_standardf.c: Likewise.
+	* sysdeps/ieee754/k_standardl.c: Likewise.
+	* sysdeps/ieee754/ldbl-128/w_expl_compat.c: Likewise.
+	* sysdeps/ieee754/ldbl-128ibm/w_expl_compat.c: Likewise.
+	* sysdeps/ieee754/ldbl-96/w_expl_compat.c: Likewise.
+	* sysdeps/powerpc/powerpc32/power4/fpu/w_sqrt_compat.S: Likewise.
+	* sysdeps/powerpc/powerpc32/power4/fpu/w_sqrtf_compat.S: Likewise.
+	* sysdeps/powerpc/powerpc32/power5/fpu/w_sqrt_compat.S: Likewise.
+	* sysdeps/powerpc/powerpc32/power5/fpu/w_sqrtf_compat.S: Likewise.
+	* sysdeps/sparc/sparc32/fpu/w_sqrt_compat.S: Likewise.
+	* sysdeps/sparc/sparc32/fpu/w_sqrtf_compat.S: Likewise.
+	* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/w_sqrt_compat-vis3.S:
+	Likewise.
+	* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/w_sqrtf_compat-vis3.S:
+	Likewise.
+	* sysdeps/sparc/sparc32/sparcv9/fpu/w_sqrt_compat.S: Likewise.
+	* sysdeps/sparc/sparc32/sparcv9/fpu/w_sqrtf_compat.S: Likewise.
+	* sysdeps/sparc/sparc64/fpu/w_sqrt_compat.S: Likewise.
+	* sysdeps/sparc/sparc64/fpu/w_sqrtf_compat.S: Likewise.
+
 2017-08-21  Florian Weimer  <fweimer@redhat.com>
 
 	[BZ #21864]
diff --git a/NEWS b/NEWS
index 6639633c2b..8fe0879bc4 100644
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,14 @@ Deprecated and removed features, and other changes affecting compatibility:
 * On GNU/Linux, the obsolete Linux constant PTRACE_SEIZE_DEVEL is no longer
   defined by <sys/ptrace.h>.
 
+* libm no longer supports SVID error handling (calling a user-provided
+  matherr function on error) or the _LIB_VERSION variable to control error
+  handling.  (SVID error handling and the _LIB_VERSION variable still work
+  for binaries linked against older versions of the GNU C Library.)  The
+  libieee.a library is no longer provided.  math.h no longer defines struct
+  exception, or the macros X_TLOSS, DOMAIN, SING, OVERFLOW, UNDERFLOW,
+  TLOSS, PLOSS and HUGE.
+
 Changes to build and runtime requirements:
 
   [Add changes to build and runtime requirements here]
diff --git a/conform/linknamespace.pl b/conform/linknamespace.pl
index 35257304b9..2ce5388a78 100644
--- a/conform/linknamespace.pl
+++ b/conform/linknamespace.pl
@@ -47,11 +47,7 @@ close (STDSYMS) || die ("close $stdsyms_file: $!\n");
 # * Bug 18442: re_syntax_options wrongly brought in by regcomp and
 # used by re_comp.
 #
-# * False positive: matherr only used conditionally.  matherrf/matherrl are used
-# by IA64 too for the same reason.
-#
-@whitelist = qw(stdin stdout stderr re_syntax_options matherr matherrf
-		matherrl);
+@whitelist = qw(stdin stdout stderr re_syntax_options);
 foreach my $sym (@whitelist) {
   $stdsyms{$sym} = 1;
 }
@@ -134,7 +130,7 @@ foreach my $sym (@sym_data) {
 # possible that (a) any standard library definition is weak, so can be
 # overridden by the user's definition, and (b) the symbol is only used
 # conditionally and not if the program is limited to standard
-# functionality.  (matherr is an example of such a false positive.)
+# functionality.
 #
 # * If a symbol reference is only brought in by the user using a data
 # symbol rather than a function from the standard library, this will
diff --git a/include/math.h b/include/math.h
index fdb43517e1..b62a388b5c 100644
--- a/include/math.h
+++ b/include/math.h
@@ -9,8 +9,6 @@
 
 #ifndef _ISOMAC
 /* Now define the internal interfaces.  */
-extern int __matherr (struct exception *__exc);
-
 extern int __signgam;
 
 # if IS_IN (libc) || IS_IN (libm)
diff --git a/manual/arith.texi b/manual/arith.texi
index 28a0e134d5..d12a6c9d26 100644
--- a/manual/arith.texi
+++ b/manual/arith.texi
@@ -514,14 +514,6 @@ signal.  The default action for this signal is to terminate the
 program.  @xref{Signal Handling}, for how you can change the effect of
 the signal.
 
-@findex matherr
-In the System V math library, the user-defined function @code{matherr}
-is called when certain exceptions occur inside math library functions.
-However, the Unix98 standard deprecates this interface.  We support it
-for historical compatibility, but recommend that you do not use it in
-new programs.  When this interface is used, exceptions may not be
-raised.
-
 @noindent
 The exceptions defined in @w{IEEE 754} are:
 
diff --git a/math/Makefile b/math/Makefile
index e09b0c0545..25d3e95c6c 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -181,7 +181,7 @@ $(inst_libdir)/libm.a: $(common-objpfx)format.lds \
 endif
 
 # Rules for the test suite.
-tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \
+tests = test-matherr-3 test-fenv atest-exp atest-sincos atest-exp2 basic-test \
 	test-misc test-fpucw test-fpucw-ieee tst-definitions test-tgmath \
 	test-tgmath-ret bug-nextafter bug-nexttoward bug-tgmath1 \
 	test-tgmath-int test-tgmath2 test-powl tst-CMPLX tst-CMPLX2 test-snan \
@@ -201,6 +201,7 @@ 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
+tests-internal = test-matherr test-matherr-2
 
 ifneq (,$(CXX))
 tests += test-math-isinff test-math-iszero
@@ -357,12 +358,6 @@ CFLAGS-test-flt-eval-method.c = -fexcess-precision=standard
 
 CFLAGS-test-fe-snans-always-signal.c = -fsignaling-nans
 
-# The -lieee module sets the _LIB_VERSION_ switch to IEEE mode
-# for error handling in the -lm functions.
-install-lib += libieee.a
-non-lib.a += libieee.a
-extra-objs += libieee.a ieee-math.o
-
 include ../Rules
 
 gen-all-calls = $(gen-libm-calls) $(gen-calls)
@@ -542,10 +537,6 @@ endef
 object-suffixes-left := $(all-object-suffixes)
 include $(o-iterator)
 
-# This file defines the default _LIB_VERSION variable that controls
-# the error return conventions for the math functions.
-CPPFLAGS-s_lib_version.c := -D_POSIX_MODE
-
 # We don't want the fdlibm code to use the inline math functions,
 # only the fdlibm code.
 math-CPPFLAGS += -D__NO_MATH_INLINES -D__LIBC_INTERNAL_MATH_INLINES
@@ -566,17 +557,9 @@ CFLAGS-s_modff.c += -fsignaling-nans
 CFLAGS-s_modfl.c += -fsignaling-nans
 CFLAGS-s_modff128.c += -fsignaling-nans
 
-# The -lieee library is actually an object file.
-# The module just defines the _LIB_VERSION_ variable.
-# It's not a library to make sure it is linked in instead of s_lib_version.o.
-$(objpfx)libieee.a: $(objpfx)ieee-math.o
-	rm -f $@
-	$(patsubst %/,cd % &&,$(objpfx)) \
-	$(LN_S) $(<F) $(@F)
-
 $(addprefix $(objpfx),\
 	    $(filter-out $(tests-static) $(libm-tests-vector),\
-			 $(tests))): $(libm)
+			 $(tests) $(tests-internal))): $(libm)
 $(addprefix $(objpfx),$(tests-static)): $(objpfx)libm.a
 define o-iterator-doit
 $(foreach f,$($(o)-funcs),\
diff --git a/math/ieee-math.c b/math/ieee-math.c
deleted file mode 100644
index 99e41a31c0..0000000000
--- a/math/ieee-math.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Linking in this module forces IEEE error handling rules for math functions.
-   The default is POSIX.1 error handling.  */
-
-#include <math.h>
-
-_LIB_VERSION_TYPE _LIB_VERSION = _IEEE_;
diff --git a/math/lgamma-compat.h b/math/lgamma-compat.h
index 90a423756a..189d126882 100644
--- a/math/lgamma-compat.h
+++ b/math/lgamma-compat.h
@@ -19,6 +19,7 @@
 #ifndef LGAMMA_COMPAT_H
 #define LGAMMA_COMPAT_H 1
 
+#include <math-svid-compat.h>
 #include <shlib-compat.h>
 
 /* XSI POSIX requires lgamma to set signgam, but ISO C does not permit
diff --git a/math/libm-test-support.c b/math/libm-test-support.c
index 078d30743d..9ce3eb1c04 100644
--- a/math/libm-test-support.c
+++ b/math/libm-test-support.c
@@ -989,13 +989,6 @@ enable_test (int exceptions)
   return 1;
 }
 
-/* This is to prevent messages from the SVID libm emulation.  */
-int
-matherr (struct exception *x __attribute__ ((unused)))
-{
-  return 1;
-}
-
 static void
 initialize (void)
 {
diff --git a/math/math-svid-compat.h b/math/math-svid-compat.h
new file mode 100644
index 0000000000..284cc13159
--- /dev/null
+++ b/math/math-svid-compat.h
@@ -0,0 +1,90 @@
+/* Declarations for SVID math error handling compatibility.
+   Copyright (C) 1991-2017 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	_MATH_SVID_COMPAT_H
+#define	_MATH_SVID_COMPAT_H	1
+
+#ifndef __ASSEMBLER__
+/* Support for various different standard error handling behaviors.  */
+typedef enum
+{
+  _IEEE_ = -1,	/* According to IEEE 754/IEEE 854.  */
+  _SVID_,	/* According to System V, release 4.  */
+  _XOPEN_,	/* Nowadays also Unix98.  */
+  _POSIX_,
+  _ISOC_	/* Actually this is ISO C99.  */
+} _LIB_VERSION_TYPE;
+
+/* This variable can be changed at run-time to any of the values above to
+   affect floating point error handling behavior (it may also be necessary
+   to change the hardware FPU exception settings).  */
+extern _LIB_VERSION_TYPE _LIB_VERSION;
+
+/* In SVID error handling, `matherr' is called with this description
+   of the exceptional condition.  */
+struct exception
+  {
+    int type;
+    char *name;
+    double arg1;
+    double arg2;
+    double retval;
+  };
+
+extern int matherr (struct exception *__exc);
+extern int __matherr (struct exception *__exc);
+
+# define X_TLOSS	1.41484755040568800000e+16
+
+/* Types of exceptions in the `type' field.  */
+# define DOMAIN		1
+# define SING		2
+# define OVERFLOW	3
+# define UNDERFLOW	4
+# define TLOSS		5
+# define PLOSS		6
+
+/* SVID mode specifies returning this large value instead of infinity.  */
+# define HUGE		3.40282347e+38F
+#endif
+
+/* The above definitions may be used in testcases.  The following code
+   is only used in the implementation.  */
+
+#ifdef _LIBC
+# ifndef __ASSEMBLER__
+/* fdlibm kernel function */
+extern double __kernel_standard (double, double, int);
+extern float __kernel_standard_f (float, float, int);
+extern long double __kernel_standard_l (long double, long double, int);
+# endif
+
+# include <shlib-compat.h>
+# define LIBM_SVID_COMPAT SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_27)
+# if LIBM_SVID_COMPAT
+compat_symbol_reference (libm, matherr, matherr, GLIBC_2_0);
+compat_symbol_reference (libm, _LIB_VERSION, _LIB_VERSION, GLIBC_2_0);
+# elif !defined __ASSEMBLER__
+/* Except when building compat code, optimize out references to
+   _LIB_VERSION and matherr.  */
+#  define _LIB_VERSION _POSIX_
+#  define matherr(EXC) ((void) (EXC), 0)
+# endif
+#endif
+
+#endif /* math-svid-compat.h.  */
diff --git a/math/math.h b/math/math.h
index dea8dbe1ae..275534be11 100644
--- a/math/math.h
+++ b/math/math.h
@@ -501,70 +501,10 @@ iszero (__T __val)
 # endif	/* __cplusplus */
 #endif /* Use IEC_60559_BFP_EXT.  */
 
-#ifdef	__USE_MISC
-/* Support for various different standard error handling behaviors.  */
-typedef enum
-{
-  _IEEE_ = -1,	/* According to IEEE 754/IEEE 854.  */
-  _SVID_,	/* According to System V, release 4.  */
-  _XOPEN_,	/* Nowadays also Unix98.  */
-  _POSIX_,
-  _ISOC_	/* Actually this is ISO C99.  */
-} _LIB_VERSION_TYPE;
-
-/* This variable can be changed at run-time to any of the values above to
-   affect floating point error handling behavior (it may also be necessary
-   to change the hardware FPU exception settings).  */
-extern _LIB_VERSION_TYPE _LIB_VERSION;
-#endif
-
-
-#ifdef __USE_MISC
-/* In SVID error handling, `matherr' is called with this description
-   of the exceptional condition.
-
-   We have a problem when using C++ since `exception' is a reserved
-   name in C++.  */
-# ifdef __cplusplus
-struct __exception
-# else
-struct exception
-# endif
-  {
-    int type;
-    char *name;
-    double arg1;
-    double arg2;
-    double retval;
-  };
-
-# ifdef __cplusplus
-extern int matherr (struct __exception *__exc) throw ();
-# else
-extern int matherr (struct exception *__exc);
-# endif
-
-# define X_TLOSS	1.41484755040568800000e+16
-
-/* Types of exceptions in the `type' field.  */
-# define DOMAIN		1
-# define SING		2
-# define OVERFLOW	3
-# define UNDERFLOW	4
-# define TLOSS		5
-# define PLOSS		6
-
-/* SVID mode specifies returning this large value instead of infinity.  */
-# define HUGE		3.40282347e+38F
-
-#else	/* !Misc.  */
-
-# ifdef __USE_XOPEN
+#ifdef __USE_XOPEN
 /* X/Open wants another strange constant.  */
-#  define MAXFLOAT	3.40282347e+38F
-# endif
-
-#endif	/* Misc.  */
+# define MAXFLOAT	3.40282347e+38F
+#endif
 
 
 /* Some useful constants.  */
diff --git a/math/test-matherr-2.c b/math/test-matherr-2.c
new file mode 100644
index 0000000000..c2fc5e63c8
--- /dev/null
+++ b/math/test-matherr-2.c
@@ -0,0 +1,49 @@
+/* Test matherr (compat symbols, binary defines own _LIB_VERSION).
+   Copyright (C) 1997-2017 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/>.  */
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <math-svid-compat.h>
+#include <shlib-compat.h>
+#undef matherr
+#undef _LIB_VERSION
+compat_symbol_reference (libm, matherr, matherr, GLIBC_2_0);
+compat_symbol_reference (libm, _LIB_VERSION, _LIB_VERSION, GLIBC_2_0);
+
+_LIB_VERSION_TYPE _LIB_VERSION = _SVID_;
+
+static int fail = 1;
+
+int
+matherr (struct exception *s)
+{
+  printf ("matherr is working\n");
+  fail = 0;
+  return 1;
+}
+
+static int
+do_test (void)
+{
+  acos (2.0);
+  return fail;
+}
+
+#include <support/test-driver.c>
diff --git a/math/test-matherr-3.c b/math/test-matherr-3.c
new file mode 100644
index 0000000000..c81a04ff78
--- /dev/null
+++ b/math/test-matherr-3.c
@@ -0,0 +1,44 @@
+/* Test matherr not supported for new binaries.
+   Copyright (C) 1997-2017 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/>.  */
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <math-svid-compat.h>
+
+_LIB_VERSION_TYPE _LIB_VERSION = _SVID_;
+
+static int fail = 0;
+
+int
+matherr (struct exception *s)
+{
+  printf ("matherr is working, but should not be\n");
+  fail = 1;
+  return 1;
+}
+
+static int
+do_test (void)
+{
+  acos (2.0);
+  return fail;
+}
+
+#include <support/test-driver.c>
diff --git a/math/test-matherr.c b/math/test-matherr.c
index 6983879da4..34856f1ffb 100644
--- a/math/test-matherr.c
+++ b/math/test-matherr.c
@@ -1,7 +1,32 @@
+/* Test matherr (compat symbols, binary modifies library's _LIB_VERSION).
+   Copyright (C) 1997-2017 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/>.  */
+
 #include <math.h>
 #include <stdio.h>
 #include <stdlib.h>
 
+#include <math-svid-compat.h>
+#include <shlib-compat.h>
+#undef matherr
+#undef _LIB_VERSION
+compat_symbol_reference (libm, matherr, matherr, GLIBC_2_0);
+compat_symbol_reference (libm, _LIB_VERSION, _LIB_VERSION, GLIBC_2_0);
+
 static int fail = 1;
 
 int
@@ -20,5 +45,4 @@ do_test (void)
   return fail;
 }
 
-#define TEST_FUNCTION do_test ()
-#include "../test-skeleton.c"
+#include <support/test-driver.c>
diff --git a/math/w_acos_compat.c b/math/w_acos_compat.c
index e6fbdf139c..5115732a83 100644
--- a/math/w_acos_compat.c
+++ b/math/w_acos_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper acos */
diff --git a/math/w_acosf_compat.c b/math/w_acosf_compat.c
index f389da19ba..0bf557c9c5 100644
--- a/math/w_acosf_compat.c
+++ b/math/w_acosf_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper acosf */
diff --git a/math/w_acosh_compat.c b/math/w_acosh_compat.c
index 286ea86b89..31251ce760 100644
--- a/math/w_acosh_compat.c
+++ b/math/w_acosh_compat.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper acosh */
diff --git a/math/w_acoshf_compat.c b/math/w_acoshf_compat.c
index 801a52edf0..6a4482e534 100644
--- a/math/w_acoshf_compat.c
+++ b/math/w_acoshf_compat.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper acoshf */
diff --git a/math/w_acoshl_compat.c b/math/w_acoshl_compat.c
index 310f3c9954..b9f66c53ef 100644
--- a/math/w_acoshl_compat.c
+++ b/math/w_acoshl_compat.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper acosl */
diff --git a/math/w_acosl_compat.c b/math/w_acosl_compat.c
index eaccc6646d..66600b5d38 100644
--- a/math/w_acosl_compat.c
+++ b/math/w_acosl_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper acosl */
diff --git a/math/w_asin_compat.c b/math/w_asin_compat.c
index b2ad6323ed..59beea817d 100644
--- a/math/w_asin_compat.c
+++ b/math/w_asin_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper asin */
diff --git a/math/w_asinf_compat.c b/math/w_asinf_compat.c
index 0d0ee98f98..0eb20b10b5 100644
--- a/math/w_asinf_compat.c
+++ b/math/w_asinf_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper asinf */
diff --git a/math/w_asinl_compat.c b/math/w_asinl_compat.c
index a02fa1e04c..c8f4d150c6 100644
--- a/math/w_asinl_compat.c
+++ b/math/w_asinl_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper asinl */
diff --git a/math/w_atan2_compat.c b/math/w_atan2_compat.c
index cceb602258..fa098ffeb7 100644
--- a/math/w_atan2_compat.c
+++ b/math/w_atan2_compat.c
@@ -23,6 +23,7 @@
 #include <errno.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 double
diff --git a/math/w_atan2f_compat.c b/math/w_atan2f_compat.c
index 8343893e74..15e05d8253 100644
--- a/math/w_atan2f_compat.c
+++ b/math/w_atan2f_compat.c
@@ -23,6 +23,7 @@
 #include <errno.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 float
diff --git a/math/w_atan2l_compat.c b/math/w_atan2l_compat.c
index b7b29ff6c3..87b73948da 100644
--- a/math/w_atan2l_compat.c
+++ b/math/w_atan2l_compat.c
@@ -23,6 +23,7 @@
 #include <errno.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 long double
diff --git a/math/w_atanh_compat.c b/math/w_atanh_compat.c
index 456dcb34e7..f7a43beb09 100644
--- a/math/w_atanh_compat.c
+++ b/math/w_atanh_compat.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper atanh */
diff --git a/math/w_atanhf_compat.c b/math/w_atanhf_compat.c
index dd14145c1c..c9d2c3a3ae 100644
--- a/math/w_atanhf_compat.c
+++ b/math/w_atanhf_compat.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper atanhf */
diff --git a/math/w_atanhl_compat.c b/math/w_atanhl_compat.c
index 37e8da598a..56f9f1ed61 100644
--- a/math/w_atanhl_compat.c
+++ b/math/w_atanhl_compat.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper atanhl */
diff --git a/math/w_cosh_compat.c b/math/w_cosh_compat.c
index 0771434ec1..fd16436520 100644
--- a/math/w_cosh_compat.c
+++ b/math/w_cosh_compat.c
@@ -16,6 +16,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 double
 __cosh (double x)
diff --git a/math/w_coshf_compat.c b/math/w_coshf_compat.c
index dc7fb53ba3..dd62281693 100644
--- a/math/w_coshf_compat.c
+++ b/math/w_coshf_compat.c
@@ -20,6 +20,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 float
 __coshf (float x)
diff --git a/math/w_coshl_compat.c b/math/w_coshl_compat.c
index 27f0a4f4c3..5fa32bea88 100644
--- a/math/w_coshl_compat.c
+++ b/math/w_coshl_compat.c
@@ -21,6 +21,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 long double
 __coshl (long double x)
diff --git a/math/w_exp10_compat.c b/math/w_exp10_compat.c
index 1ba9279e8b..64f1d19950 100644
--- a/math/w_exp10_compat.c
+++ b/math/w_exp10_compat.c
@@ -23,6 +23,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 double
 __exp10 (double x)
diff --git a/math/w_exp10f_compat.c b/math/w_exp10f_compat.c
index 7993945900..5cf926aee2 100644
--- a/math/w_exp10f_compat.c
+++ b/math/w_exp10f_compat.c
@@ -23,6 +23,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 float
 __exp10f (float x)
diff --git a/math/w_exp10l_compat.c b/math/w_exp10l_compat.c
index 27344686c3..06f5267a8f 100644
--- a/math/w_exp10l_compat.c
+++ b/math/w_exp10l_compat.c
@@ -23,6 +23,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 long double
 __exp10l (long double x)
diff --git a/math/w_exp2_compat.c b/math/w_exp2_compat.c
index ca17f9ea63..a4d4653708 100644
--- a/math/w_exp2_compat.c
+++ b/math/w_exp2_compat.c
@@ -4,6 +4,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 double
 __exp2 (double x)
diff --git a/math/w_exp2f_compat.c b/math/w_exp2f_compat.c
index 61cbd6cda1..b21fe36903 100644
--- a/math/w_exp2f_compat.c
+++ b/math/w_exp2f_compat.c
@@ -4,6 +4,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 float
 __exp2f (float x)
diff --git a/math/w_exp2l_compat.c b/math/w_exp2l_compat.c
index 47aed3cb83..04cd666b68 100644
--- a/math/w_exp2l_compat.c
+++ b/math/w_exp2l_compat.c
@@ -4,6 +4,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 long double
 __exp2l (long double x)
diff --git a/math/w_fmod_compat.c b/math/w_fmod_compat.c
index 746550a33c..1079d3a603 100644
--- a/math/w_fmod_compat.c
+++ b/math/w_fmod_compat.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 /* wrapper fmod */
 double
diff --git a/math/w_fmodf_compat.c b/math/w_fmodf_compat.c
index 45ece587c8..88b64a24bd 100644
--- a/math/w_fmodf_compat.c
+++ b/math/w_fmodf_compat.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 /* wrapper fmodf */
 float
diff --git a/math/w_fmodl_compat.c b/math/w_fmodl_compat.c
index 1f385bdbae..23422fa652 100644
--- a/math/w_fmodl_compat.c
+++ b/math/w_fmodl_compat.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 /* wrapper fmodl */
 long double
diff --git a/math/w_hypot_compat.c b/math/w_hypot_compat.c
index 7c662c8e40..ff3774cf62 100644
--- a/math/w_hypot_compat.c
+++ b/math/w_hypot_compat.c
@@ -16,6 +16,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 double
diff --git a/math/w_hypotf_compat.c b/math/w_hypotf_compat.c
index 0ecacae715..0a43d90a00 100644
--- a/math/w_hypotf_compat.c
+++ b/math/w_hypotf_compat.c
@@ -19,6 +19,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 float
diff --git a/math/w_hypotl_compat.c b/math/w_hypotl_compat.c
index c784fa2c64..13060f74a7 100644
--- a/math/w_hypotl_compat.c
+++ b/math/w_hypotl_compat.c
@@ -20,6 +20,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 long double
diff --git a/math/w_j0_compat.c b/math/w_j0_compat.c
index e7b56f2412..80d21acde1 100644
--- a/math/w_j0_compat.c
+++ b/math/w_j0_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper j0 */
diff --git a/math/w_j0f_compat.c b/math/w_j0f_compat.c
index 34220b90b8..36fc4f9443 100644
--- a/math/w_j0f_compat.c
+++ b/math/w_j0f_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper j0f */
diff --git a/math/w_j0l_compat.c b/math/w_j0l_compat.c
index e03fa1d223..ff7e1b1456 100644
--- a/math/w_j0l_compat.c
+++ b/math/w_j0l_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper j0l */
diff --git a/math/w_j1_compat.c b/math/w_j1_compat.c
index efbe8df5e0..f7a76c10d5 100644
--- a/math/w_j1_compat.c
+++ b/math/w_j1_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper j1 */
diff --git a/math/w_j1f_compat.c b/math/w_j1f_compat.c
index 7558685946..9aa5c8c4fd 100644
--- a/math/w_j1f_compat.c
+++ b/math/w_j1f_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper j1f */
diff --git a/math/w_j1l_compat.c b/math/w_j1l_compat.c
index f35261dd2a..7e6d9f57f2 100644
--- a/math/w_j1l_compat.c
+++ b/math/w_j1l_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper j1l */
diff --git a/math/w_jn_compat.c b/math/w_jn_compat.c
index 9321bf5e7d..7c49992cf4 100644
--- a/math/w_jn_compat.c
+++ b/math/w_jn_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper jn */
diff --git a/math/w_jnf_compat.c b/math/w_jnf_compat.c
index 9752b2a8c5..ead40e7a60 100644
--- a/math/w_jnf_compat.c
+++ b/math/w_jnf_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper jnf */
diff --git a/math/w_jnl_compat.c b/math/w_jnl_compat.c
index d17b047956..bc416359c2 100644
--- a/math/w_jnl_compat.c
+++ b/math/w_jnl_compat.c
@@ -46,6 +46,7 @@ static char rcsid[] = "$NetBSD: $";
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 long double __jnl(int n, long double x)	/* wrapper jnl */
 {
diff --git a/math/w_lgamma_main.c b/math/w_lgamma_main.c
index cdea331f1a..7dbba22f4e 100644
--- a/math/w_lgamma_main.c
+++ b/math/w_lgamma_main.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 #include <lgamma-compat.h>
 
diff --git a/math/w_lgamma_r_compat.c b/math/w_lgamma_r_compat.c
index 6578b2c76c..3f7fbce62b 100644
--- a/math/w_lgamma_r_compat.c
+++ b/math/w_lgamma_r_compat.c
@@ -16,6 +16,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 double
diff --git a/math/w_lgammaf_main.c b/math/w_lgammaf_main.c
index ba7ff0e573..a3d7e1ae99 100644
--- a/math/w_lgammaf_main.c
+++ b/math/w_lgammaf_main.c
@@ -15,6 +15,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 #include <lgamma-compat.h>
 
diff --git a/math/w_lgammaf_r_compat.c b/math/w_lgammaf_r_compat.c
index d7d2cb8bc1..d9601f45d7 100644
--- a/math/w_lgammaf_r_compat.c
+++ b/math/w_lgammaf_r_compat.c
@@ -19,6 +19,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 float
diff --git a/math/w_lgammal_main.c b/math/w_lgammal_main.c
index c3c41f6fff..447fb97cb7 100644
--- a/math/w_lgammal_main.c
+++ b/math/w_lgammal_main.c
@@ -22,6 +22,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 #include <lgamma-compat.h>
 
diff --git a/math/w_lgammal_r_compat.c b/math/w_lgammal_r_compat.c
index 7caeb1264f..d1b58e42dd 100644
--- a/math/w_lgammal_r_compat.c
+++ b/math/w_lgammal_r_compat.c
@@ -20,6 +20,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 long double
diff --git a/math/w_log10_compat.c b/math/w_log10_compat.c
index 9704ba9cdc..6f3eb3408c 100644
--- a/math/w_log10_compat.c
+++ b/math/w_log10_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper log10(x) */
diff --git a/math/w_log10f_compat.c b/math/w_log10f_compat.c
index f8921fe285..2cb5c9a1bb 100644
--- a/math/w_log10f_compat.c
+++ b/math/w_log10f_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper log10f(x) */
diff --git a/math/w_log10l_compat.c b/math/w_log10l_compat.c
index cfb514a8ab..0063c50778 100644
--- a/math/w_log10l_compat.c
+++ b/math/w_log10l_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper log10l(x) */
diff --git a/math/w_log2_compat.c b/math/w_log2_compat.c
index b8e842d5be..252fc0d86a 100644
--- a/math/w_log2_compat.c
+++ b/math/w_log2_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper log2(x) */
diff --git a/math/w_log2f_compat.c b/math/w_log2f_compat.c
index 357cc0afe9..6adaff6c72 100644
--- a/math/w_log2f_compat.c
+++ b/math/w_log2f_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper log2f(x) */
diff --git a/math/w_log2l_compat.c b/math/w_log2l_compat.c
index 3d9994e055..f496c3630e 100644
--- a/math/w_log2l_compat.c
+++ b/math/w_log2l_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper log2l(x) */
diff --git a/math/w_log_compat.c b/math/w_log_compat.c
index 4b470695ae..82f3ff4eec 100644
--- a/math/w_log_compat.c
+++ b/math/w_log_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper log(x) */
diff --git a/math/w_logf_compat.c b/math/w_logf_compat.c
index 8b0f4fc9d1..ac18b65c5e 100644
--- a/math/w_logf_compat.c
+++ b/math/w_logf_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper logf(x) */
diff --git a/math/w_logl_compat.c b/math/w_logl_compat.c
index 12afbe575a..ba65830b67 100644
--- a/math/w_logl_compat.c
+++ b/math/w_logl_compat.c
@@ -19,6 +19,7 @@
 #include <fenv.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper logl(x) */
diff --git a/math/w_pow_compat.c b/math/w_pow_compat.c
index 0e24b755b2..367f609dc2 100644
--- a/math/w_pow_compat.c
+++ b/math/w_pow_compat.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper pow */
diff --git a/math/w_powf_compat.c b/math/w_powf_compat.c
index 7e3b015001..afc3fced80 100644
--- a/math/w_powf_compat.c
+++ b/math/w_powf_compat.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper powf */
diff --git a/math/w_powl_compat.c b/math/w_powl_compat.c
index 60a89c2b42..b25dad870d 100644
--- a/math/w_powl_compat.c
+++ b/math/w_powl_compat.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper powl */
diff --git a/math/w_remainder_compat.c b/math/w_remainder_compat.c
index 66445901f6..27fa14f207 100644
--- a/math/w_remainder_compat.c
+++ b/math/w_remainder_compat.c
@@ -18,6 +18,8 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper remainder */
diff --git a/math/w_remainderf_compat.c b/math/w_remainderf_compat.c
index 1db246a1c3..627b4f1de1 100644
--- a/math/w_remainderf_compat.c
+++ b/math/w_remainderf_compat.c
@@ -18,6 +18,8 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper remainderf */
diff --git a/math/w_remainderl_compat.c b/math/w_remainderl_compat.c
index 2fc40f1992..985847598b 100644
--- a/math/w_remainderl_compat.c
+++ b/math/w_remainderl_compat.c
@@ -18,6 +18,8 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper remainderl */
diff --git a/math/w_scalb_compat.c b/math/w_scalb_compat.c
index 8354115512..a31e54dd78 100644
--- a/math/w_scalb_compat.c
+++ b/math/w_scalb_compat.c
@@ -19,6 +19,7 @@
 #include <errno.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 static double
diff --git a/math/w_scalbf_compat.c b/math/w_scalbf_compat.c
index fe93f0ac64..2b96df0cbf 100644
--- a/math/w_scalbf_compat.c
+++ b/math/w_scalbf_compat.c
@@ -19,6 +19,7 @@
 #include <errno.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 static float
diff --git a/math/w_scalbl_compat.c b/math/w_scalbl_compat.c
index 62645d4848..a4a0f8e942 100644
--- a/math/w_scalbl_compat.c
+++ b/math/w_scalbl_compat.c
@@ -19,6 +19,7 @@
 #include <errno.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 static long double
diff --git a/math/w_sinh_compat.c b/math/w_sinh_compat.c
index 51daf2ff35..121edfc892 100644
--- a/math/w_sinh_compat.c
+++ b/math/w_sinh_compat.c
@@ -16,6 +16,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 double
 __sinh (double x)
diff --git a/math/w_sinhf_compat.c b/math/w_sinhf_compat.c
index 0e530b1600..2103b06253 100644
--- a/math/w_sinhf_compat.c
+++ b/math/w_sinhf_compat.c
@@ -19,6 +19,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 float
 __sinhf (float x)
diff --git a/math/w_sinhl_compat.c b/math/w_sinhl_compat.c
index 7df7c0614f..57f08e7ecc 100644
--- a/math/w_sinhl_compat.c
+++ b/math/w_sinhl_compat.c
@@ -20,6 +20,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 long double
 __sinhl (long double x)
diff --git a/math/w_sqrt_compat.c b/math/w_sqrt_compat.c
index 018da82e7a..743df321d5 100644
--- a/math/w_sqrt_compat.c
+++ b/math/w_sqrt_compat.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper sqrt */
diff --git a/math/w_sqrtf_compat.c b/math/w_sqrtf_compat.c
index de5b42d8f6..0689b4bb1a 100644
--- a/math/w_sqrtf_compat.c
+++ b/math/w_sqrtf_compat.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper sqrtf */
diff --git a/math/w_sqrtl_compat.c b/math/w_sqrtl_compat.c
index b4663b71e0..43e81acf0a 100644
--- a/math/w_sqrtl_compat.c
+++ b/math/w_sqrtl_compat.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* wrapper sqrtl */
diff --git a/math/w_tgamma_compat.c b/math/w_tgamma_compat.c
index 99b60298ca..93bd48fd3f 100644
--- a/math/w_tgamma_compat.c
+++ b/math/w_tgamma_compat.c
@@ -18,6 +18,7 @@
 #include <errno.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 double
 __tgamma(double x)
diff --git a/math/w_tgammaf_compat.c b/math/w_tgammaf_compat.c
index dfce894cc8..e6ae48c1f5 100644
--- a/math/w_tgammaf_compat.c
+++ b/math/w_tgammaf_compat.c
@@ -16,6 +16,7 @@
 #include <errno.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 float
 __tgammaf(float x)
diff --git a/math/w_tgammal_compat.c b/math/w_tgammal_compat.c
index 50de8cf906..306f672077 100644
--- a/math/w_tgammal_compat.c
+++ b/math/w_tgammal_compat.c
@@ -21,6 +21,7 @@
 #include <errno.h>
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 long double
 __tgammal(long double x)
diff --git a/sysdeps/generic/math_private.h b/sysdeps/generic/math_private.h
index 4d962e1d09..80c7c92108 100644
--- a/sysdeps/generic/math_private.h
+++ b/sysdeps/generic/math_private.h
@@ -249,11 +249,6 @@ fabsf128 (_Float128 x)
 
 
 
-/* fdlibm kernel function */
-extern double __kernel_standard (double,double,int);
-extern float __kernel_standard_f (float,float,int);
-extern long double __kernel_standard_l (long double,long double,int);
-
 /* Prototypes for functions of the IBM Accurate Mathematical Library.  */
 extern double __exp1 (double __x, double __xx, double __error);
 extern double __sin (double __x);
diff --git a/sysdeps/ia64/fpu/libm_error.c b/sysdeps/ia64/fpu/libm_error.c
index a9307dd4b5..34d1466e09 100644
--- a/sysdeps/ia64/fpu/libm_error.c
+++ b/sysdeps/ia64/fpu/libm_error.c
@@ -91,11 +91,19 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include "libm_support.h"
+#include <math-svid-compat.h>
 
 #ifdef _LIBC
 # define pmatherr matherr
 # define pmatherrf matherrf
 # define pmatherrl matherrl
+# if LIBM_SVID_COMPAT
+compat_symbol_reference (libm, matherrf, matherrf, GLIBC_2_2_3);
+compat_symbol_reference (libm, matherrl, matherrl, GLIBC_2_2_3);
+# else
+#  define matherrf(EXC) ((void) (EXC), 0)
+#  define matherrl(EXC) ((void) (EXC), 0)
+# endif
 #else
 _LIB_VERSION_TYPE
 #if defined( __POSIX__ )
diff --git a/sysdeps/ia64/fpu/libm_support.h b/sysdeps/ia64/fpu/libm_support.h
index dc9c0a2648..4e7a66799d 100644
--- a/sysdeps/ia64/fpu/libm_support.h
+++ b/sysdeps/ia64/fpu/libm_support.h
@@ -83,6 +83,8 @@
 #ifndef __LIBM_SUPPORT_H_INCLUDED__
 #define __LIBM_SUPPORT_H_INCLUDED__
 
+#include <math-svid-compat.h>
+
 #ifndef _LIBC
 #if !(defined(_WIN32) || defined(_WIN64))
 # pragma const_seg(".rodata") /* place constant data in text (code) section */
@@ -156,36 +158,8 @@ struct exceptionl
 #endif
 
 extern int MATHERR_F(struct exceptionf*);
-extern int MATHERR_D(struct EXC_DECL_D*);
 extern int matherrl(struct exceptionl*);
 
-#ifndef _LIBC
-// Add code to support _LIB_VERSIONIMF
-typedef enum
-{
-    _IEEE_ = -1, // IEEE-like behavior
-    _SVID_,      // SysV, Rel. 4 behavior
-    _XOPEN_,     // Unix98
-    _POSIX_,     // Posix
-    _ISOC_       // ISO C9X
-} _LIB_VERSION_TYPE;
-#endif
-
-// This is a run-time variable and may affect
-// floating point behavior of the libm functions
-
-#if !defined( LIBM_BUILD )
-#if defined( _DLL )
-extern _LIB_VERSION_TYPE __declspec(dllimport) _LIB_VERSIONIMF;
-#else
-extern _LIB_VERSION_TYPE _LIB_VERSIONIMF;
-#endif  /* _DLL */
-#else
-extern int (*pmatherrf)(struct exceptionf*);
-extern int (*pmatherr)(struct EXC_DECL_D*);
-extern int (*pmatherrl)(struct exceptionl*);
-#endif  /* LIBM_BUILD */
-
 /* memory format definitions (LITTLE_ENDIAN only) */
 
 #if !(defined(SIZE_INT_32) || defined(SIZE_INT_64))
@@ -1031,15 +1005,6 @@ struct ker80 {
 #endif
 
 
-/* error codes */
-
-#define DOMAIN     1   /* argument domain error */
-#define SING       2   /* argument singularity */
-#define OVERFLOW   3   /* overflow range error */
-#define UNDERFLOW  4   /* underflow range error */
-#define TLOSS      5   /* total loss of precision */
-#define PLOSS      6   /* partial loss of precision */
-
 /* */
 
 #define VOLATILE_32 /*volatile*/
diff --git a/sysdeps/ia64/fpu/s_matherrf.c b/sysdeps/ia64/fpu/s_matherrf.c
index a47d4b89a2..5808c04573 100644
--- a/sysdeps/ia64/fpu/s_matherrf.c
+++ b/sysdeps/ia64/fpu/s_matherrf.c
@@ -13,8 +13,10 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 #include "libm_support.h"
 
+#if LIBM_SVID_COMPAT
 int
 weak_function
 __matherrf(struct exceptionf *x)
@@ -23,4 +25,5 @@ __matherrf(struct exceptionf *x)
 	if(x->arg1!=x->arg1) return 0;
 	return n;
 }
-weak_alias (__matherrf, matherrf)
+compat_symbol (libm, __matherrf, matherrf, GLIBC_2_2_3);
+#endif
diff --git a/sysdeps/ia64/fpu/s_matherrl.c b/sysdeps/ia64/fpu/s_matherrl.c
index 6fe92d7739..dc64b31e50 100644
--- a/sysdeps/ia64/fpu/s_matherrl.c
+++ b/sysdeps/ia64/fpu/s_matherrl.c
@@ -13,8 +13,10 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 #include "libm_support.h"
 
+#if LIBM_SVID_COMPAT
 int
 weak_function
 __matherrl(struct exceptionl *x)
@@ -23,4 +25,5 @@ __matherrl(struct exceptionl *x)
 	if(x->arg1!=x->arg1) return 0;
 	return n;
 }
-weak_alias (__matherrl, matherrl)
+compat_symbol (libm, __matherrl, matherrl, GLIBC_2_2_3);
+#endif
diff --git a/sysdeps/ieee754/dbl-64/w_exp_compat.c b/sysdeps/ieee754/dbl-64/w_exp_compat.c
index e61e03b335..69ec0a1ebc 100644
--- a/sysdeps/ieee754/dbl-64/w_exp_compat.c
+++ b/sysdeps/ieee754/dbl-64/w_exp_compat.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 /* wrapper exp */
 double
diff --git a/sysdeps/ieee754/flt-32/w_expf_compat.c b/sysdeps/ieee754/flt-32/w_expf_compat.c
index b2be6aa7e1..8a1fa51e46 100644
--- a/sysdeps/ieee754/flt-32/w_expf_compat.c
+++ b/sysdeps/ieee754/flt-32/w_expf_compat.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 /* wrapper expf */
 float
diff --git a/sysdeps/ieee754/k_standard.c b/sysdeps/ieee754/k_standard.c
index b100b3e351..0a0201f1d5 100644
--- a/sysdeps/ieee754/k_standard.c
+++ b/sysdeps/ieee754/k_standard.c
@@ -16,6 +16,7 @@ static char rcsid[] = "$NetBSD: k_standard.c,v 1.6 1995/05/10 20:46:35 jtc Exp $
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 #include <errno.h>
 
 #include <assert.h>
diff --git a/sysdeps/ieee754/k_standardf.c b/sysdeps/ieee754/k_standardf.c
index 678b38d91a..85b2003daf 100644
--- a/sysdeps/ieee754/k_standardf.c
+++ b/sysdeps/ieee754/k_standardf.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 
 /* Handle errors for a libm function as specified by TYPE (see
diff --git a/sysdeps/ieee754/k_standardl.c b/sysdeps/ieee754/k_standardl.c
index 08d789f942..783fd0b87d 100644
--- a/sysdeps/ieee754/k_standardl.c
+++ b/sysdeps/ieee754/k_standardl.c
@@ -32,6 +32,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 #include <fenv.h>
 #include <float.h>
 #include <errno.h>
diff --git a/sysdeps/ieee754/ldbl-128/w_expl_compat.c b/sysdeps/ieee754/ldbl-128/w_expl_compat.c
index c32616e504..e0fa9e3501 100644
--- a/sysdeps/ieee754/ldbl-128/w_expl_compat.c
+++ b/sysdeps/ieee754/ldbl-128/w_expl_compat.c
@@ -24,6 +24,7 @@ static char rcsid[] = "$NetBSD: $";
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 long double __expl(long double x)	/* wrapper exp */
 {
diff --git a/sysdeps/ieee754/ldbl-128ibm/w_expl_compat.c b/sysdeps/ieee754/ldbl-128ibm/w_expl_compat.c
index c9d44b61dd..019a48fb0d 100644
--- a/sysdeps/ieee754/ldbl-128ibm/w_expl_compat.c
+++ b/sysdeps/ieee754/ldbl-128ibm/w_expl_compat.c
@@ -1,5 +1,6 @@
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 #include <math_ldbl_opt.h>
 
 long double __expl(long double x)	/* wrapper exp  */
diff --git a/sysdeps/ieee754/ldbl-96/w_expl_compat.c b/sysdeps/ieee754/ldbl-96/w_expl_compat.c
index a0b852a3e2..c9e6003a43 100644
--- a/sysdeps/ieee754/ldbl-96/w_expl_compat.c
+++ b/sysdeps/ieee754/ldbl-96/w_expl_compat.c
@@ -18,6 +18,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <math-svid-compat.h>
 
 /* wrapper expl */
 long double
diff --git a/sysdeps/ieee754/s_lib_version.c b/sysdeps/ieee754/s_lib_version.c
index bb59300953..f11d1c31f6 100644
--- a/sysdeps/ieee754/s_lib_version.c
+++ b/sysdeps/ieee754/s_lib_version.c
@@ -18,24 +18,18 @@ static char rcsid[] = "$NetBSD: s_lib_version.c,v 1.6 1995/05/10 20:47:44 jtc Ex
  * MACRO for standards
  */
 
-#include <math.h>
-#include <math_private.h>
+#include <math-svid-compat.h>
 
 /*
  * define and initialize _LIB_VERSION
  */
-#ifdef _POSIX_MODE
+#undef _LIB_VERSION
+#if LIBM_SVID_COMPAT || !defined SHARED
 _LIB_VERSION_TYPE _LIB_VERSION_INTERNAL = _POSIX_;
-#else
-#ifdef _XOPEN_MODE
-_LIB_VERSION_TYPE _LIB_VERSION_INTERNAL = _XOPEN_;
-#else
-#ifdef _SVID3_MODE
-_LIB_VERSION_TYPE _LIB_VERSION_INTERNAL = _SVID_;
-#else					/* default _IEEE_MODE */
-_LIB_VERSION_TYPE _LIB_VERSION_INTERNAL = _IEEE_;
 #endif
-#endif
-#endif
-
+#if LIBM_SVID_COMPAT
+compat_symbol (libm, _LIB_VERSION_INTERNAL, _LIB_VERSION, GLIBC_2_0);
+#elif !defined SHARED
+/* For use in .S wrappers.  */
 weak_alias (_LIB_VERSION_INTERNAL, _LIB_VERSION)
+#endif
diff --git a/sysdeps/ieee754/s_matherr.c b/sysdeps/ieee754/s_matherr.c
index d5dc6f122d..5eacdd51c6 100644
--- a/sysdeps/ieee754/s_matherr.c
+++ b/sysdeps/ieee754/s_matherr.c
@@ -14,9 +14,10 @@
 static char rcsid[] = "$NetBSD: s_matherr.c,v 1.6 1995/05/10 20:47:53 jtc Exp $";
 #endif
 
-#include <math.h>
-#include <math_private.h>
+#include <math-svid-compat.h>
 
+#undef matherr
+#if LIBM_SVID_COMPAT
 int
 weak_function
 __matherr(struct exception *x)
@@ -25,4 +26,5 @@ __matherr(struct exception *x)
 	if(x->arg1!=x->arg1) return 0;
 	return n;
 }
-weak_alias (__matherr, matherr)
+compat_symbol (libm, __matherr, matherr, GLIBC_2_0);
+#endif
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrt_compat.S b/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrt_compat.S
index bb896a33cd..82e3baffd4 100644
--- a/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrt_compat.S
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrt_compat.S
@@ -18,6 +18,7 @@
 
 #include <sysdep.h>
 #include <math_ldbl_opt.h>
+#include <math-svid-compat.h>
 
 /* double [fp1] sqrt (double x [fp1])
    Power4 (ISA V2.0) and above implement sqrt in hardware (not optional).
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrtf_compat.S b/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrtf_compat.S
index c304ab5ca2..0c663529e9 100644
--- a/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrtf_compat.S
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrtf_compat.S
@@ -18,6 +18,7 @@
 
 #include <sysdep.h>
 #include <math_ldbl_opt.h>
+#include <math-svid-compat.h>
 
 /* float [fp1] sqrts (float x [fp1])
    Power4 (ISA V2.0) and above implement sqrt in hardware (not optional).
diff --git a/sysdeps/powerpc/powerpc32/power5/fpu/w_sqrt_compat.S b/sysdeps/powerpc/powerpc32/power5/fpu/w_sqrt_compat.S
index 93625c5aa9..ecefdc3283 100644
--- a/sysdeps/powerpc/powerpc32/power5/fpu/w_sqrt_compat.S
+++ b/sysdeps/powerpc/powerpc32/power5/fpu/w_sqrt_compat.S
@@ -18,6 +18,7 @@
 
 #include <sysdep.h>
 #include <math_ldbl_opt.h>
+#include <math-svid-compat.h>
 
 /* double [fp1] sqrt (double x [fp1])
    Power4 (ISA V2.0) and above implement sqrt in hardware (not optional).
diff --git a/sysdeps/powerpc/powerpc32/power5/fpu/w_sqrtf_compat.S b/sysdeps/powerpc/powerpc32/power5/fpu/w_sqrtf_compat.S
index 2ca86b6155..9ae0c5f47d 100644
--- a/sysdeps/powerpc/powerpc32/power5/fpu/w_sqrtf_compat.S
+++ b/sysdeps/powerpc/powerpc32/power5/fpu/w_sqrtf_compat.S
@@ -18,6 +18,7 @@
 
 #include <sysdep.h>
 #include <math_ldbl_opt.h>
+#include <math-svid-compat.h>
 
 /* float [fp1] sqrts (float x [fp1])
    Power4 (ISA V2.0) and above implement sqrt in hardware (not optional).
diff --git a/sysdeps/sparc/sparc32/fpu/w_sqrt_compat.S b/sysdeps/sparc/sparc32/fpu/w_sqrt_compat.S
index 703f228766..cca76541e4 100644
--- a/sysdeps/sparc/sparc32/fpu/w_sqrt_compat.S
+++ b/sysdeps/sparc/sparc32/fpu/w_sqrt_compat.S
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <math-svid-compat.h>
 
 ENTRY (__sqrt)
 	clr	%g1
diff --git a/sysdeps/sparc/sparc32/fpu/w_sqrtf_compat.S b/sysdeps/sparc/sparc32/fpu/w_sqrtf_compat.S
index 05d1160378..34f6113a0b 100644
--- a/sysdeps/sparc/sparc32/fpu/w_sqrtf_compat.S
+++ b/sysdeps/sparc/sparc32/fpu/w_sqrtf_compat.S
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <math-svid-compat.h>
 
 ENTRY (__sqrtf)
 	st	%g0, [%sp + 68]
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/w_sqrt_compat-vis3.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/w_sqrt_compat-vis3.S
index 06ff449150..a3a642fba6 100644
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/w_sqrt_compat-vis3.S
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/w_sqrt_compat-vis3.S
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <math-svid-compat.h>
 
 ENTRY (__sqrt_vis3)
 	movwtos	%o0, %f0
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/w_sqrtf_compat-vis3.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/w_sqrtf_compat-vis3.S
index 5b21523fc0..8cd160765a 100644
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/w_sqrtf_compat-vis3.S
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/w_sqrtf_compat-vis3.S
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <math-svid-compat.h>
 
 ENTRY (__sqrtf_vis3)
 	movwtos	%o0, %f0
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/w_sqrt_compat.S b/sysdeps/sparc/sparc32/sparcv9/fpu/w_sqrt_compat.S
index 4415a82024..f3003da14f 100644
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/w_sqrt_compat.S
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/w_sqrt_compat.S
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <math-svid-compat.h>
 
 ENTRY (__sqrt)
 	std	%o0, [%sp + 80]
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/w_sqrtf_compat.S b/sysdeps/sparc/sparc32/sparcv9/fpu/w_sqrtf_compat.S
index 1c3c97f8e9..7a102de3dd 100644
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/w_sqrtf_compat.S
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/w_sqrtf_compat.S
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <math-svid-compat.h>
 
 ENTRY (__sqrtf)
 	st	%o0, [%sp + 72]
diff --git a/sysdeps/sparc/sparc64/fpu/w_sqrt_compat.S b/sysdeps/sparc/sparc64/fpu/w_sqrt_compat.S
index de95e52e8e..937e15009e 100644
--- a/sysdeps/sparc/sparc64/fpu/w_sqrt_compat.S
+++ b/sysdeps/sparc/sparc64/fpu/w_sqrt_compat.S
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <math-svid-compat.h>
 
 ENTRY (__sqrt)
 	fzero	%f8
diff --git a/sysdeps/sparc/sparc64/fpu/w_sqrtf_compat.S b/sysdeps/sparc/sparc64/fpu/w_sqrtf_compat.S
index 0c253fe43a..875ed3b3b2 100644
--- a/sysdeps/sparc/sparc64/fpu/w_sqrtf_compat.S
+++ b/sysdeps/sparc/sparc64/fpu/w_sqrtf_compat.S
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <math-svid-compat.h>
 
 ENTRY (__sqrtf)
 	fzeros	%f8