0%

Golang mips32le(mipsel/ramips) 交叉编译

0x01 缘起

要在斐讯K1/K2上写一些代码操纵流量走向,操作逻辑也比较复杂,为了性能本人一开始是用C的,直接在openwrt官网上就可以下载到全套的SDK,包括GCC,G++等等。然而写了两天,已经泡在bug的海洋里了,还是菜。

为了赶上deadline,不得不换Golang。然而Golang的官方版本是没有针对mipsel架构的,但是Google一下发现Gitbub上存在一个单独的Go项目可以针对mipsel进行交叉编译。

tip:据说Golang的速度仅次于C++,本人没有实际测过。

0x02 环境

本次配置要感谢Go语言中文网jacle169的这篇文章

为了赶deadline,很多坑都没有细看怎么回事,直接跳过了。比如:

  1. 需要用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,同样的架构,但是出现了编译不通过的问题

  2. 环境变量的配置也比较恶心,按照上述文章的配置,编译看似通过,但是会有一个隐藏的error输出在一堆正常输出中间,不仔细看就略过了。产生的问题就是编译后的bin目录下只有一个gofmt可执行程序,而没有go程序。因此,环境变量的配置如下:

1
2
3
export GOOS=linux 
export GOARCH=mips32le
export CGO_ENABLED=0

重要的是最后一行,应该是嵌入C语言的配置。

0x03 过程

直接摘抄jacle169的过程,但是填了我遇到坑。我配置时候的过程也差不多,除了GO项目放置的位置不一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//下载go-mips32源 
git clone https://github.com/gomini/go-mips32.git
cd go-mips32/src

//配置GO编译参数
export GOOS=linux
export GOARCH=mips32le <== Change to mips32 if mips
export CGO_ENABLED=0

//执行编译
./make.bash
cd ..
//创建编译后文件存放文件夹
sudo mkdir /opt/mipsgo
//复制
sudo cp -R * /opt/mipsgo
//go工程参数配置
export GOROOT=/opt/mipsgo
export PATH=/opt/mipsgo/bin:$PATH

3.编译go程序作为测试
mkdir /opt/slu
cd /opt/slu
vim main.go

main.go — helloworld源码:

1
2
3
4
5
6
7
package main

import "fmt"

func main() {
fmt.Println("hello icoolpy.com")
}

其实配置GO编译参数的三行export可以在终端显式运行,也就是在进行源码编译时:

1
GOOS=linux GOARCH=mips32le CGO_ENABLED=0 ./make.bash

0x04 测试