0x01 缘起
要在斐讯K1/K2上写一些代码操纵流量走向,操作逻辑也比较复杂,为了性能本人一开始是用C的,直接在openwrt官网上就可以下载到全套的SDK,包括GCC,G++等等。然而写了两天,已经泡在bug的海洋里了,还是菜。
为了赶上deadline,不得不换Golang。然而Golang的官方版本是没有针对mipsel架构的,但是Google一下发现Gitbub上存在一个单独的Go项目可以针对mipsel进行交叉编译。
tip:据说Golang的速度仅次于C++,本人没有实际测过。
0x02 环境
本次配置要感谢Go语言中文网jacle169的这篇文章
为了赶deadline,很多坑都没有细看怎么回事,直接跳过了。比如:
需要用Ubuntu,我用的是
Linux ubuntu 4.10.0-28-generic #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:48 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
,第一次尝试用Kali Linux,同样的架构,但是出现了编译不通过的问题环境变量的配置也比较恶心,按照上述文章的配置,编译看似通过,但是会有一个隐藏的error输出在一堆正常输出中间,不仔细看就略过了。产生的问题就是编译后的bin目录下只有一个gofmt可执行程序,而没有go程序。因此,环境变量的配置如下:
1 | export GOOS=linux |
重要的是最后一行,应该是嵌入C语言的配置。
0x03 过程
直接摘抄jacle169的过程,但是填了我遇到坑。我配置时候的过程也差不多,除了GO项目放置的位置不一样。
1 | //下载go-mips32源 |
main.go — helloworld源码:
1 | package main |
其实配置GO编译参数的三行export可以在终端显式运行,也就是在进行源码编译时:
1 | GOOS=linux GOARCH=mips32le CGO_ENABLED=0 ./make.bash |