天涼好個秋.

解决GO语言编译程序无法在openwrt上运行的问题

1271 阅 0 评 问题&解决方案

问题

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 ,那解决方法至少有两个:

  1. 将选项启用,并重新编译固件
  2. golang 本身是否有编译选项不依赖于 FPU emulator 。

方法1显然是不现实的,我无法左右官方 ROM 的编译选项。
至于方法2能否实现就要看 golang 是不是支持了。

从 golang 的 wiki 来看是没戏的:
MinimumRequirements

Google 关键字 "MIPS FPU golang",emmmmm~!果然很多人遇到了这个问题,runtime: mips32 soft float point support

从 issue 的回复来看,官方似乎会在接下来的版本支持类似的特性(emmmmm~~也就是说现在是不支持的),但事情还是有转机的,发现有朋友放出了 patch ,go1.8.3-sf-patch

所以接下来的思路很清晰了:

  1. 下载 go 1.8.3 的代码
  2. 打上 issue 提供的 patch
  3. 重新编译 golang
  4. 用新编译出的 golang 编译 frp

解决

最后确实按照上面的思路解决了问题,但编译的过程有些复杂就不在这篇里面写了。上面提供的信息已经足够你自己动手解决问题了。
当然,最后还是要提供编译好 frpc 文件的,见下面链接。

frpc_mipsle_noFPU

虽然解决了问题,但不知道 golang 模拟的 FPU 会不会带来性能问题,特别是 MTK 这种本来就很弱的 CPU。emmmm~慢总比不能用强吧~~!

EOF