Commit 11e73b89 authored by Dmitriy Vyukov's avatar Dmitriy Vyukov

cgo: add support for callbacks from dynamic libraries

R=golang-dev, rsc
CC=golang-dev, mpimenov
https://golang.org/cl/5375042
parent 95e60acb
# 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
// 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() {
}
// 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();
}
// 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()
}
......@@ -162,7 +162,7 @@ endif
# 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
......
......@@ -501,6 +501,7 @@ func (p *Package) writeExports(fgo2, fc, fm *os.File) {
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)
......
......@@ -73,6 +73,15 @@ gomake clean
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 $?
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment