diff --git a/src/main.c b/src/main.c
index 5b9624444025eb0a4864fee72bc937af83edbc20..c3746c6b94d9e99b561449e23c44b3ce3cff395f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: main.c,v 1.103 2000/09/30 19:40:39 mast Exp $");
+RCSID("$Id: main.c,v 1.104 2000/10/01 08:00:53 hubbe Exp $");
 #include "fdlib.h"
 #include "backend.h"
 #include "module.h"
@@ -33,13 +33,9 @@ RCSID("$Id: main.c,v 1.103 2000/09/30 19:40:39 mast Exp $");
 #include "constants.h"
 #include "version.h"
 
-#ifdef HAVE_PTHREAD_INITIAL_THREAD_BOS
-#if defined(HAVE_DLOPEN)
-#ifdef HAVE_DLFCN_H
+#if defined(__linux__) && defined(HAVE_DLOPEN) && defined(HAVE_DLFCN_H)
 #include <dlfcn.h>
 #endif
-#endif
-#endif
 
 #include "las.h"
 
@@ -434,17 +430,22 @@ int dbm_main(int argc, char **argv)
 	lim.rlim_cur=Pike_INITIAL_STACK_SIZE;
 #endif
 
+#if defined(__linux__) && defined(PIKE_THREADS)
+      /* This is a really really *stupid* limit in glibc 2.x
+       * which is not detectable since __pthread_initial_thread_bos
+       * went static. On a stupidity-scale from 1-10, this rates a
+       * solid 11. - Hubbe
+       */
+      if(lim.rlim_cur > 2*1024*1024) lim.rlim_cur=2*1024*1024;
+#endif
+
       Pike_interpreter.stack_top += STACK_DIRECTION * lim.rlim_cur;
 
-#ifdef HAVE_PTHREAD_INITIAL_THREAD_BOS
-#if defined(HAVE_DLOPEN) && defined(HAVE_DLFCN_H)
-      /* FIXME: this code should be used on all linux glibc systems
-       * even those without __pthread_initial_thread_bos
-       * -Hubbe
-       */
+#if defined(__linux__) && defined(HAVE_DLOPEN) && defined(HAVE_DLFCN_H)
       {
 	char ** bos_location;
 	void *handle;
+	/* damn this is ugly -Hubbe */
 	if((handle=dlopen(0, RTLD_LAZY)))
 	{
 	  bos_location=dlsym(handle,"__pthread_initial_thread_bos");
@@ -452,11 +453,13 @@ int dbm_main(int argc, char **argv)
 
 	  if(bos_location && *bos_location &&
 	     (*bos_location - Pike_interpreter.stack_top) *STACK_DIRECTION < 0)
+	  {
 	    Pike_interpreter.stack_top=*bos_location;
+	  }
 	}
       }
 #else
-
+#ifdef HAVE_PTHREAD_INITIAL_THREAD_BOS
       {
 	extern char * __pthread_initial_thread_bos;
 	/* Linux glibc threads are limited to a 4 Mb stack
@@ -465,10 +468,13 @@ int dbm_main(int argc, char **argv)
 	
 	if(__pthread_initial_thread_bos && 
 	   (__pthread_initial_thread_bos - Pike_interpreter.stack_top) *STACK_DIRECTION < 0)
+	{
 	  Pike_interpreter.stack_top=__pthread_initial_thread_bos;
+	}
       }
-#endif
-#endif
+#endif /* HAVE_PTHREAD_INITIAL_THREAD_BOS */
+#endif /* __linux__ && HAVE_DLOPEN && HAVE_DLFCN_H */
+
       Pike_interpreter.stack_top -= STACK_DIRECTION * 8192 * sizeof(char *);
 
 #ifdef STACK_DEBUG