背景

之前的文章介绍了三种交叉编译golang程序的方法。上一篇详细的讲了怎么用openwrt-go项目来进行编译。这篇文章打算讲一下怎么使用现成的交叉编译工具(不需要依赖openwrt)编译可以在openwrt和mips上运行的golang程序。例如 gomini/go-mips32。

一、先确认一下自己的CPU架构和系统平台

参考文章:《Go 语言跨平台路由器编译》
1. /proc/cpuinfo

cat /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 available
  1. file /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 size
  1. mips的32位分了两种。大端和小端。
    LITTLE-ENDIAN(小字节序、低字节序),即低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。大端就是反过来。
    mips32是大端。(我测试的这个芯片是大端,所以用mips32)
    mips32le是小端。
  2. 有其它和平台相关的疑问,例如arm和arm的版本之类的,请参考上面的文章。
  3. GOARCH分类(芯片,可能部分不太准确,例如mips应该是mips32,可以自己google一下)
    参考链接:《GOARCH列表》
386
amd64
amd64p32
arm
arm64
ppc64
ppc64le
mips
mipsle
mips64
mips64le
mips64p32
mips64p32le
ppc
s390
s390x
sparc
sparc64
  1. GOOS分类(操作系统)
android
darwin
dragonfly
freebsd
linux
nacl
netbsd
openbsd
plan9
solaris
windows

二、下载和构建

  1. 下载go-mips32源
git clone https://github.com/gomini/go-mips32.git 
  1. 配置GO编译参数
export GOOS=linux
export GOARCH=mips32
  1. 执行编译
#切换目录
cd go-mips32/src
#开始编译(我这里如果不禁用cgo会报错)
CGO_ENABLED=0 ./make.bash
  1. 拷贝编译好的工具链
#先切回到上级目录,不要在src目录操作
cd ..
//创建编译后文件存放文件夹
sudo mkdir /opt/mipsgo
//复制
sudo cp -R * /opt/mipsgo
  1. go工程参数配置
export GOROOT=/opt/mipsgo
export PATH=/opt/mipsgo/bin:$PATH
  1. 测试一下
#go-mips32自带了一个test目录,可以用里面的helloworld.go测试一下
cd test
#编译(请确保调用的go是刚刚编译得到的那个而不是系统本身的go,如果不确定,请用go的完整路径来进行调用)
go build ./helloworld.go
  1. 拷贝到路由器或者设备上运行一下。(如果设备存储空间不够,可以通过去除调试信息,把程序精简到三分之一的体积,请参考我上一篇文章)

三、注意事项

如果构建完一个平台,需要构建另外一个平台的话。要么删掉整个目录,要么创建一个新目录。
我之前构建完mips32le之后,再构建mips32,总是不成功。





http://xzh.i3geek.com

爱唠叨的老鱼

爱唠叨的老鱼

技术经理,个人站长,创业者

0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据