runtime: fix signal stack bug

In CL 4188061 I changed malg to allocate the requested
number of bytes n, not n+StackGuard, so that the
allocations would use rounder numbers.

The allocation of the signal stack asks for 32k and
then used g->stackguard as the base, but g->stackguard
is StackGuard bytes above the base.  Previously, asking
for 32k meant getting 32k+StackGuard bytes, so using
g->stackguard as the base was safe.  Now, the actual base
must be computed, so that the signal handler does not
run StackGuard bytes past the top of the stack.

Was causing flakiness mainly in programs that use the
network, because they sometimes write to closed network
connections, causing SIGPIPEs.  Was also causing problems
in the doc/progs test.

Also fix Makefile so that changes to stack.h trigger rebuild.

R=bradfitzgo, r, r2
CC=golang-dev
https://golang.org/cl/4230044
diff --git a/src/pkg/runtime/Makefile b/src/pkg/runtime/Makefile
index 38e1aa6..185397f 100644
--- a/src/pkg/runtime/Makefile
+++ b/src/pkg/runtime/Makefile
@@ -94,6 +94,7 @@
 	runtime.h\
 	hashmap.h\
 	malloc.h\
+	stack.h\
 	$(GOARCH)/asm.h\
 	$(GOOS)/os.h\
 	$(GOOS)/signals.h\
@@ -141,13 +142,13 @@
 	./goc2c "`pwd`/$<" > $@.tmp
 	mv -f $@.tmp $@
 
-%.$O:	$(GOARCH)/%.c
+%.$O:	$(GOARCH)/%.c $(HFILES)
 	$(CC) $(CFLAGS) $<
 
-%.$O:	$(GOOS)/%.c
+%.$O:	$(GOOS)/%.c $(HFILES)
 	$(CC) $(CFLAGS) $<
 
-%.$O:	$(GOOS)/$(GOARCH)/%.c
+%.$O:	$(GOOS)/$(GOARCH)/%.c $(HFILES)
 	$(CC) $(CFLAGS) $<
 
 %.$O:	$(GOARCH)/%.s $(GOARCH)/asm.h
diff --git a/src/pkg/runtime/darwin/thread.c b/src/pkg/runtime/darwin/thread.c
index 57e8131..235d69a 100644
--- a/src/pkg/runtime/darwin/thread.c
+++ b/src/pkg/runtime/darwin/thread.c
@@ -5,6 +5,7 @@
 #include "runtime.h"
 #include "defs.h"
 #include "os.h"
+#include "stack.h"
 
 extern SigTab runtime·sigtab[];
 
@@ -176,7 +177,7 @@
 {
 	// Initialize signal handling.
 	m->gsignal = runtime·malg(32*1024);	// OS X wants >=8K, Linux >=2K
-	runtime·signalstack(m->gsignal->stackguard, 32*1024);
+	runtime·signalstack(m->gsignal->stackguard - StackGuard, 32*1024);
 }
 
 // Mach IPC, to get at semaphores
diff --git a/src/pkg/runtime/freebsd/thread.c b/src/pkg/runtime/freebsd/thread.c
index 9bd8838..569098a 100644
--- a/src/pkg/runtime/freebsd/thread.c
+++ b/src/pkg/runtime/freebsd/thread.c
@@ -4,6 +4,7 @@
 #include "runtime.h"
 #include "defs.h"
 #include "os.h"
+#include "stack.h"
 
 extern SigTab runtime·sigtab[];
 extern int32 runtime·sys_umtx_op(uint32*, int32, uint32, void*, void*);
@@ -175,7 +176,7 @@
 {
 	// Initialize signal handling
 	m->gsignal = runtime·malg(32*1024);
-	runtime·signalstack(m->gsignal->stackguard, 32*1024);
+	runtime·signalstack(m->gsignal->stackguard - StackGuard, 32*1024);
 }
 
 void
diff --git a/src/pkg/runtime/linux/thread.c b/src/pkg/runtime/linux/thread.c
index d5f9a8f..7166b0e 100644
--- a/src/pkg/runtime/linux/thread.c
+++ b/src/pkg/runtime/linux/thread.c
@@ -5,6 +5,7 @@
 #include "runtime.h"
 #include "defs.h"
 #include "os.h"
+#include "stack.h"
 
 extern SigTab runtime·sigtab[];
 
@@ -274,7 +275,7 @@
 {
 	// Initialize signal handling.
 	m->gsignal = runtime·malg(32*1024);	// OS X wants >=8K, Linux >=2K
-	runtime·signalstack(m->gsignal->stackguard, 32*1024);
+	runtime·signalstack(m->gsignal->stackguard - StackGuard, 32*1024);
 }
 
 void