解决GO语言编译程序无法在openwrt上运行的问题
问题
Aria2Gee 插件靠 frp 进行内网穿透,但一直以来都存在一个诡异的问题:个别机型上 frpc 无法运行,具体表现是运行之后进程就被阻塞住无响应。
转机
由于 frpc 不是我自己编译的,所以这个问题一直都没解决。直到最近,在极路由插件开发群,一位朋友用 go 写了 hello world 程序,放在极路由上运行时遇到相同的问题。经过排查他发现是内核未开启 FPU(floating point unit) emulator 选项。
于是我也去验证了下 frpc 无法运行是否也是同样的原因。手动运行 frpc 然后 log 如下:
Nov 15 18:57:59 Hiwifi kern.info
kernel: [ 2031.780000] FPU emulator disabled,
make sure your toolchainwas compiled with software floating point support (soft-float)
emmmm~~!确实是这个问题(感觉 debug 时的程序员都像柯南)
思路
既然提示未开启 FPU emulator ,那解决方法至少有两个:
- 将选项启用,并重新编译固件
- golang 本身是否有编译选项不依赖于 FPU emulator 。
方法1显然是不现实的,我无法左右官方 ROM 的编译选项。
至于方法2能否实现就要看 golang 是不是支持了。
从 golang 的 wiki 来看是没戏的:
Google 关键字 "MIPS FPU golang",emmmmm~!果然很多人遇到了这个问题,runtime: mips32 soft float point support
从 issue 的回复来看,官方似乎会在接下来的版本支持类似的特性(emmmmm~~也就是说现在是不支持的),但事情还是有转机的,发现有朋友放出了 patch ,go1.8.3-sf-patch
所以接下来的思路很清晰了:
- 下载 go 1.8.3 的代码
- 打上 issue 提供的 patch
- 重新编译 golang
- 用新编译出的 golang 编译 frp
解决
最后确实按照上面的思路解决了问题,但编译的过程有些复杂就不在这篇里面写了。上面提供的信息已经足够你自己动手解决问题了。
当然,最后还是要提供编译好 frpc 文件的,见下面链接。
后
虽然解决了问题,但不知道 golang 模拟的 FPU 会不会带来性能问题,特别是 MTK 这种本来就很弱的 CPU。emmmm~慢总比不能用强吧~~!
评论框君很顽皮,需要科学上网才能看到哦!~
关注微信公众号(MarIxs)也能联系到我哦!