diff --git a/src/lisp/Linux-os.c b/src/lisp/Linux-os.c
index 7f7a4d7acd350c1ef5b443ef5a28cf848c2e368f..b56354859660ea3a42b8b73e451f2ed5a6f8c546 100644
--- a/src/lisp/Linux-os.c
+++ b/src/lisp/Linux-os.c
@@ -385,8 +385,8 @@ valid_addr(os_vm_address_t addr)
 	|| in_range_p(addr, STATIC_SPACE_START, static_space_size)
 	|| in_range_p(addr, DYNAMIC_0_SPACE_START, dynamic_space_size)
 	|| in_range_p(addr, DYNAMIC_1_SPACE_START, dynamic_space_size)
-	|| in_range_p(addr, CONTROL_STACK_START, control_stack_size)
-	|| in_range_p(addr, BINDING_STACK_START, binding_stack_size))
+	|| in_range_p(addr, control_stack, control_stack_size)
+	|| in_range_p(addr, binding_stack, binding_stack_size))
 	return TRUE;
     return FALSE;
 }
diff --git a/src/lisp/globals.c b/src/lisp/globals.c
index 18b4556c83491b2d799647c4a73f40ad4781d41e..3d5f7cb015d0ba4270d7b9d49842599c1d92d218 100644
--- a/src/lisp/globals.c
+++ b/src/lisp/globals.c
@@ -29,6 +29,7 @@ unsigned dynamic_space_size;
 lispobj *control_stack;
 
 
+lispobj *control_stack_start;
 #if (defined(i386) || defined(__x86_64))
 lispobj *control_stack_end;
 #endif
diff --git a/src/lisp/globals.h b/src/lisp/globals.h
index 71a65c393d304a9053bb9b98369ab7fb0b6b3e85..b36325fc65fdda9806ed732968df9c309ef5be47 100644
--- a/src/lisp/globals.h
+++ b/src/lisp/globals.h
@@ -37,6 +37,8 @@ extern unsigned long binding_stack_size;
 extern unsigned long static_space_size;
 extern unsigned long control_stack_size;
 
+extern lispobj *control_stack_start;
+
 #if (defined(i386) || defined(__x86_64))
 extern lispobj *control_stack_end;
 #endif
diff --git a/src/lisp/lisp.c b/src/lisp/lisp.c
index 72a523dba62ebee2e87e30f58c8a492f0b6f31a2..8bfb8473ecd0e0117b8551c7b72c686481eb3463 100644
--- a/src/lisp/lisp.c
+++ b/src/lisp/lisp.c
@@ -676,6 +676,7 @@ main(int argc, const char *argv[], const char *envp[])
 #endif
     validate();
     gc_init();
+    validate_stacks();
 
     /* This is the first use of malloc() and must come after the
      * static memory layout is mmapped to avoid conflicts with possible
diff --git a/src/lisp/os-common.c b/src/lisp/os-common.c
index ab82d3688167068d5bd40254eeed8af66d6d4eb9..4398a917823608886df3b26e2b6c6fd122f918fb 100755
--- a/src/lisp/os-common.c
+++ b/src/lisp/os-common.c
@@ -413,7 +413,7 @@ guard_zones(char **yellow_start, char **red_start)
     /*
      * All x86's have a control stack (aka C stack) that grows down.
      */
-    char *end = (char *) CONTROL_STACK_START;
+    char *end = (char *) control_stack;
 
     *red_start = end;
     *yellow_start = *red_start + RED_ZONE_SIZE;
@@ -424,7 +424,7 @@ guard_zones(char **yellow_start, char **red_start)
      * control stack area.
      */
 
-    char *end = (char *) CONTROL_STACK_START + control_stack_size;
+    char *end = (char *) control_stack_start + control_stack_size;
 
     *red_start = end - RED_ZONE_SIZE;
     *yellow_start = *red_start - YELLOW_ZONE_SIZE;
diff --git a/src/lisp/save.c b/src/lisp/save.c
index 795fac9f3367d0b8b1474e17e0cff23d17d5cbf6..2df0d9c3093beef731e89177207263b96b38078f 100644
--- a/src/lisp/save.c
+++ b/src/lisp/save.c
@@ -136,7 +136,11 @@ save(char *filename, lispobj init_function, int sse2_mode)
     }
     printf("[Undoing binding stack... ");
     fflush(stdout);
+#if 0
     unbind_to_here((lispobj *) BINDING_STACK_START);
+#else
+    unbind_to_here((lispobj *) binding_stack);
+#endif
     SetSymbolValue(CURRENT_CATCH_BLOCK, 0);
     SetSymbolValue(CURRENT_UNWIND_PROTECT_BLOCK, 0);
     SetSymbolValue(EVAL_STACK_TOP, 0);
@@ -277,7 +281,11 @@ save_executable(char *filename, lispobj init_function)
 
     printf("[Undoing binding stack... ");
     fflush(stdout);
+#if 0
     unbind_to_here((lispobj *)BINDING_STACK_START);
+#else
+    unbind_to_here((lispobj *)binding_stack);
+#endif
     SetSymbolValue(CURRENT_CATCH_BLOCK, 0);
     SetSymbolValue(CURRENT_UNWIND_PROTECT_BLOCK, 0);
     SetSymbolValue(EVAL_STACK_TOP, 0);
diff --git a/src/lisp/validate.c b/src/lisp/validate.c
index 7872a12ceb2d1cfc860c9c447a4901409e6d292a..0dec450537f851446eea2f81f6317e543d63140d 100644
--- a/src/lisp/validate.c
+++ b/src/lisp/validate.c
@@ -92,20 +92,10 @@ validate(void)
     */
 #endif
 
-    /* Control Stack */
-    control_stack = (lispobj *) CONTROL_STACK_START;
-#if (defined(i386) || defined(__x86_64))
-    control_stack_end = (lispobj *) (CONTROL_STACK_START + control_stack_size);
-#endif
-    ensure_space(control_stack, control_stack_size);
-
 #ifdef SIGNAL_STACK_START
     ensure_space((lispobj *) SIGNAL_STACK_START, SIGNAL_STACK_SIZE);
 #endif
 
-    /* Binding Stack */
-    binding_stack = (lispobj *) BINDING_STACK_START;
-    ensure_space(binding_stack, binding_stack_size);
 #ifdef LINKAGE_TABLE
     ensure_space((lispobj *) FOREIGN_LINKAGE_SPACE_START,
 		 FOREIGN_LINKAGE_SPACE_SIZE);
@@ -118,6 +108,22 @@ validate(void)
     printf(" done.\n");
 #endif
 
+}
+
+void
+validate_stacks()
+{
+    /* Control Stack */
+    /* Map the conrol stack wherever we have space */
+    control_stack = os_validate(NULL, control_stack_size);
+
+#if (defined(i386) || defined(__x86_64))
+    control_stack_end = (void*)control_stack + control_stack_size;
+#endif
+
+    /* Binding Stack */
+    binding_stack = os_validate(NULL, binding_stack_size);
+
 #ifdef RED_ZONE_HIT
     os_guard_control_stack(0, 1);
 #endif