【问题标题】:How do I determine whether the program was built as 32 bit or 64 bit in Go?如何确定程序是在 Go 中构建为 32 位还是 64 位?
【发布时间】:2016-07-01 16:12:52
【问题描述】:

我能得到的最接近的是runtime.GOARCH,但这也可能是arm,它可以是32位或64位。


我只关心这个程序是如何构建的,而不关心操作系统是否也支持 64 位可执行文件。例如对于 AArch64 CPU 上的 ARM 模式或 x86-64 CPU 上的 32 位兼容模式,我仍然想要 32,因为这是程序运行的模式。

相关:Detect OS x86 or x64, when compiled as x86 in GO 是关于检测操作系统支持的内容,例如因为可能运行不同编译的可执行文件。

【问题讨论】:

  • runtime.GOARCH 将为您提供程序编译运行的架构。要获得实际系统的架构细节,您可能最终不得不检查runtime.GOOS,并执行特定于平台的系统调用。
  • 这个问题最初看起来像是关于检测操作系统的,但包括接受的答案在内的答案都是关于检测编译器目标位数。我对其进行了编辑以使问题与答案相匹配,因为这也是一个潜在有用的东西。这就是为什么有关于此检测与操作系统不匹配的 cmets。

标签: go 32bit-64bit


【解决方案1】:

将 GOARCH 用于 arm:arm (ARM) 和 arm64 (AArch64),

Optional environment variables

$GOOS 和 $GOARCH

目标操作系统的名称和编译架构。 这些默认值分别为 $GOHOSTOS 和 $GOHOSTARCH (如下所述)。

$GOOS 的选择是

$GOOS     $GOARCH
darwin    386
darwin    amd64
darwin    arm
darwin    arm64
dragonfly     amd64
freebsd   386
freebsd   amd64
freebsd   arm
linux     386
linux     amd64
linux     arm
linux     arm64
linux     ppc64
linux     ppc64le
linux     mips64
linux     mips64le
netbsd    386
netbsd    amd64
netbsd    arm
openbsd   386
openbsd   amd64
openbsd   arm
plan9     386
plan9     amd64
solaris   amd64
windows   386
windows   amd64

【讨论】:

  • IIUC, runtime.GOARCH 将返回正在执行的已构建 程序 的体系结构。由于某些架构,即 Intel/AMD 的 64 位 ISA,允许在 64 位内核上运行 32 位程序,所以如果 OP 真的想知道当前执行其 Go 程序的操作系统的体系结构,那么计算这个的方法out 应该是不同的(而且,恐怕是特定于平台的)。
【解决方案2】:
const is64Bit = uint64(^uintptr(0)) == ^uint64(0)

这是有效的,因为如果 uintptr 是 32 位,^uintptr(0) 将是 0xffffffff 而不是 0xffffffffffffffff

^uint64(0) 将始终为 0xffffffffffffffff,无论是 32 位还是 64 位架构。

【讨论】:

  • uintptr 在 32 位代码中是否总是 32 位,即使在 64 位操作系统下运行? (例如,x86-64 长模式内核下的 i386 代码或 AArch64 内核下的 ARM32 代码是主要的实际用例。例如,您想知道可以运行另一个可执行文件的哪个版本。)
  • 但显然这就是这个问题真正想要的,给出公认的答案。所以我会重新命名这个问题。
  • 请注意,即使对于 64 位模式下的 ILP32 ABI,这也会报告非 64 位。因此,这有助于确定指针是否为 64 位,但不适用于确定 64 位整数是否可以完全有效地完成。 (例如 AArch64 ILP32 在 64 位模式下使用 32 位指针来节省空间,与 x86-64 上的 Linux x32 相同)
  • 嗯,很有趣。那么也许第二次测试uint64(^uint(0)) == ^uint64(0) 会给出更全面的情况。
  • 我不希望 uint 是 64 位的,如果 Go 像 C 编译器一样选择 unsigned int 的大小。我希望像 x32 这样的 ILP32 ABI 也将具有 32 位 uint
猜你喜欢
  • 2011-04-16
  • 2011-04-04
  • 2017-08-01
  • 2011-04-19
  • 2010-10-23
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多