diff --git a/include/fenv.h b/include/fenv.h
index bc8f759..b29b246 100644
--- a/include/fenv.h
+++ b/include/fenv.h
@@ -13,12 +13,14 @@ extern int __fesetexceptflag (const fexcept_t *__flagp, int __excepts);
 extern int __fegetenv (fenv_t *__envp);
 extern int __fesetenv (const fenv_t *__envp);
 extern int __feupdateenv (const fenv_t *__envp);
+extern __typeof (fegetround) __fegetround;
 
 libm_hidden_proto (feraiseexcept)
 libm_hidden_proto (__feraiseexcept)
 libm_hidden_proto (fegetenv)
 libm_hidden_proto (__fegetenv)
 libm_hidden_proto (fegetround)
+libm_hidden_proto (__fegetround)
 libm_hidden_proto (fesetenv)
 libm_hidden_proto (fesetround)
 libm_hidden_proto (feholdexcept)
diff --git a/math/fegetround.c b/math/fegetround.c
index 665268e..7c150ec 100644
--- a/math/fegetround.c
+++ b/math/fegetround.c
@@ -20,7 +20,7 @@
 #include <fenv.h>
 
 int
-fegetround (void)
+__fegetround (void)
 {
 #ifdef FE_TONEAREST
   return FE_TONEAREST;
@@ -28,5 +28,7 @@ fegetround (void)
   return 0;
 #endif
 }
-libm_hidden_def (fegetround)
+libm_hidden_def (__fegetround)
+weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
 stub_warning (fegetround)
diff --git a/sysdeps/aarch64/fpu/fegetround.c b/sysdeps/aarch64/fpu/fegetround.c
index 4c81845..5af36f7 100644
--- a/sysdeps/aarch64/fpu/fegetround.c
+++ b/sysdeps/aarch64/fpu/fegetround.c
@@ -20,8 +20,10 @@
 #include <get-rounding-mode.h>
 
 int
-fegetround (void)
+__fegetround (void)
 {
   return get_rounding_mode ();
 }
-libm_hidden_def (fegetround)
+libm_hidden_def (__fegetround)
+weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
diff --git a/sysdeps/alpha/fpu/fegetround.c b/sysdeps/alpha/fpu/fegetround.c
index 613110b..d346dec 100644
--- a/sysdeps/alpha/fpu/fegetround.c
+++ b/sysdeps/alpha/fpu/fegetround.c
@@ -20,7 +20,7 @@
 #include <fenv_libc.h>
 
 int
-fegetround (void)
+__fegetround (void)
 {
   unsigned long fpcr;
 
@@ -28,4 +28,6 @@ fegetround (void)
 
   return (fpcr >> FPCR_ROUND_SHIFT) & 3;
 }
-libm_hidden_def (fegetround)
+libm_hidden_def (__fegetround)
+weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
diff --git a/sysdeps/arm/fegetround.c b/sysdeps/arm/fegetround.c
index bd03667..348c23e 100644
--- a/sysdeps/arm/fegetround.c
+++ b/sysdeps/arm/fegetround.c
@@ -20,8 +20,10 @@
 
 
 int
-fegetround (void)
+__fegetround (void)
 {
   return get_rounding_mode ();
 }
-libm_hidden_def (fegetround)
+libm_hidden_def (__fegetround)
+weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
diff --git a/sysdeps/hppa/fpu/fegetround.c b/sysdeps/hppa/fpu/fegetround.c
index fc4cbed..aae88b7 100644
--- a/sysdeps/hppa/fpu/fegetround.c
+++ b/sysdeps/hppa/fpu/fegetround.c
@@ -20,8 +20,10 @@
 #include <get-rounding-mode.h>
 
 int
-fegetround (void)
+__fegetround (void)
 {
   return get_rounding_mode ();
 }
-libm_hidden_def (fegetround)
+libm_hidden_def (__fegetround)
+weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
diff --git a/sysdeps/i386/fpu/fegetround.c b/sysdeps/i386/fpu/fegetround.c
index 1b25c32..1662e2e 100644
--- a/sysdeps/i386/fpu/fegetround.c
+++ b/sysdeps/i386/fpu/fegetround.c
@@ -20,7 +20,7 @@
 #include <fenv.h>
 
 int
-fegetround (void)
+__fegetround (void)
 {
   int cw;
 
@@ -28,4 +28,6 @@ fegetround (void)
 
   return cw & 0xc00;
 }
-libm_hidden_def (fegetround)
+libm_hidden_def (__fegetround)
+weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
diff --git a/sysdeps/ia64/fpu/fegetround.c b/sysdeps/ia64/fpu/fegetround.c
index 38f769f..cf29911 100644
--- a/sysdeps/ia64/fpu/fegetround.c
+++ b/sysdeps/ia64/fpu/fegetround.c
@@ -20,8 +20,10 @@
 #include <get-rounding-mode.h>
 
 int
-fegetround (void)
+__fegetround (void)
 {
   return get_rounding_mode ();
 }
-libm_hidden_def (fegetround)
+libm_hidden_def (__fegetround)
+weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
diff --git a/sysdeps/ieee754/dbl-64/e_sqrt.c b/sysdeps/ieee754/dbl-64/e_sqrt.c
index 3b34e54..fff6d14 100644
--- a/sysdeps/ieee754/dbl-64/e_sqrt.c
+++ b/sysdeps/ieee754/dbl-64/e_sqrt.c
@@ -66,7 +66,7 @@ __ieee754_sqrt (double x)
   /*----------------- 2^-1022  <= | x |< 2^1024  -----------------*/
   if (k > 0x000fffff && k < 0x7ff00000)
     {
-      int rm = fegetround ();
+      int rm = __fegetround ();
       fenv_t env;
       libc_feholdexcept_setround (&env, FE_TONEAREST);
       double ret;
diff --git a/sysdeps/m68k/fpu/fegetround.c b/sysdeps/m68k/fpu/fegetround.c
index b0302e1..0777657 100644
--- a/sysdeps/m68k/fpu/fegetround.c
+++ b/sysdeps/m68k/fpu/fegetround.c
@@ -20,7 +20,7 @@
 #include <fenv.h>
 
 int
-fegetround (void)
+__fegetround (void)
 {
   int fpcr;
 
@@ -28,4 +28,6 @@ fegetround (void)
 
   return fpcr & FE_UPWARD;
 }
-libm_hidden_def (fegetround)
+libm_hidden_def (__fegetround)
+weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
diff --git a/sysdeps/mips/fpu/fegetround.c b/sysdeps/mips/fpu/fegetround.c
index 99403cd..bfe9130 100644
--- a/sysdeps/mips/fpu/fegetround.c
+++ b/sysdeps/mips/fpu/fegetround.c
@@ -21,7 +21,7 @@
 #include <fpu_control.h>
 
 int
-fegetround (void)
+__fegetround (void)
 {
   int cw;
 
@@ -30,4 +30,6 @@ fegetround (void)
 
   return cw & _FPU_RC_MASK;
 }
-libm_hidden_def (fegetround)
+libm_hidden_def (__fegetround)
+weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
diff --git a/sysdeps/powerpc/fpu/fegetround.c b/sysdeps/powerpc/fpu/fegetround.c
index a18be83..af97f72 100644
--- a/sysdeps/powerpc/fpu/fegetround.c
+++ b/sysdeps/powerpc/fpu/fegetround.c
@@ -18,10 +18,13 @@
 
 #include <fenv_libc.h>
 
-#undef fegetround
 int
-fegetround (void)
+(__fegetround) (void)
 {
   return __fegetround();
 }
-libm_hidden_def (fegetround)
+#undef fegetround
+#undef __fegetround
+libm_hidden_def (__fegetround)
+weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
diff --git a/sysdeps/powerpc/nofpu/fegetround.c b/sysdeps/powerpc/nofpu/fegetround.c
index 9de326c..311b2d5 100644
--- a/sysdeps/powerpc/nofpu/fegetround.c
+++ b/sysdeps/powerpc/nofpu/fegetround.c
@@ -20,10 +20,11 @@
 #include "soft-fp.h"
 #include "soft-supp.h"
 
-#undef fegetround
 int
-fegetround (void)
+__fegetround (void)
 {
   return __sim_round_mode_thread;
 }
-libm_hidden_def (fegetround)
+libm_hidden_def (__fegetround)
+weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
diff --git a/sysdeps/powerpc/powerpc32/e500/nofpu/fegetround.c b/sysdeps/powerpc/powerpc32/e500/nofpu/fegetround.c
index c71a8fc..bbdeba7 100644
--- a/sysdeps/powerpc/powerpc32/e500/nofpu/fegetround.c
+++ b/sysdeps/powerpc/powerpc32/e500/nofpu/fegetround.c
@@ -18,13 +18,14 @@
 
 #include <fenv_libc.h>
 
-#undef fegetround
 int
-fegetround (void)
+__fegetround (void)
 {
   unsigned long fpescr;
 
   fpescr = fegetenv_register ();
   return fpescr & 3;
 }
-libm_hidden_def (fegetround)
+libm_hidden_def (__fegetround)
+weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
diff --git a/sysdeps/s390/fpu/fegetround.c b/sysdeps/s390/fpu/fegetround.c
index dd4e81f..f608214 100644
--- a/sysdeps/s390/fpu/fegetround.c
+++ b/sysdeps/s390/fpu/fegetround.c
@@ -21,7 +21,7 @@
 #include <fpu_control.h>
 
 int
-fegetround (void)
+__fegetround (void)
 {
   fexcept_t cw;
 
@@ -29,4 +29,6 @@ fegetround (void)
 
   return cw & FPC_RM_MASK;
 }
-libm_hidden_def (fegetround)
+libm_hidden_def (__fegetround)
+weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
diff --git a/sysdeps/sh/sh4/fpu/fegetround.c b/sysdeps/sh/sh4/fpu/fegetround.c
index 639b7c2..f227564 100644
--- a/sysdeps/sh/sh4/fpu/fegetround.c
+++ b/sysdeps/sh/sh4/fpu/fegetround.c
@@ -21,7 +21,7 @@
 #include <fpu_control.h>
 
 int
-fegetround (void)
+__fegetround (void)
 {
   fpu_control_t cw;
 
@@ -30,4 +30,6 @@ fegetround (void)
 
   return cw & 0x1;
 }
-libm_hidden_def (fegetround)
+libm_hidden_def (__fegetround)
+weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
diff --git a/sysdeps/sparc/fpu/fegetround.c b/sysdeps/sparc/fpu/fegetround.c
index 9eba970..ebcf21c 100644
--- a/sysdeps/sparc/fpu/fegetround.c
+++ b/sysdeps/sparc/fpu/fegetround.c
@@ -19,7 +19,7 @@
 #include <fenv.h>
 
 int
-fegetround (void)
+__fegetround (void)
 {
   fenv_t tmp;
 
@@ -27,4 +27,6 @@ fegetround (void)
 
   return tmp & __FE_ROUND_MASK;
 }
-libm_hidden_def (fegetround)
+libm_hidden_def (__fegetround)
+weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
diff --git a/sysdeps/tile/math_private.h b/sysdeps/tile/math_private.h
index 70e4fb2..6b9e761 100644
--- a/sysdeps/tile/math_private.h
+++ b/sysdeps/tile/math_private.h
@@ -34,6 +34,7 @@ extern inline int __fegetenv (fenv_t *__e)	{ return 0; }
 extern inline int fesetenv (const fenv_t *__e)	{ return 0; }
 extern inline int feupdateenv (const fenv_t *__e) { return 0; }
 extern inline int fegetround (void)		{ return FE_TONEAREST; }
+extern inline int __fegetround (void)		{ return FE_TONEAREST; }
 extern inline int fesetround (int __d)		{ return 0; }
 
 #endif
diff --git a/sysdeps/x86_64/fpu/fegetround.c b/sysdeps/x86_64/fpu/fegetround.c
index 4796e80..b515d8a 100644
--- a/sysdeps/x86_64/fpu/fegetround.c
+++ b/sysdeps/x86_64/fpu/fegetround.c
@@ -20,7 +20,7 @@
 #include <fenv.h>
 
 int
-fegetround (void)
+__fegetround (void)
 {
   int cw;
   /* We only check the x87 FPU unit.  The SSE unit should be the same
@@ -30,4 +30,6 @@ fegetround (void)
 
   return cw & 0xc00;
 }
-libm_hidden_def (fegetround)
+libm_hidden_def (__fegetround)
+weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
