我的Go工具是否构建在错误的架构上?

huangapple go评论78阅读模式
英文:

Are my Go tools built for the wrong architecture?

问题

我是Go语言的忠实粉丝,现在我正在尝试探索除了x86/amd64之外的其他架构。我为ARM构建了Go,并且它似乎对该目标有很好的支持。所有库都构建成功了,但测试失败了(因为它试图在我的amd64系统上运行ARM测试二进制文件)。

最终,我在我的$GOBIN文件夹中有5g/5l,它们可以生成有效且可工作的ARM二进制文件。
但是其他Go工具发生了什么情况:

5a:        ELF 64-bit LSB可执行文件,x86-64,版本1(SYSV),动态链接(使用共享库),适用于GNU/Linux 2.6.9,未剥离
5c:        ELF 64-bit LSB可执行文件,x86-64,版本1(SYSV),动态链接(使用共享库),适用于GNU/Linux 2.6.9,未剥离
5g:        ELF 64-bit LSB可执行文件,x86-64,版本1(SYSV),动态链接(使用共享库),适用于GNU/Linux 2.6.9,未剥离
5l:        ELF 64-bit LSB可执行文件,x86-64,版本1(SYSV),动态链接(使用共享库),适用于GNU/Linux 2.6.9,未剥离
6cov:      ELF 64-bit LSB可执行文件,x86-64,版本1(SYSV),动态链接(使用共享库),适用于GNU/Linux 2.6.9,未剥离
6nm:       ELF 64-bit LSB可执行文件,x86-64,版本1(SYSV),动态链接(使用共享库),适用于GNU/Linux 2.6.9,未剥离
6prof:     ELF 64-bit LSB可执行文件,x86-64,版本1(SYSV),动态链接(使用共享库),适用于GNU/Linux 2.6.9,未剥离
cgo:       ELF 32-bit LSB可执行文件,ARM,版本1(SYSV),静态链接,未剥离
ebnflint:  ELF 32-bit LSB可执行文件,ARM,版本1(SYSV),静态链接,未剥离
godefs:    ELF 64-bit LSB可执行文件,x86-64,版本1(SYSV),动态链接(使用共享库),适用于GNU/Linux 2.6.9,未剥离
godoc:     ELF 32-bit LSB可执行文件,ARM,版本1(SYSV),静态链接,未剥离
gofix:     ELF 32-bit LSB可执行文件,ARM,版本1(SYSV),静态链接,未剥离
gofmt:     ELF 32-bit LSB可执行文件,ARM,版本1(SYSV),静态链接,未剥离
goinstall: ELF 32-bit LSB可执行文件,ARM,版本1(SYSV),静态链接,未剥离
gomake:    POSIX shell脚本,ASCII文本可执行文件
gopack:    ELF 64-bit LSB可执行文件,x86-64,版本1(SYSV),动态链接(使用共享库),适用于GNU/Linux 2.6.9,未剥离
gopprof:   一个Perl脚本,ASCII文本可执行文件
gotest:    ELF 32-bit LSB可执行文件,ARM,版本1(SYSV),静态链接,未剥离
gotry:     一个bash脚本,ASCII文本可执行文件
gotype:    ELF 32-bit LSB可执行文件,ARM,版本1(SYSV),静态链接,未剥离
govet:     ELF 32-bit LSB可执行文件,ARM,版本1(SYSV),静态链接,未剥离
goyacc:    ELF 32-bit LSB可执行文件,ARM,版本1(SYSV),静态链接,未剥离
hgpatch:   ELF 32-bit LSB可执行文件,ARM,版本1(SYSV),静态链接,未剥离

看到了吗?cgo是一个ARM二进制文件,gofixgofmt也是ARM二进制文件。我以为如果我提供$GOHOSTOS/$GOHOSTARCH变量,我将可以交叉编译我的应用程序?如何让cgo适用于ARM目标?

英文:

I'm a big fan of Go language, and now I am trying to explore other architectures than x86/amd64. I build Go for ARM, and it seems to have good support for that target. All libraries build successfully, and tests fail (because it's trying to run ARM test binaries on my amd64 system).

After all, I have 5g/5l in my $GOBIN folder and they produce valid and working ARM binaries.
But what's happening to other Go tools:

5a:        ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
5c:        ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
5g:        ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
5l:        ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
6cov:      ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
6nm:       ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
6prof:     ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
cgo:       ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
ebnflint:  ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
godefs:    ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
godoc:     ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
gofix:     ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
gofmt:     ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
goinstall: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
gomake:    POSIX shell script, ASCII text executable
gopack:    ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
gopprof:   a perl script, ASCII text executable
gotest:    ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
gotry:     a bash script, ASCII text executable
gotype:    ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
govet:     ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
goyacc:    ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
hgpatch:   ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped

See? cgo is an ARM binary, gofix and gofmt are ARM binaries as well. I thought it's expected that if I provide $GOHOSTOS/$GOHOSTARCH variables I will cross-compile my apps? How to get cgo work for ARM target?

答案1

得分: 2

Go的linux/arm端口是不完整的。例如,linux/armcgo运行时是未实现的。请参阅$GOROOT/src/pkg/runtime/cgo/gcc_arm.S$GOROOT/src/pkg/runtime/cgo/gcc_linux_arm.c

> [在arm上的cgo] 这不是Go 1的计划中。

英文:

The Go linux/arm port is incomplete. For example, the cgo runtime for linux/arm is unimplemented. See $GOROOT/src/pkg/runtime/cgo/gcc_arm.S and $GOROOT/src/pkg/runtime/cgo/gcc_linux_arm.c.

> [cgo on arm.] It is not planned for Go 1.

huangapple
  • 本文由 发表于 2012年1月12日 01:15:12
  • 转载请务必保留本文链接:https://go.coder-hub.com/8823605.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定