diff --git a/src/block_alloc_h.h b/src/block_alloc_h.h
index ec525e2bb7f0ea611222dc01ae757029ec0658f6..167e74f2bad990c62bd2f32988b459ac54d1c836 100644
--- a/src/block_alloc_h.h
+++ b/src/block_alloc_h.h
@@ -22,8 +22,8 @@
 
 #define BLOCK_ALLOC(DATA,SIZE)						\
 struct DATA *PIKE_CONCAT(alloc_,DATA)(void);				\
-void PIKE_CONCAT3(new_,DATA,_context)(void);				\
-void PIKE_CONCAT(really_free_,DATA)(struct DATA *d);			\
+PMOD_EXPORT void PIKE_CONCAT3(new_,DATA,_context)(void);				\
+PMOD_EXPORT void PIKE_CONCAT(really_free_,DATA)(struct DATA *d);			\
 void PIKE_CONCAT3(free_all_,DATA,_blocks)(void);			\
 void PIKE_CONCAT3(count_memory_in_,DATA,s)(size_t *num, size_t *size);	\
 void PIKE_CONCAT3(init_,DATA,_blocks)(void)
diff --git a/src/configure.in b/src/configure.in
index 853935e400a82aa32394876d143283cc808aa2b0..56bab281221befabd4ffdb055529a204a80c1aa9 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -994,6 +994,9 @@ else
 fi
 fi
 
+AC_SYS_COMPILER_FLAG([-fvisibility=hidden],[fvisibility_hidden],CFLAGS)
+
+
 AC_SYS_COMPILER_FLAG(+O3,plus_O3,OPTIMIZE, [
   AC_SYS_COMPILER_FLAG(-O3,O3,OPTIMIZE, [
     AC_SYS_COMPILER_FLAG(-O2,O2,OPTIMIZE, [
@@ -8101,6 +8104,9 @@ AC_CACHE_VAL(pike_cv_sys_dynamic_loading,
   cat >conftest.c <<EOF
 #include <stdio.h>
 #include <stdlib.h>
+#if __GNUC__ >= 4
+__attribute__ ((visibility("default")))
+# endif
 void testfunc(void) {
   fprintf(stderr,"Calling testfunc2\n");
   testfunc2();
@@ -8130,6 +8136,9 @@ EOF
     AC_TRY_RUN([
 #define TESTING
 #include "dynamic_load.c"
+#if __GNUC__ >= 4
+__attribute__ ((visibility("default")))
+# endif
 void testfunc2(void) { exit(0); }
 ], pike_cv_sys_dynamic_loading=yes, pike_cv_sys_dynamic_loading=no, pike_cv_sys_dynamic_loading=no)
     CFLAGS="$OLD_CFLAGS"
diff --git a/src/global.h b/src/global.h
index 2464d2ad6984e64caccc177b2ad09322e1d97363..0a645d7d0b92746a1007f8dfc94841921eaf0a14 100644
--- a/src/global.h
+++ b/src/global.h
@@ -560,7 +560,9 @@ typedef struct p_wchar_p
  * themselves, unless they are compiled statically. */
 #   define PMOD_EXPORT __declspec(dllexport)
 #  endif
-# else
+# elif __GNUC__ >= 4
+#   define PMOD_EXPORT  __attribute__ ((visibility("default")))
+# else 
 #  define PMOD_EXPORT
 # endif
 #endif
diff --git a/src/module.h b/src/module.h
index d25bcdc437c7e72d2dde738bef10bafbbe135d10..de4b45a480f5eecab22e075c973052011f236640 100644
--- a/src/module.h
+++ b/src/module.h
@@ -14,8 +14,8 @@
 #define PIKE_MODULE_INIT __declspec(dllexport) void pike_module_init(void)
 #define PIKE_MODULE_EXIT __declspec(dllexport) void pike_module_exit(void)
 #else
-#define PIKE_MODULE_INIT void pike_module_init(void)
-#define PIKE_MODULE_EXIT void pike_module_exit(void)
+#define PIKE_MODULE_INIT PMOD_EXPORT void pike_module_init(void)
+#define PIKE_MODULE_EXIT PMOD_EXPORT void pike_module_exit(void)
 #endif /* DYNAMIC_MODULE && __NT__ */
 
 /* Prototypes begin here */