背景
之前的文章介绍了三种交叉编译golang程序的方法。上一篇详细的讲了怎么用openwrt-go项目来进行编译。这篇文章打算讲一下怎么使用现成的交叉编译工具(不需要依赖openwrt)编译可以在openwrt和mips上运行的golang程序。例如 gomini/go-mips32。
一、先确认一下自己的CPU架构和系统平台
参考文章:《Go 语言跨平台路由器编译》
1. /proc/cpuinfocat /proc/cpuinfo
#输出信息
system type : Qualcomm Atheros QCA956X ver 1 rev 0
machine : Qualcomm Atheros AP152 reference board
processor : 0
cpu model : MIPS 74Kc V5.0
BogoMIPS : 385.84
wait instruction : yes
microsecond timers : yes
tlb_entries : 32
extra interrupt vector : yes
hardware watchpoint : yes, count: 4, address/irw mask: [0x0ffc, 0x0ffc, 0x0ffb, 0x0ffb]
isa : mips1 mips2 mips32r1 mips32r2
ASEs implemented : mips16 dsp dsp2
shadow register sets : 1
kscratch registers : 0
package : 0
core : 0
VCED exceptions : not available
VCEI exceptions : not availablefile /bin/busybox#file命令没有的话,可以通过opkg安装或者想想其它办法。另外,file /bin/sh 也是可以的
file /bin/busybox
#输出信息
/bin/busybox: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-mips-sf.so.1, corrupted section header sizemips的32位分了两种。大端和小端。
LITTLE-ENDIAN(小字节序、低字节序),即低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。大端就是反过来。
mips32是大端。(我测试的这个芯片是大端,所以用mips32)
mips32le是小端。
有其它和平台相关的疑问,例如arm和arm的版本之类的,请参考上面的文章。
GOARCH分类(芯片,可能部分不太准确,例如mips应该是mips32,可以自己google一下)
参考链接:《GOARCH列表》386
amd64
amd64p32
arm
arm64
ppc64
ppc64le
mips
mipsle
mips64
mips64le
mips64p32
mips64p32le
ppc
s390
s390x
sparc
sparc64GOOS分类(操作系统)android
darwin
dragonfly
freebsd
linux
nacl
netbsd
openbsd
plan9
solaris
windows
二、下载和构建下载go-mips32源git clone https://github.com/gomini/go-mips32.git配置GO编译参数export GOOS=linux
export GOARCH=mips32执行编译#切换目录
cd go-mips32/src
#开始编译(我这里如果不禁用cgo会报错)
CGO_ENABLED=0 ./make.bash拷贝编译好的工具链#先切回到上级目录,不要在src目录操作
cd ..
//创建编译后文件存放文件夹
sudo mkdir /opt/mipsgo
//复制
sudo cp -R * /opt/mipsgogo工程参数配置export GOROOT=/opt/mipsgo
export PATH=/opt/mipsgo/bin:$PATH测试一下#go-mips32自带了一个test目录,可以用里面的helloworld.go测试一下
cd test
#编译(请确保调用的go是刚刚编译得到的那个而不是系统本身的go,如果不确定,请用go的完整路径来进行调用)
go build ./helloworld.go拷贝到路由器或者设备上运行一下。(如果设备存储空间不够,可以通过去除调试信息,把程序精简到三分之一的体积,请参考我上一篇文章)
三、注意事项
如果构建完一个平台,需要构建另外一个平台的话。要么删掉整个目录,要么创建一个新目录。
我之前构建完mips32le之后,再构建mips32,总是不成功。
http://xzh.i3geek.com