diff options
Diffstat (limited to 'libgo/go/plugin/plugin_dlopen.go')
-rw-r--r-- | libgo/go/plugin/plugin_dlopen.go | 16 |
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 |