diff --git a/src/acconfig.h b/src/acconfig.h
index e8173d2e36e566910a9c9220e1c7451528be30c9..6ad811fd01e9068e7f358f4bb0cb6a3f50d2dcee 100644
--- a/src/acconfig.h
+++ b/src/acconfig.h
@@ -1,5 +1,5 @@
 /*
- * $Id: acconfig.h,v 1.55 2000/03/25 23:43:25 hubbe Exp $
+ * $Id: acconfig.h,v 1.56 2000/03/28 08:10:53 hubbe Exp $
  */
 #ifndef MACHINE_H
 #define MACHINE_H
@@ -104,6 +104,12 @@
  */
 #undef STACK_DIRECTION
 
+/* Define this to the number of KB in the initial stack,
+ * currently this is 1 Mb on FreeBSD, 2Mb on Linux and
+ * unlimited (undefined) everywhere else
+ */
+#undef Pike_INITIAL_STACK_SIZE
+
 /* If so, is it restricted to user and system time? */
 #undef GETRUSAGE_RESTRICTED
 
diff --git a/src/configure.in b/src/configure.in
index ddaaae82e14c7ac8091a71dadc23a55337f00b19..a10f5f0be48aba436d5379890186c13c947e961c 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -1,4 +1,4 @@
-AC_REVISION("$Id: configure.in,v 1.357 2000/03/27 17:05:32 grubba Exp $")
+AC_REVISION("$Id: configure.in,v 1.358 2000/03/28 08:10:53 hubbe Exp $")
 AC_INIT(interpret.c)
 AC_CONFIG_HEADER(machine.h)
 
@@ -1373,6 +1373,51 @@ int main(int argc, char **argv)
         if test "x$PTHREAD_CONFIG" = xno ; then
           CFLAGS="${CFLAGS} -pthread"
           LD_FALLBACK_FLAGS="${LD_FALLBACK_FLAGS-} -lc_r"
+
+          AC_MSG_CHECKING(Initial stack limit)
+          AC_CACHE_VAL(pike_cv_initial_stack_size,[
+          AC_TRY_RUN([
+#include <stdio.h>
+
+static int depth=0;
+FILE *f;
+
+void save_depth(void);
+
+void use_stack(void *page)
+{
+  void *X[8190];
+  X[0]=page;
+  save_depth();
+  use_stack(&X);
+}
+
+void save_depth(void)
+{
+  depth+=sizeof(void *)*8192;
+  fprintf(f,"%d\n",depth);
+  fflush(f);
+  if(depth>0x80000000) exit(0);
+}
+
+int main(int argc)
+{
+  f=fopen("confdefs.out.2","w"); /* weird filename to circumvent configure weirdness */
+  save_depth();
+  use_stack(0);
+}
+],
+pike_cv_initial_stack_size='',
+while read x; do pike_cv_initial_stack_size=$x ; done <confdefs.out.2)
+rm confdefs.out.2 >/dev/null 2>/dev/null || :
+])
+          if test x$pike_cv_initial_stack_size = x ; then
+             AC_MSG_RESULT(unlimited)
+          else
+             AC_MSG_RESULT($pike_cv_initial_stack_size)
+             AC_DEFINE_UNQUOTED(Pike_INITIAL_STACK_SIZE,$pike_cv_initial_stack_size)
+          fi
+
         else
           CFLAGS="$CFLAGS `pthread-config --cflags`"
           LIBS="$LIBS `pthread-config --libs`"
@@ -3260,6 +3305,9 @@ AC_CACHE_VAL(pike_cv_sys_ccshared,[
       esac
     else
       case $pike_cv_sys_os in
+        IRIX*)
+          AC_SYS_COMPILER_FLAG(-share,cc_shared,CCSHARED)
+        ;;
 	hp*|HP*) CCSHARED="+z"; ;;
 	FreeBSD*) CCSHARED="-fpic";;
 	SCO_SV*) CCSHARED="-KPIC -dy -Bdynamic";;
diff --git a/src/main.c b/src/main.c
index 2857c65838fc91e9e829f2cc326ecb5a27544ae0..8df667cc1b1ec86a4627217d01db6497207c36b5 100644
--- a/src/main.c
+++ b/src/main.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: main.c,v 1.83 2000/03/08 00:09:49 hubbe Exp $");
+RCSID("$Id: main.c,v 1.84 2000/03/28 08:10:53 hubbe Exp $");
 #include "fdlib.h"
 #include "backend.h"
 #include "module.h"
@@ -415,6 +415,12 @@ int dbm_main(int argc, char **argv)
       if(lim.rlim_cur == RLIM_INFINITY)
 	lim.rlim_cur=1024*1024*32;
 #endif
+
+#ifdef Pike_INITIAL_STACK_SIZE
+      if(lim.rlim_cur > Pike_INITIAL_STACK_SIZE)
+	lim.rlim_cur=Pike_INITIAL_STACK_SIZE;
+#endif
+
       stack_top += STACK_DIRECTION * lim.rlim_cur;
 
 #ifdef HAVE_PTHREAD_INITIAL_THREAD_BOS