Skip to content

Instantly share code, notes, and snippets.

@amitsaha
Forked from 17twenty/GoWithC.go
Created July 11, 2016 04:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save amitsaha/ec8fbbc01e22ef9cc020570f415fa2fb to your computer and use it in GitHub Desktop.
Save amitsaha/ec8fbbc01e22ef9cc020570f415fa2fb to your computer and use it in GitHub Desktop.
Cross Compiling and Language Interop oh my!

Cross Compiling Go Code in Weird Configurations for fun and (little) profit

This represents my experiments in getting Go to do different configuration things for our cross-platform environment

Building Go code for Target (no mixed code, just Go)

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

Building C code in to Go with cross compiler

See also: golang/go#12443 (comment) 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

Building Go code into C

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

Cross Compiling Go into Library for Compiling into Target app

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 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 (
"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 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())
}
#include "exportSyms.h"
int main() {
PrintInt(10);
LogString("Hello World");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment