1
0
mirror of https://github.com/golang/go synced 2024-11-25 02:07:58 -07:00

cgo: add support for callbacks from dynamic libraries

R=golang-dev, rsc
CC=golang-dev, mpimenov
https://golang.org/cl/5375042
This commit is contained in:
Dmitriy Vyukov 2011-11-22 17:57:49 +03:00
parent 95e60acb97
commit 11e73b89ca
7 changed files with 69 additions and 1 deletions

22
misc/cgo/testso/Makefile Normal file
View File

@ -0,0 +1,22 @@
# Copyright 2011 The Go Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
include ../../../src/Make.inc
TARG=cgosotest
CGO_DEPS+=libcgoso.so
CGO_LDFLAGS+=-lcgoso -L.
CLEANFILES+=out libcgoso.so
CGOFILES=\
cgoso.go\
include ../../../src/Make.pkg
libcgoso.so: cgoso_c.c
gcc cgoso_c.c -fPIC -o $@ $(_CGO_CFLAGS_$(GOARCH)) $(_CGO_LDFLAGS_$(GOOS))
out: install main.go
$(GC) main.go
$(LD) -o $@ main.$O

16
misc/cgo/testso/cgoso.go Normal file
View File

@ -0,0 +1,16 @@
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package cgosotest
//void sofunc(void);
import "C"
func Test() {
C.sofunc()
}
//export goCallback
func goCallback() {
}

View File

@ -0,0 +1,9 @@
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
void sofunc(void)
{
extern void goCallback(void);
goCallback();
}

11
misc/cgo/testso/main.go Normal file
View File

@ -0,0 +1,11 @@
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import "cgosotest"
func main() {
cgosotest.Test()
}

View File

@ -162,7 +162,7 @@ endif
# After main we have to define all the symbols that will be provided # After main we have to define all the symbols that will be provided
# by Go code. That's crosscall2 and any exported symbols. # 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) $(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -g -fPIC -O2 -o $@ $^ $(CGO_LDFLAGS) $(_CGO_LDFLAGS)
_obj/_cgo_import.c: _cgo1_.o _obj/_cgo_import.c: _cgo1_.o

View File

@ -501,6 +501,7 @@ func (p *Package) writeExports(fgo2, fc, fm *os.File) {
if fn.Recv != nil { if fn.Recv != nil {
goname = "_cgoexpwrap" + cPrefix + "_" + fn.Recv.List[0].Names[0].Name + "_" + goname 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, "extern void ·%s();\n", goname)
fmt.Fprintf(fc, "\nvoid\n") fmt.Fprintf(fc, "\nvoid\n")
fmt.Fprintf(fc, "_cgoexp%s_%s(void *a, int32 n)\n", cPrefix, exp.ExpName) fmt.Fprintf(fc, "_cgoexp%s_%s(void *a, int32 n)\n", cPrefix, exp.ExpName)

View File

@ -73,6 +73,15 @@ gomake clean
gotest gotest
) || exit $? ) || exit $?
[ "$CGO_ENABLED" != 1 ] ||
[ "$GOHOSTOS" == windows ] ||
[ "$GOHOSTOS" == darwin ] ||
(xcd ../misc/cgo/testso
gomake clean
gomake out
LD_LIBRARY_PATH=. ./out
) || exit $?
(xcd ../doc/progs (xcd ../doc/progs
time ./run time ./run
) || exit $? ) || exit $?