diff --git a/Makefile b/Makefile
index e998933..46826e1 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,5 @@
-obj-m += mini-gmp.o
+obj-m += minigmp.o
+minigmp-objs := mini-gmp.o export.o
 EXTRA_CFLAGS+=-DKERNEL=1
 
 all:
diff --git a/export.c b/export.c
new file mode 100644
index 0000000..0af854e
--- /dev/null
+++ b/export.c
@@ -0,0 +1,144 @@
+#include <linux/kernel.h>
+#include "mini-gmp.h"
+EXPORT_SYMBOL_GPL(mp_set_memory_functions);
+EXPORT_SYMBOL_GPL(mp_get_memory_functions);
+EXPORT_SYMBOL_GPL(mpn_copyi);
+EXPORT_SYMBOL_GPL(mpn_copyd);
+EXPORT_SYMBOL_GPL(mpn_zero);
+EXPORT_SYMBOL_GPL(mpn_cmp);
+EXPORT_SYMBOL_GPL(mpn_zero_p);
+EXPORT_SYMBOL_GPL(mpn_add_1);
+EXPORT_SYMBOL_GPL(mpn_add_n);
+EXPORT_SYMBOL_GPL(mpn_add);
+EXPORT_SYMBOL_GPL(mpn_sub_1);
+EXPORT_SYMBOL_GPL(mpn_sub_n);
+EXPORT_SYMBOL_GPL(mpn_sub);
+EXPORT_SYMBOL_GPL(mpn_mul_1);
+EXPORT_SYMBOL_GPL(mpn_addmul_1);
+EXPORT_SYMBOL_GPL(mpn_submul_1);
+EXPORT_SYMBOL_GPL(mpn_mul);
+EXPORT_SYMBOL_GPL(mpn_mul_n);
+EXPORT_SYMBOL_GPL(mpn_sqr);
+EXPORT_SYMBOL_GPL(mpn_perfect_square_p);
+EXPORT_SYMBOL_GPL(mpn_sqrtrem);
+EXPORT_SYMBOL_GPL(mpn_lshift);
+EXPORT_SYMBOL_GPL(mpn_rshift);
+EXPORT_SYMBOL_GPL(mpn_scan0);
+EXPORT_SYMBOL_GPL(mpn_scan1);
+EXPORT_SYMBOL_GPL(mpn_popcount);
+EXPORT_SYMBOL_GPL(mpn_invert_3by2);
+EXPORT_SYMBOL_GPL(mpn_get_str);
+EXPORT_SYMBOL_GPL(mpn_set_str);
+EXPORT_SYMBOL_GPL(mpz_init);
+EXPORT_SYMBOL_GPL(mpz_init2);
+EXPORT_SYMBOL_GPL(mpz_clear);
+EXPORT_SYMBOL_GPL(mpz_sgn);
+EXPORT_SYMBOL_GPL(mpz_cmp_si);
+EXPORT_SYMBOL_GPL(mpz_cmp_ui);
+EXPORT_SYMBOL_GPL(mpz_cmp);
+EXPORT_SYMBOL_GPL(mpz_cmpabs_ui);
+EXPORT_SYMBOL_GPL(mpz_cmpabs);
+EXPORT_SYMBOL_GPL(mpz_abs);
+EXPORT_SYMBOL_GPL(mpz_neg);
+EXPORT_SYMBOL_GPL(mpz_swap);
+EXPORT_SYMBOL_GPL(mpz_add_ui);
+EXPORT_SYMBOL_GPL(mpz_add);
+EXPORT_SYMBOL_GPL(mpz_sub_ui);
+EXPORT_SYMBOL_GPL(mpz_ui_sub);
+EXPORT_SYMBOL_GPL(mpz_sub);
+EXPORT_SYMBOL_GPL(mpz_mul_si);
+EXPORT_SYMBOL_GPL(mpz_mul_ui);
+EXPORT_SYMBOL_GPL(mpz_mul);
+EXPORT_SYMBOL_GPL(mpz_mul_2exp);
+EXPORT_SYMBOL_GPL(mpz_addmul_ui);
+EXPORT_SYMBOL_GPL(mpz_addmul);
+EXPORT_SYMBOL_GPL(mpz_submul_ui);
+EXPORT_SYMBOL_GPL(mpz_submul);
+EXPORT_SYMBOL_GPL(mpz_cdiv_qr);
+EXPORT_SYMBOL_GPL(mpz_fdiv_qr);
+EXPORT_SYMBOL_GPL(mpz_tdiv_qr);
+EXPORT_SYMBOL_GPL(mpz_cdiv_q);
+EXPORT_SYMBOL_GPL(mpz_fdiv_q);
+EXPORT_SYMBOL_GPL(mpz_tdiv_q);
+EXPORT_SYMBOL_GPL(mpz_cdiv_r);
+EXPORT_SYMBOL_GPL(mpz_fdiv_r);
+EXPORT_SYMBOL_GPL(mpz_tdiv_r);
+EXPORT_SYMBOL_GPL(mpz_cdiv_q_2exp);
+EXPORT_SYMBOL_GPL(mpz_fdiv_q_2exp);
+EXPORT_SYMBOL_GPL(mpz_tdiv_q_2exp);
+EXPORT_SYMBOL_GPL(mpz_cdiv_r_2exp);
+EXPORT_SYMBOL_GPL(mpz_fdiv_r_2exp);
+EXPORT_SYMBOL_GPL(mpz_tdiv_r_2exp);
+EXPORT_SYMBOL_GPL(mpz_mod);
+EXPORT_SYMBOL_GPL(mpz_divexact);
+EXPORT_SYMBOL_GPL(mpz_divisible_p);
+EXPORT_SYMBOL_GPL(mpz_congruent_p);
+EXPORT_SYMBOL_GPL(mpz_cdiv_qr_ui);
+EXPORT_SYMBOL_GPL(mpz_fdiv_qr_ui);
+EXPORT_SYMBOL_GPL(mpz_tdiv_qr_ui);
+EXPORT_SYMBOL_GPL(mpz_cdiv_q_ui);
+EXPORT_SYMBOL_GPL(mpz_fdiv_q_ui);
+EXPORT_SYMBOL_GPL(mpz_tdiv_q_ui);
+EXPORT_SYMBOL_GPL(mpz_cdiv_r_ui);
+EXPORT_SYMBOL_GPL(mpz_fdiv_r_ui);
+EXPORT_SYMBOL_GPL(mpz_tdiv_r_ui);
+EXPORT_SYMBOL_GPL(mpz_cdiv_ui);
+EXPORT_SYMBOL_GPL(mpz_fdiv_ui);
+EXPORT_SYMBOL_GPL(mpz_tdiv_ui);
+EXPORT_SYMBOL_GPL(mpz_mod_ui);
+EXPORT_SYMBOL_GPL(mpz_divexact_ui);
+EXPORT_SYMBOL_GPL(mpz_divisible_ui_p);
+EXPORT_SYMBOL_GPL(mpz_gcd_ui);
+EXPORT_SYMBOL_GPL(mpz_gcd);
+EXPORT_SYMBOL_GPL(mpz_gcdext);
+EXPORT_SYMBOL_GPL(mpz_lcm_ui);
+EXPORT_SYMBOL_GPL(mpz_lcm);
+EXPORT_SYMBOL_GPL(mpz_invert);
+EXPORT_SYMBOL_GPL(mpz_sqrtrem);
+EXPORT_SYMBOL_GPL(mpz_sqrt);
+EXPORT_SYMBOL_GPL(mpz_perfect_square_p);
+EXPORT_SYMBOL_GPL(mpz_pow_ui);
+EXPORT_SYMBOL_GPL(mpz_ui_pow_ui);
+EXPORT_SYMBOL_GPL(mpz_powm);
+EXPORT_SYMBOL_GPL(mpz_powm_ui);
+EXPORT_SYMBOL_GPL(mpz_rootrem);
+EXPORT_SYMBOL_GPL(mpz_root);
+EXPORT_SYMBOL_GPL(mpz_fac_ui);
+EXPORT_SYMBOL_GPL(mpz_bin_uiui);
+EXPORT_SYMBOL_GPL(mpz_probab_prime_p);
+EXPORT_SYMBOL_GPL(mpz_tstbit);
+EXPORT_SYMBOL_GPL(mpz_setbit);
+EXPORT_SYMBOL_GPL(mpz_clrbit);
+EXPORT_SYMBOL_GPL(mpz_combit);
+EXPORT_SYMBOL_GPL(mpz_com);
+EXPORT_SYMBOL_GPL(mpz_and);
+EXPORT_SYMBOL_GPL(mpz_ior);
+EXPORT_SYMBOL_GPL(mpz_xor);
+EXPORT_SYMBOL_GPL(mpz_popcount);
+EXPORT_SYMBOL_GPL(mpz_hamdist);
+EXPORT_SYMBOL_GPL(mpz_scan0);
+EXPORT_SYMBOL_GPL(mpz_scan1);
+EXPORT_SYMBOL_GPL(mpz_fits_slong_p);
+EXPORT_SYMBOL_GPL(mpz_fits_ulong_p);
+EXPORT_SYMBOL_GPL(mpz_get_si);
+EXPORT_SYMBOL_GPL(mpz_get_ui);
+EXPORT_SYMBOL_GPL(mpz_size);
+EXPORT_SYMBOL_GPL(mpz_getlimbn);
+EXPORT_SYMBOL_GPL(mpz_realloc2);
+EXPORT_SYMBOL_GPL(mpz_limbs_read);
+EXPORT_SYMBOL_GPL(mpz_limbs_modify);
+EXPORT_SYMBOL_GPL(mpz_limbs_write);
+EXPORT_SYMBOL_GPL(mpz_limbs_finish);
+EXPORT_SYMBOL_GPL(mpz_roinit_n);
+EXPORT_SYMBOL_GPL(mpz_set_si);
+EXPORT_SYMBOL_GPL(mpz_set_ui);
+EXPORT_SYMBOL_GPL(mpz_set);
+EXPORT_SYMBOL_GPL(mpz_init_set_si);
+EXPORT_SYMBOL_GPL(mpz_init_set_ui);
+EXPORT_SYMBOL_GPL(mpz_init_set);
+EXPORT_SYMBOL_GPL(mpz_sizeinbase);
+EXPORT_SYMBOL_GPL(mpz_get_str);
+EXPORT_SYMBOL_GPL(mpz_set_str);
+EXPORT_SYMBOL_GPL(mpz_init_set_str);
+EXPORT_SYMBOL_GPL(mpz_import);
+EXPORT_SYMBOL_GPL(mpz_export);
diff --git a/gen_export.sh b/gen_export.sh
new file mode 100755
index 0000000..fe5a825
--- /dev/null
+++ b/gen_export.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+echo '#include <linux/kernel.h>' > export.c
+echo '#include "mini-gmp.h"' >> export.c
+
+
+gcc -P -E -DKERNEL=1 ./mini-gmp.h |
+perl -e 'my $all=join("",<>); my @d; push @d, "EXPORT_SYMBOL_GPL($1);" while $all =~ m/(\w++)\h*(\((?:[^()]++|(?2))*\))\s*;/g; print join("\n", @d) . "\n";' >> export.c
+