From: David Crawshaw Date: Mon, 19 Sep 2016 18:09:07 +0000 (-0400) Subject: plugin: darwin support X-Git-Tag: go1.8beta1~1189 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=b444d438c061fa934130fed17d34c23e77174851;p=gostls13.git plugin: darwin support Change-Id: I76981d1d83da401178226634d076371a04f5ccb7 Reviewed-on: https://go-review.googlesource.com/29392 Run-TryBot: David Crawshaw TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- diff --git a/src/plugin/plugin_dlopen.go b/src/plugin/plugin_dlopen.go index 45c0eeb07f..e881b258e0 100644 --- a/src/plugin/plugin_dlopen.go +++ b/src/plugin/plugin_dlopen.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build linux,cgo +// +build linux,cgo darwin,cgo package plugin @@ -13,6 +13,8 @@ package plugin #include #include +#include + static uintptr_t pluginOpen(const char* path, char** err) { void* h = dlopen(path, RTLD_NOW|RTLD_GLOBAL); if (h == NULL) { @@ -38,12 +40,18 @@ import ( ) func open(name string) (*Plugin, error) { - pluginsMu.Lock() + cPath := (*C.char)(C.malloc(C.PATH_MAX + 1)) + defer C.free(unsafe.Pointer(cPath)) + cRelName := C.CString(name) - cPath := C.realpath(cRelName, nil) + if C.realpath(cRelName, cPath) == nil { + return nil, errors.New("plugin.Open(" + name + "): realpath failed") + } C.free(unsafe.Pointer(cRelName)) - defer C.free(unsafe.Pointer(cPath)) + path := C.GoString(cPath) + + pluginsMu.Lock() if p := plugins[path]; p != nil { pluginsMu.Unlock() <-p.loaded @@ -61,6 +69,7 @@ func open(name string) (*Plugin, error) { if len(name) > 3 && name[len(name)-3:] == ".so" { name = name[:len(name)-3] } + syms := lastmoduleinit() if plugins == nil { plugins = make(map[string]*Plugin) diff --git a/src/plugin/plugin_stubs.go b/src/plugin/plugin_stubs.go index 1b935bffa9..f0bcb4a3bd 100644 --- a/src/plugin/plugin_stubs.go +++ b/src/plugin/plugin_stubs.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !linux !cgo +// +build !linux,!darwin !cgo package plugin