【发布时间】:2018-10-02 21:09:36
【问题描述】:
我们目前正在为包括 Solaris 64 位在内的多个平台构建 Go 可执行文件。我们也要求提供 32 位 Solaris 可执行版本,但我无法让它工作(安装 Solaris 64 位交叉编译器的人已经离开并且无法访问)。
我尝试使用我们现有的 Solaris 交叉编译在 go build 上设置 -m32 标志,但这不起作用,所以我正在尝试构建一个 Solaris 32 位特定的交叉编译器。
我用谷歌搜索了一些模糊的例子,所以我遵循这个过程:
- 将头文件和库从 32 位 Solaris 机器复制到我的 Linux 构建机器。
- D/L 和构建 binutils 和 gcc 将 SYSROOT 指向下载的 32 位 Solaris 头文件和库,其中:
$TARGET=sparc-sun-solaris2.10
$SYSROOT=/path/to/solaris32/includes
$PREFIX=/path/to/gcc-output
binutils-2.31/configure -target=$TARGET --prefix=$PREFIX -with-sysroot=$SYSROOT -v
gcc-8.2.0/configure --target=$TARGET --with-gnu-as --with-gnu-ld --prefix=$PREFIX -with-sysroot=$SYSROOT --disable-libgcj --enable-languages=c,c++,go -v
- 创建指向 gogcc 的符号链接并将 GCC 放在路径上
-
像这样编译一个简单的测试 go 程序:
go build --compiler gccgo --gccgoflags "-m32 -O3 -static-libgo -Wl,-dy -lnsl -lsocket -lrt -lsendfile" -o ${GOTOOLS}/${BINARIES}/${PROJECT_NAME}/test/solaris_sparc32 test/main.go
失败如下:
go build:使用 gccgo 工具链时,请使用 -gccgoflags 传递编译器标志,而不是 -gcflags
命令行参数
gccgo:错误:不能同时使用 -m32 和 -m64
显然我不知道自己在做什么。谁能指出我正确的方向?
【问题讨论】:
-
鉴于您收到
gccgo: error: may not use both -m32 and -m64的错误消息,我怀疑您仍然以某种方式从某处获得-m64作为命令行参数。 -
似乎
go build命令包含-m64标志,因为go 仅支持Solaris 上的该架构。 -
@maerics 考虑到这一点,我想知道这个客户请求背后的为什么。鉴于发布的目标必须是 64 位 - Solaris 10 SPARC - 请求的原因可能是,嗯,有趣。如果
-m64来自某个地方的go build命令,那么试图覆盖它真的会陷入不受支持的黑客攻击。如果强制并且源代码是干净且可移植的,它应该可以工作——考虑到支持的平台过多——很有可能——但仍有可能出现重大错误。我不想因为支持这一点而陷入困境。 -
@AndrewHenle heh,有趣确实=P
标签: go gcc cross-compiling solaris