声明:
1. 本站文章均是本人原创,是本人学习工作的记录和心得,未经同意不得转载。
2. 本站是非盈利性质,引入Google广告仅仅是为了支付服务器费用和带宽费用。
3. 有技术方面的问题咨询,可以点击网站顶部导航栏的 “联系站长” 联系我。
4. 如果您觉得文章对您很有帮助,欢迎扫描网页底部二维码, 打赏个盒饭钱。



背景

之前的文章介绍了三种交叉编译 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,总是不成功。







补充说明:
1. 本人的文章一般是一个系列连续多篇的,请在文章下方的 “相关文章” 处查看其它文章。
2. 如果在文章下方没有显示,请在网页右手边的侧边栏 “目录 ”查找,或者使用搜索框查找。
3. 有技术方面的问题咨询,可以点击网站顶部导航栏的 “联系站长” 联系我。
4. 如果您觉得文章对您很有帮助,欢迎扫描网页底部二维码, 打赏个盒饭钱。