Go 语言跨平台路由器编译

Netgear R6300 v2 (Arm EABI5 DDWRT)

首先通过查看 /proc/cpuinfo 确定 Netgear R6300 v2 是 ARM 系的 CPU,然后下载一个路由器上的可执行文件,进行file查看,可以看到,是 EABI5 编译的:

============= /proc/cpuinfo =============
model name	: ARMv7 Processor rev 0 (v7l)
processor	: 0
BogoMIPS	: 1594.16
Features	: half fastmult edsp tls 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x3
CPU part	: 0xc09
CPU revision	: 0

model name	: ARMv7 Processor rev 0 (v7l)
processor	: 1
BogoMIPS	: 1594.16
Features	: half fastmult edsp tls 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x3
CPU part	: 0xc09
CPU revision	: 0

Hardware	: Northstar Prototype
Revision	: 0000
Serial		: 0000000000000000
============= /proc/cpuinfo =============

============= file /bin/sh  =============
./sh: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-arm.so.1, corrupted section header size
============= file /bin/sh  =============

由上,我们可以确定编译参数为:

export GOOS=linux
export GOARCH=arm
export GOARM=5

Xiaomi MT7620 (MIPSle Openwrt)

确定的方法同上,这里贴出来执行结果:

============= /proc/cpuinfo =============
system type		: MT7620
machine			: Unknown
processor		: 0
cpu model		: MIPS 24KEc V5.0
BogoMIPS		: 385.02
CPUClock		: 580
FlashSize		: 8192
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
shadow register sets	: 1
kscratch registers	: 0
core			: 0
VCED exceptions		: not available
VCEI exceptions		: not available
============= /proc/cpuinfo =============

============= file /bin/sh  =============
./sh: ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1, dynamically linked, interpreter /lib/ld-uClibc.so.0, corrupted section header size
============= file /bin/sh  =============

由于MIPS系CPU有大小端区别,这里我们可以看到上面红色部分为LSB,即小端CPU,由此,我们确定出编译参数为:

export GOOS=linux
export GOARCH=mipsle

 

Netgear WNDR3800 (MIPS Openwrt)

 

============= /proc/cpuinfo =============
system type		: Atheros AR7161 rev 2
machine			: NETGEAR WNDR3700/WNDR3800/WNDRMAC
processor		: 0
cpu model		: MIPS 24Kc V7.4
BogoMIPS		: 452.19
wait instruction	: yes
microsecond timers	: yes
tlb_entries		: 16
extra interrupt vector	: yes
hardware watchpoint	: yes, count: 4, address/irw mask: [0x0ffc, 0x0ffc, 0x0ffb, 0x0ffb]
isa			: mips1 mips2 mips32r1 mips32r2
ASEs implemented	: mips16
shadow register sets	: 1
kscratch registers	: 0
package			: 0
core			: 0
VCED exceptions		: not available
VCEI exceptions		: not available
============= /proc/cpuinfo =============

============= file /bin/sh  =============
./sh: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-mips-sf.so.1, stripped
============= file /bin/sh  =============

 

这里我们可以看到上面红色部分为MSB,即大端CPU,由此,我们确定出编译参数为:

export GOOS=linux
export GOARCH=mips

但是这时间编译完成并上传很有可能出现如下错误

root@OpenWrt:~# ./hello
Illegal instruction

这是因为 AR7161 CPU并没有默认支持浮点数运算,所以这里有两种方案

重新编译内核并加入浮点数运算模拟器

这种办法的优点是效率较高,而且不折腾,本人便是采用这种办法

下载 Openwrt 源码,并执行 make kernel_menuconfig 然后选择其中的 Kernel Type 勾选上 MIPS FPU Emulator 即可,如下图所示:

然后重新刷入新系统即可

采用 gomini 的 go-mips32 进行编译

源码开源地址在此,编译方式参考 https://github.com/xtaci/kcptun/issues/79,由于本人并没有采用这种办法,所以不在此赘述

 

小贴士:使用 build 参数 -ldflags “-s -w” 可以减少约 0.5M 体积哦~

您可能还喜欢...

5 条回复

  1. 2233说道:

    我想知道文章中提到
    “首先通过查看 /proc/cpuinfo 确定 Netgear R6300 v2 是 ARM 系的 CPU,然后下载一个路由器上的可执行文件,进行file查看,可以看到,是 EABI5 编译的”
    这里的 “下载一个路由器上的可执行文件,进行file查看” 能具体解释下!如果是工具能提供下吗? 如果是命令能具体给出?

  2. ARM说道:

    刚开始学go,大神到用到这地步了,赞~

  3. 光头舒说道:

    牛逼,我的宝藏马

  1. 2018年6月20日

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

发表回复

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

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