-
Notifications
You must be signed in to change notification settings - Fork 18.3k
Description
What version of Go are you using (go version
)?
$ go version go version go1.17 windows/amd64
Does this issue reproduce with the latest release?
Yes
What operating system and processor architecture are you using (go env
)?
go env
Output
$ go env set GO111MODULE=auto set GOARCH=amd64 set GOBIN= set GOCACHE=C:\Users\keith\AppData\Local\go-build set GOENV=C:\Users\keith\AppData\Roaming\go\env set GOEXE=.exe set GOEXPERIMENT= set GOFLAGS= set GOHOSTARCH=amd64 set GOHOSTOS=windows set GOINSECURE= set GOMODCACHE=C:\py\go\pkg\mod set GONOPROXY=github.com/keithcat1/nvgo set GONOSUMDB=github.com/keithcat1/nvgo set GOOS=windows set GOPATH=C:\py\go set GOPRIVATE=github.com/keithcat1/nvgo set GOPROXY=https://proxy.golang.org,direct set GOROOT=C:\go set GOSUMDB=sum.golang.org set GOTMPDIR= set GOTOOLDIR=C:\go\pkg\tool\windows_amd64 set GOVCS= set GOVERSION=go1.17 set GCCGO=gccgo set AR=ar set CC=gcc set CXX=g++ set CGO_ENABLED=1 set GOMOD=C:\py\go\player\go.mod set CGO_CFLAGS=-g -O2 set CGO_CPPFLAGS= set CGO_CXXFLAGS=-g -O2 set CGO_FFLAGS=-g -O2 set CGO_LDFLAGS=-g -O2 set PKG_CONFIG=pkg-config set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\keith\AppData\Local\Temp\go-build1242204174=/tmp/go-build -gno-record-gcc-switches
What did you do?
I was working over on github.com/keithcat1/gobass, adding a way for users to pass Go functions as a C callback. This involves creating a Go wrapper function which calls the user-provided callback. My problem is that BASS requires its callbacks to have the CALLBACK attribute. On windows this boils down to __stdcall.
On Windows/386 I get a linker error when trying to get the pointer to a stdcall function from Go. I think this is because stdcall functions have their name changed from for example 'add' to '_add@8' and Go can't account for this.
Here is an example:
example.zip
Get either a 32-bit MinGW toolchain from something like https://www.winlibs.com Extract or LLVM MinGW, cd into the example, set GOARCH=386 and go build. If using GCC you'll get a warning about stdcall fixups, and if using Clang the linking process will fail entirely.
The way to get around this for me was to make functions that returned the C function pointers so that the C comppiler could do the right thing.
Metadata
Metadata
Assignees
Labels
Type
Projects
Status
Activity
[-]CGO: trying to get a C function pointer from Go breaks if the function is stdcall[/-][+]cmd/link: trying to get a C function pointer from Go breaks if the function is stdcall[/+]