编译为 x86 时检测 OS x86 或 x64

Posted

技术标签:

【中文标题】编译为 x86 时检测 OS x86 或 x64【英文标题】:Detect OS x86 or x64, when compiled as x86 【发布时间】:2021-05-21 01:39:19 【问题描述】:

我开发了引导软件来开始我的游戏。我用 Go 做到了这一点。跨平台对我来说尤其重要。另外,我不想将下载链接分成两个 x86 / x64。我想在一个输出中处理所有内容。这就是为什么我必须编译到 x86。执行此操作时,我无法正确检测到操作系统是 x86 还是 x64。

在编译为 x86 的软件中,我如何正确检测操作系统 x86 或 x64(在 Go 中)。

此代码在编译为 x86 时不正确。

const is64Bit = uint64(^uintptr(0)) == ^uint64(0)

【问题讨论】:

您可能需要实际询问操作系统,在这种情况下,它当然取决于您使用的操作系统。 我不想要特定操作系统的信息。编译后的程序将是跨平台的,应该可以在所有操作系统上运行。 不同的操作系统使用不同的可执行格式;你不可能拥有一个可以在 GNU/Linux 系统、Mac 或 Windows 上运行的二进制文件。您当然可以使用相同的可移植检测代码在为当前操作系统构建的其他两个可执行文件之间进行选择(例如,一些处理操作系统差异的库),但您应该做好准备,以防万一事实证明这是不可能的。 AFAIK,在 x86 asm there's no way to tell 中(仅通过运行用户空间 asm 指令,没有系统调用)无论您处于 32 位保护模式(在“传统模式”32 位操作系统下) ) 或 32 位兼容模式(64 位操作系统下长模式的子模式:en.wikipedia.org/wiki/X86-64#Operating_modes)。 @PeterCordes 那么我应该通过在网站上放置两个单独的下载链接作为 x64 x32 位来解决这个问题吗?例如,discord 是如何解决这个问题的? Discord 只有一个下载链接。 discord.com/download 【参考方案1】:

在 Windows you can call IsWow64Process 上确定您是否是在 64 位操作系统上运行的 32 位进程。请注意,如果您是在 64 位操作系统上运行的 64 位进程,则返回 false,但如果您正在运行 64 位进程,则您知道操作系统是 64 位,否则它不会运行。

另请注意,32 位 Windows 已过时。 Microsoft is already phasing out support for 32-bit Windows - they no longer want it to be installed on new computers.

在 Linux 上,您可以调用 uname 并查看 machine 字段。 Here's a list of possible values。请注意,它们中的大多数将与您的程序不兼容,只有i386i686x86_64

【讨论】:

以上是关于编译为 x86 时检测 OS x86 或 x64的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 64 位机器上将 Detours.lib 编译为 32 位:LNK1112:模块机器类型“x86”与目标机器类型“x64”冲突

Loadbitmap 在 x86 上编译和运行良好,但在编译为 x64 时无法正常工作

你如何为x64编译静态pthread-win32 lib?

DllImport 自动选择x64或x86 dll

为啥我可以在 Mac OS X 上使用 Cython 编译为 C 但不能编译为 C++

GCC 生成的 ASM 简化了 x86 ASM?如何映射?