diff --git a/src/modules/Gmp/configure.in b/src/modules/Gmp/configure.in
index e41807fe1dc88d7f9ae5ed72d3c64f617ac0e716..f417d070b3040b181f9fc312ba41b49d40b6f7a5 100644
--- a/src/modules/Gmp/configure.in
+++ b/src/modules/Gmp/configure.in
@@ -1,4 +1,4 @@
-# $Id: configure.in,v 1.16 2000/09/04 13:50:22 grubba Exp $
+# $Id: configure.in,v 1.17 2000/09/04 16:04:33 grubba Exp $
 AC_INIT(mpz_glue.c)
 AC_CONFIG_HEADER(gmp_machine.h)
 AC_ARG_WITH(gmp,     [  --with(out)-gmp        Support bignums],[],[with_gmp=yes])
@@ -49,7 +49,40 @@ define([AC_CHECK_GMP],
   done=no
   AC_CHECK_HEADERS($2,[
 
-    AC_MSG_CHECKING(working $1)
+    # This test is needed since the __MPN macro
+    # is broken on many versions of gmp, since
+    # many ANSI compilers only define __STDC__
+    # in strict ansi mode. Some of the affected
+    # compilers also don't allow redefining
+    # __STDC__.
+    AC_MSG_CHECKING(prefix for __MPN in $2)
+    define(PIKE_PREFIX_NAME,[pike_cv_$1___MPN_prefix])
+    AC_CACHE_VAL(PIKE_PREFIX_NAME, [
+      AC_EGREP_CPP([__gmpn_.*PiKe], [
+#include <$2>
+__MPN(PiKe)
+      ], [
+        PIKE_PREFIX_NAME="__gmpn_"
+      ], [
+        AC_EGREP_CPP([__mpn_.*PiKe], [
+#include <$2>
+__MPN(PiKe)
+        ], [
+  	  PIKE_PREFIX_NAME="__mpn_"
+  	], [
+	  PIKE_PREFIX_NAME="no"
+	])
+      ])
+    ])
+    if test "x[$]PIKE_PREFIX_NAME" = "xno"; then
+      AC_MSG_RESULT(warning -- prefix not found)
+    else
+      AC_MSG_RESULT([$]PIKE_PREFIX_NAME)
+      AC_DEFINE(PIKE_MPN_PREFIX, [$]PIKE_PREFIX_NAME)
+    fi
+    undefine(PIKE_PREFIX_NAME)
+
+    AC_MSG_CHECKING(working <$2>)
     AC_CACHE_VAL(pike_cv_working_$1,[
       OLDLIBS="${LIBS-}"
       LIBS="${LIBS-} -l$1"
@@ -57,11 +90,10 @@ define([AC_CHECK_GMP],
 #include <stdio.h>
 
 /* Kludge for some compilers only defining __STDC__ in strict mode. */
-#ifndef __STDC__
-#ifdef HAVE_ANSI_CONCAT
-#define __STDC__ 0
-#endif
-#endif /* __STDC__ */
+#if !defined(__STDC__) && defined(HAVE_ANSI_CONCAT) && defined(PIKE_MPN_PREFIX)
+#define PIKE_MPN_CONCAT(x,y)	x##y
+#define __MPN(x)	PIKE_MPN_CONCAT(PIKE_MPN_PREFIX,x)
+#endif /* !__STDC__ && HAVE_ANSI_CONCAT && PIKE_MPN_PREFIX */
 
 #include <$2>
 int main(int argc, char **argv)
@@ -84,11 +116,10 @@ int main(int argc, char **argv)
 #include <stdio.h>
 
 /* Kludge for some compilers only defining __STDC__ in strict mode. */
-#ifndef __STDC__
-#ifdef HAVE_ANSI_CONCAT
-#define __STDC__ 0
-#endif
-#endif /* __STDC__ */
+#if !defined(__STDC__) && defined(HAVE_ANSI_CONCAT) && defined(PIKE_MPN_PREFIX)
+#define PIKE_MPN_CONCAT(x,y)	x##y
+#define __MPN(x)	PIKE_MPN_CONCAT(PIKE_MPN_PREFIX,x)
+#endif /* !__STDC__ && HAVE_ANSI_CONCAT && PIKE_MPN_PREFIX */
 
 #include <$2>
 
diff --git a/src/modules/Gmp/gmp_machine.h.in b/src/modules/Gmp/gmp_machine.h.in
index 6d0f6d6aa963ce0c7fcb5d0ab40b28c372a12ff9..cc6a90e3cac4988dca7c97f6f47de45c2d936899 100644
--- a/src/modules/Gmp/gmp_machine.h.in
+++ b/src/modules/Gmp/gmp_machine.h.in
@@ -1,7 +1,10 @@
-/* $Id: gmp_machine.h.in,v 1.4 2000/04/25 15:07:13 marcus Exp $ */
+/* $Id: gmp_machine.h.in,v 1.5 2000/09/04 16:04:33 grubba Exp $ */
 #ifndef GMP_MACHINE_H
 #define GMP_MACHINE_H
 
+/* Define this to the prefix used by __MPN() (usually __mpn_ or __gmpn_). */
+#undef PIKE_MPN_PREFIX
+
 /* Define this if you have <gmp2/gmp.h> */
 #undef HAVE_GMP2_GMP_H
 
diff --git a/src/modules/Gmp/my_gmp.h b/src/modules/Gmp/my_gmp.h
index a2837cae0558eb2be94dc2a1741741d6d15712d6..f158154d069f59dec9d7614d4a31b0739e31b494 100644
--- a/src/modules/Gmp/my_gmp.h
+++ b/src/modules/Gmp/my_gmp.h
@@ -1,4 +1,4 @@
-/* $Id: my_gmp.h,v 1.7 2000/09/04 13:50:23 grubba Exp $
+/* $Id: my_gmp.h,v 1.8 2000/09/04 16:04:34 grubba Exp $
  *
  * These functions or something similar will hopefully be included
  * with Gmp-2.1 .
@@ -7,12 +7,13 @@
 #ifndef MY_GMP_H_INCLUDED
 #define MY_GMP_H_INCLUDED
 
-/* Kludge for some compilers only defining __STDC__ in strict mode. */
-#ifndef __STDC__
-#ifdef HAVE_ANSI_CONCAT
-#define __STDC__ 0
-#endif
-#endif /* __STDC__ */
+/* Kludge for some compilers only defining __STDC__ in strict mode,
+ * which leads to <gmp.h> using the wrong token concat method.
+ */
+#if !defined(__STDC__) && defined(HAVE_ANSI_CONCAT) && defined(PIKE_MPN_PREFIX)
+#define PIKE_MPN_CONCAT(x,y)	x##y
+#define __MPN(x)	PIKE_MPN_CONCAT(PIKE_MPN_PREFIX,x)
+#endif /* !__STDC__ && HAVE_ANSI_CONCAT && PIKE_MPN_PREFIX */
 
 #undef _PROTO
 #define _PROTO(x) x