cgo: add support for callbacks from dynamic libraries

R=golang-dev, rsc
CC=golang-dev, mpimenov
https://golang.org/cl/5375042
diff --git a/src/Make.pkg b/src/Make.pkg
index 6d0ba98..de4c769 100644
--- a/src/Make.pkg
+++ b/src/Make.pkg
@@ -162,7 +162,7 @@
 # After main we have to define all the symbols that will be provided
 # by Go code.  That's crosscall2 and any exported symbols.
 
-_cgo1_.o: _cgo_main.o $(CGO_OFILES)
+_cgo1_.o: _cgo_main.o $(CGO_OFILES) $(CGO_DEPS)
 	$(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -g -fPIC -O2 -o $@ $^ $(CGO_LDFLAGS) $(_CGO_LDFLAGS)
 
 _obj/_cgo_import.c: _cgo1_.o
diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go
index c532262..49868aa 100644
--- a/src/cmd/cgo/out.go
+++ b/src/cmd/cgo/out.go
@@ -501,6 +501,7 @@
 		if fn.Recv != nil {
 			goname = "_cgoexpwrap" + cPrefix + "_" + fn.Recv.List[0].Names[0].Name + "_" + goname
 		}
+		fmt.Fprintf(fc, "#pragma dynexport %s %s\n", goname, goname)
 		fmt.Fprintf(fc, "extern void ·%s();\n", goname)
 		fmt.Fprintf(fc, "\nvoid\n")
 		fmt.Fprintf(fc, "_cgoexp%s_%s(void *a, int32 n)\n", cPrefix, exp.ExpName)
diff --git a/src/run.bash b/src/run.bash
index 927e193..74ad72e 100755
--- a/src/run.bash
+++ b/src/run.bash
@@ -73,6 +73,15 @@
 gotest
 ) || exit $?
 
+[ "$CGO_ENABLED" != 1 ] ||
+[ "$GOHOSTOS" == windows ] ||
+[ "$GOHOSTOS" == darwin ] ||
+(xcd ../misc/cgo/testso
+gomake clean
+gomake out
+LD_LIBRARY_PATH=. ./out
+) || exit $?
+
 (xcd ../doc/progs
 time ./run
 ) || exit $?