github.com/riscv/riscv-go@v0.0.0-20200123204226-124ebd6fcc8e/misc/cgo/test/issue4029.go (about) 1 // Copyright 2012 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // +build !windows 6 7 package cgotest 8 9 /* 10 #include <dlfcn.h> 11 #cgo linux LDFLAGS: -ldl 12 13 extern void call4029(void *arg); 14 */ 15 import "C" 16 17 import ( 18 "testing" 19 ) 20 21 var callbacks int 22 23 //export IMPIsOpaque 24 func IMPIsOpaque() { 25 callbacks++ 26 } 27 28 //export IMPInitWithFrame 29 func IMPInitWithFrame() { 30 callbacks++ 31 } 32 33 //export IMPDrawRect 34 func IMPDrawRect() { 35 callbacks++ 36 } 37 38 //export IMPWindowResize 39 func IMPWindowResize() { 40 callbacks++ 41 } 42 43 func test4029(t *testing.T) { 44 loadThySelf(t, "IMPWindowResize") 45 loadThySelf(t, "IMPDrawRect") 46 loadThySelf(t, "IMPInitWithFrame") 47 loadThySelf(t, "IMPIsOpaque") 48 if callbacks != 4 { 49 t.Errorf("got %d callbacks, expected 4", callbacks) 50 } 51 } 52 53 func loadThySelf(t *testing.T, symbol string) { 54 this_process := C.dlopen(nil, C.RTLD_NOW) 55 if this_process == nil { 56 t.Error("dlopen:", C.GoString(C.dlerror())) 57 return 58 } 59 defer C.dlclose(this_process) 60 61 symbol_address := C.dlsym(this_process, C.CString(symbol)) 62 if symbol_address == nil { 63 t.Error("dlsym:", C.GoString(C.dlerror())) 64 return 65 } 66 t.Log(symbol, symbol_address) 67 C.call4029(symbol_address) 68 }