diff --git a/misc/cgo/gmp/gmp.go b/misc/cgo/gmp/gmp.go
index 9325d8bfde353690344695ee0e58a0be849991e2..3bcf99151d531035bf1c679951b0ce0322c88744 100644
--- a/misc/cgo/gmp/gmp.go
+++ b/misc/cgo/gmp/gmp.go
@@ -98,8 +98,20 @@ Go to hang on to a reference to the pointer until C is done with it.
 */
 package gmp
 
-// #include <gmp.h>
-// #include <stdlib.h>
+/*
+#cgo LDFLAGS: -lgmp
+#include <gmp.h>
+#include <stdlib.h>
+
+// gmp 5.0.0+ changed the type of the 3rd argument to mp_bitcnt_t,
+// so, to support older versions, we wrap these two functions.
+void _mpz_mul_2exp(mpz_ptr a, mpz_ptr b, unsigned long n) {
+	mpz_mul_2exp(a, b, n);
+}
+void _mpz_div_2exp(mpz_ptr a, mpz_ptr b, unsigned long n) {
+	mpz_div_2exp(a, b, n);
+}
+*/
 import "C"
 
 import (
@@ -182,12 +194,12 @@ func (z *Int) SetInt64(x int64) *Int {
 func (z *Int) SetString(s string, base int) error {
 	z.doinit()
 	if base < 2 || base > 36 {
-		return os.EINVAL
+		return os.ErrInvalid
 	}
 	p := C.CString(s)
 	defer C.free(unsafe.Pointer(p))
 	if C.mpz_set_str(&z.i[0], p, C.int(base)) < 0 {
-		return os.EINVAL
+		return os.ErrInvalid
 	}
 	return nil
 }
@@ -265,7 +277,7 @@ func (z *Int) Mod(x, y *Int) *Int {
 func (z *Int) Lsh(x *Int, s uint) *Int {
 	x.doinit()
 	z.doinit()
-	C.mpz_mul_2exp(&z.i[0], &x.i[0], C.mp_bitcnt_t(s))
+	C._mpz_mul_2exp(&z.i[0], &x.i[0], C.ulong(s))
 	return z
 }
 
@@ -273,7 +285,7 @@ func (z *Int) Lsh(x *Int, s uint) *Int {
 func (z *Int) Rsh(x *Int, s uint) *Int {
 	x.doinit()
 	z.doinit()
-	C.mpz_div_2exp(&z.i[0], &x.i[0], C.mp_bitcnt_t(s))
+	C._mpz_div_2exp(&z.i[0], &x.i[0], C.ulong(s))
 	return z
 }
 
diff --git a/misc/cgo/gmp/pi.go b/misc/cgo/gmp/pi.go
index 019861e592f296305aaab86ade813002cc6981a0..1914cf214fe8e4a1e2453682ad767566cb8a6d82 100644
--- a/misc/cgo/gmp/pi.go
+++ b/misc/cgo/gmp/pi.go
@@ -102,5 +102,5 @@ func main() {
 		}
 	}
 
-	fmt.Printf("\n%d calls; bit sizes: %d %d %d\n", runtime.Cgocalls(), numer.Len(), accum.Len(), denom.Len())
+	fmt.Printf("\n%d calls; bit sizes: %d %d %d\n", runtime.NumCgoCall(), numer.Len(), accum.Len(), denom.Len())
 }