Many small edits.
diff --git a/src/libthread/channel.c b/src/libthread/channel.c
index 4dc51fc..903889a 100644
--- a/src/libthread/channel.c
+++ b/src/libthread/channel.c
@@ -249,6 +249,7 @@
 	Channel *c;
 	_Thread *t;
 
+	needstack(512);
 	for(i=0; a[i].op != CHANEND && a[i].op != CHANNOBLK; i++)
 		;
 	n = i;
diff --git a/src/libthread/daemonize.c b/src/libthread/daemonize.c
index c6e00d1..4ed252e 100644
--- a/src/libthread/daemonize.c
+++ b/src/libthread/daemonize.c
@@ -42,10 +42,12 @@
 		fprint(2, "%s: wait pid %d stopped\n", argv0, pid);
 		return;
 	}
+#ifdef WIFCONTINUED
 	if(WIFCONTINUED(status)){
 		fprint(2, "%s: wait pid %d continued\n", argv0, pid);
 		return;
 	}
+#endif
 	fprint(2, "%s: wait pid %d status 0x%ux\n", argv0, pid, status);
 	_exit(99);
 }
@@ -84,8 +86,6 @@
 
 	sigpid = 1;
 
-	threadlinklibrary();
-
 	if(pipe(p) < 0)
 		sysfatal("passer pipe: %r");
 
diff --git a/src/libthread/thread.c b/src/libthread/thread.c
index 2b6d1e3..b886e30 100644
--- a/src/libthread/thread.c
+++ b/src/libthread/thread.c
@@ -169,6 +169,7 @@
 {
 	Proc *p;
 
+	needstack(0);
 	p = proc();
 //print("threadswtch %p\n", p);
 	contextswitch(&p->thread->context, &p->schedcontext);
@@ -324,6 +325,20 @@
 	va_end(arg);
 }
 
+void
+needstack(int n)
+{
+	_Thread *t;
+
+	t = proc()->thread;
+
+	if((char*)&t <= (char*)t->stk
+	|| (char*)&t - (char*)t->stk < 256+n){
+		fprint(2, "thread stack overflow\n");
+		abort();
+	}
+}
+
 /*
  * locking
  */
@@ -499,11 +514,6 @@
 	threadmain(threadargc, threadargv);
 }
 
-void
-threadlinklibrary(void)
-{
-}
-
 int
 main(int argc, char **argv)
 {