Cross Compiling and Language Interop oh my!
#include "exportSyms.h"
int main() {
PrintInt(10);
LogString("Hello World");
return 0;
}
This represents my experiments in getting Go to do different configuration things for our cross-platform environment
nick@bignick:~/demo/targetMe$ GOOS=linux GOARCH=arm GOARM=5 go build
nick@bignick:~/demo/targetMe$ file targetMe
targetMe: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped
See also: https://github.com/golang/go/issues/12443#issuecomment-136906785 for useful information
nick@bignick:~/demo/$ CC=arm-poky-linux-gnueabi-gcc CGO_CFLAGS="-march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a8 --sysroot=/opt/poky/1.7.1/sysroots/cortexa8hf-vfp-neon-poky-linux-gnueabi" CGO_LDFLAGS=-v CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=5 go build -o Foo_ARM *.go
nick@bignick:~/demo/cgodemo$ go build -buildmode=c-archive exportSyms.go
nick@bignick:~/demo/cgodemo$ gcc -pthread useFromC.c exportSyms.a -o useFromC
nick@bignick:~/demo/cgodemo$ ./useFromC
10
2015/09/02 14:22:13 Hello World
nick@bignick:~/demo/cgodemo$ CC=arm-poky-linux-gnueabi-gcc CGO_CFLAGS="-march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a8 --sysroot=/opt/poky/1.7.1/sysroots/cortexa8hf-vfp-neon-poky-linux-gnueabi" CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=5 go build -buildmode=c-archive exportSyms.go
nick@bignick:~/demo/cgodemo$ $CC -pthread useFromC.c exportSyms.a -o useFromC
nick@bignick:~/demo/cgodemo$ file useFromC
useFromC: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=914408ad20be622e5205f93175e7c4d0337487e9, not stripped
nick@bignick:~/demo/cgodemo$ scp useFromC root@TARGET.local:/tmp/
...
root@TARGET:~# /tmp/useFromC
10
2015/05/30 01:46:31 Hello World
package main
import (
"C"
"fmt"
"log"
)
//export PrintInt
func PrintInt(x int) {
fmt.Println(x)
}
//export LogString
func LogString(s * C.char) {
log.Println(C.GoString(s))
}
func main() {}
package binding
// #include <stdlib.h>
// #include <stdio.h>
// #cgo LDFLAGS: -mfloat-abi=hard
/* void myprint(char* s) {
printf("%s", s);
}
*/
import "C"
func Random() int {
return int(C.random())
}
func PrintHello() {
C.myprint(C.CString("Hello\n"))
}
func Seed(i int) {
C.srandom(C.uint(i))
}
package main
import (
"./binding"
"fmt"
)
func main() {
binding.PrintHello()
binding.Seed(1)
fmt.Println(binding.Random())
binding.Seed(2)
fmt.Println(binding.Random())
binding.Seed(3)
fmt.Println(binding.Random())
}