aboutsummaryrefslogtreecommitdiff
path: root/libgo/go/plugin/plugin_dlopen.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/plugin/plugin_dlopen.go')
-rw-r--r--libgo/go/plugin/plugin_dlopen.go16
1 files changed, 9 insertions, 7 deletions
diff --git a/libgo/go/plugin/plugin_dlopen.go b/libgo/go/plugin/plugin_dlopen.go
index 78f85c6..3abfb60 100644
--- a/libgo/go/plugin/plugin_dlopen.go
+++ b/libgo/go/plugin/plugin_dlopen.go
@@ -92,15 +92,13 @@ func open(name string) (*Plugin, error) {
plugins[filepath] = p
pluginsMu.Unlock()
- initStr := make([]byte, len(pluginpath)+6)
+ initStr := make([]byte, len(pluginpath)+len("..inittask")+1) // +1 for terminating NUL
copy(initStr, pluginpath)
- copy(initStr[len(pluginpath):], ".init")
+ copy(initStr[len(pluginpath):], "..inittask")
- initFuncPC := C.pluginLookup(h, (*C.char)(unsafe.Pointer(&initStr[0])), &cErr)
- if initFuncPC != nil {
- initFuncP := &initFuncPC
- initFunc := *(*func())(unsafe.Pointer(&initFuncP))
- initFunc()
+ initTask := C.pluginLookup(h, (*C.char)(unsafe.Pointer(&initStr[0])), &cErr)
+ if initTask != nil {
+ doInit(initTask)
}
// Fill out the value of each plugin symbol.
@@ -150,3 +148,7 @@ var (
// lastmoduleinit is defined in package runtime
func lastmoduleinit() (pluginpath string, syms map[string]interface{}, errstr string)
+
+// doInit is defined in package runtime
+//go:linkname doInit runtime.doInit
+func doInit(t unsafe.Pointer) // t should be a *runtime.initTask