Please answer these questions before submitting your issue. Thanks!
go version)?go version go1.8 linux/amd64
go env)?GOARCH="amd64"
GOBIN="/home/johan/gows/bin"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/johan/gows"
GORACE=""
GOROOT="/usr/lib/go"
GOTOOLDIR="/usr/lib/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build464530147=/tmp/go-build -gno-record-gcc-switches"
CXX="g++"
CGO_ENABLED="1"
PKG_CONFIG="pkg-config"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
I tried to build a simple plugin with CGO_ENABLED=0. It builds fine, and at plugin load time you get an error plugin: not implemented. This is an intentional limitation at the moment, but I think it moves backwards in the general trend of the language development, which has been moving away from C dependencies. This should hopefully be a discussion around supporting plugins without the need for CGO.
I expected to be able to build and load plugins without CGO.
I got an error saying plugin: not implemented.
/cc @crawshaw @ianlancetaylor
Ouch, this one is really annoying as it prevents from using plugins with a statically linked golang executable (made for Docker containers).
The implementation of plugins requires the dynamic linker, so it will not work with statically linked executables. Changing that would be hard. There are no plans to do it.
CL https://golang.org/cl/43158 mentions this issue.
I've mailed https://go-review.googlesource.com/43158 for starters.
Wouldn't this technically break the backwards compatibility promise? Since in 1.8 these builds compile fine with runtime errors.
As noted on the CL, I don't think preventing programs that import the plugin package from building is the right approach. And if we do think it is the right approach, we can do that by simply changing the plugin package to fail in some way when cgo is not available.
Most helpful comment
The implementation of plugins requires the dynamic linker, so it will not work with statically linked executables. Changing that would be hard. There are no plans to do it.