如何交叉编译solaris 32位

Posted

技术标签:

【中文标题】如何交叉编译solaris 32位【英文标题】:How to cross compile solaris 32-bit 【发布时间】: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 【参考方案1】:

根据the list of supported OS/arch targets,似乎不支持 Solaris 32 位:

$GOOS 和 $GOARCH 的有效组合是:

$GOOS     $GOARCH
...
solaris   amd64
...

也就是说,Solaris 64 位被明确列为受支持的平台,但 Solaris 32 位列出。

因此,有充分的理由相信 go 程序将不会在 Solaris 32 位系统上可靠运行,并且您可能不应该同意支持该平台(如果您碰巧得到了交叉编译工作)主要是go团队本身不支持!

【讨论】:

64 位 Solaris 仍然可以运行 32 位可执行文件。事实上,如果不是大多数系统实用程序,例如 mvcp,在 64 位安装中仍然是 32 位。 我的意思是官方的 go 文档明确包括 solaris/64 但不包括 solaris/32。 鉴于 OP 发布的错误消息,尚未达到该点。尽管我承认我无法想出一个理由,因为平台是 Solaris 10,甚至需要 32 位 Solaris 构建。Solaris 10 始终支持 64 位,而现在仍然存在的 32 位硬件是几乎闻所未闻。 我刚刚注意到目标是 SPARC。我几乎可以肯定 Solaris 10 甚至无法在 32 位 SPARC CPU 上运行。 正确,Solaris 10 仅包含用于 SPARC 的 64 位内核,而不是 32 位。 (Solaris 10 仍然包含适用于 x86 的 32 位内核以及当时新的 64 位 x86 内核,Solaris 11 也放弃了 32 位 x86 内核而仅支持 64 位。)

以上是关于如何交叉编译solaris 32位的主要内容,如果未能解决你的问题,请参考以下文章

如何使用交叉编译的构建调试 Qt dll 问题?

64位的ubuntu14.04 LTS安装 Linux交叉编译工具链及32位“ia32-libs”依赖库

linux 下安装arm-linux-gnueabi交叉编译器

arm各种交叉编译工具的区别

嵌入式ARM linux操作系统中如何构建交叉开发环境?

windows eclipse c++怎么交叉编译linux