按照How to successfully build packages for WD My Cloud from source中的介绍,搭建完成WDMyCloud
的编译环境
整个 WD MyCloud
的编译项目,可以直接在树莓派中进行编译。只是编译4KB
分页(主要用于编译过程)的高版本应用的时候,需要在 raspbian-wheezy
系统中进行编译。
在树莓派中编译 WD MyCloud
代码的时候,由于都是 ARM
环境,因此,不需要 QEMU
的介入,以前由于 QEMU
导致的问题可以规避。
推荐在树莓派4B版本上搭建编译环境,效果来看,速度还是不错的。
这个问题产生的原因是在qemu
中创建线程/进程的时候,要求增加CLONE_SYSVSEM
标志,否则会出现异常。 go
在创建线程/进程的时候,没有指定这个标记。解决方法就是修改src/pkg/runtime/os_linux.c
中的void runtime·newosproc(M *mp, void *stk)
函数,在flag
中增加CLONE_SYSVSEM
标志。
这个问题解决起来比较复杂,我们在x86
下面直接进行交叉编译的时候,是没办法通过编译的,我们可以通过树莓派下进行编译。树莓派使用2015-05-05-raspbian-wheezy
版本的镜像来进行编译。
树莓派这个版本的系统问题在于 wheezy
的源已经被移动地址,因此更新安装软件的时候会报告 404
错误,我们需要手工修改一下源地址。
安装编译依赖
下载并编译代码
完成之后,拷贝到编译环境中并执行安装
继续编译,报告如下错误信息:
这个问题产生的原因是在qemu
中无法处理编号为 64 的信号(Qemu rejects rt_sigaction of SIGRTMAX (64).
),我们需要忽略这个信号。解决方法就是修改src/pkg/runtime/os_linux.c
中的void
函数,忽略这个信号。
runtime·setsig(int32 i, GoSighandler *fn, bool restart)
完成之后,拷贝到编译环境中并执行安装
编译环境安装完成之后,可以成功编译golang-1.3.3
,中途可能会失败,失败之后,重新编译可以通过。
编译 golang-1.4
,由于 golang-1.4
的特殊性,任何高于 golang-1.4
版本的 golang
,都需要 golang-1.4
的编译环境才能开始编译安装!
我们依旧需要在树莓派环境中 raspbian-wheezy
&& WD MyCloud
编译,如下:
完成之后,拷贝到编译环境中并执行安装
我们需要在 golang 1.4.3
环境中继续编译,可以在 golang 1.3.3
中运行:
可以本站下载:
golang_1.3.3-1deb8u2.dsc
golang_1.3.3-1+deb8u2.debian.tar.xz
golang_1.3.3.orig.tar.gz
修改完BUG
之后编译好的 golang_1.3.3-1.deb(4KB分页)/golang_1.4.3-3.deb(4KB分页)用于编译环境使用,不能在WD MyCloud
上使用。
参考链接
- ARM chroot issues: fatal error: rt_sigaction failure
- Side by Side Diff: src/pkg/runtime/os_linux.c
- [release-branch.go1.5] runtime: ignore rt_sigaction error if it is fo…
- runtime: qemu-arm fails to emulate go user programs #13024
- failed to create new OS thread (have 2 already; errno=22) #22
- runtime: cannot run cross compiled ARM binary on QEMU #20763
- golang binaries fail to start under linux-user
- 软件包:golang-go(2:1.3.3-1+deb8u2) [security]
- Debian 软件包源码仓库(可在线浏览)
- How can I learn all the options I can pass to DEB_BUILD_OPTIONS?
- time: TestParseInLocation fail #19457