A library for calling C functions from Go without Cgo.
package main
import (
"fmt"
"runtime"
"github.com/ebitengine/purego"
)
func getSystemLibrary() string {
switch runtime.GOOS {
case "darwin":
return "/usr/lib/libSystem.B.dylib"
case "linux":
return "libc.so.6"
default:
panic(fmt.Errorf("GOOS=%s is not supported", runtime.GOOS))
}
}
func main() {
libc := purego.Dlopen(getSystemLibrary(), purego.RTLD_NOW|purego.RTLD_GLOBAL)
if err := purego.Dlerror(); err != "" {
panic(err)
}
var puts func(string)
purego.RegisterLibFunc(&puts, libc, "puts")
puts("Calling C from from Go without Cgo!")
}
Then to run: CGO_ENABED=0 go run main.go
Purego uses code that originates from the Go runtime. These files are under the BSD-3 License that can be found in the Go Source. This is a list of the copied files:
zcallback_darwin_*.s
from packageruntime
internal/abi/abi_*.h
from packageruntime/cgo
internal/fakecgo/asm_GOARCH.s
from packageruntime/cgo
internal/fakecgo/callbacks.go
from packageruntime/cgo
internal/fakecgo/go_GOOS_GOARCH.go
from packageruntime/cgo
internal/fakecgo/iscgo.go
from packageruntime/cgo
internal/fakecgo/setenv.go
from packageruntime/cgo