【发布时间】:2015-01-13 01:02:33
【问题描述】:
我正在分发 32 位版本的软件。我想在运行时检测它运行的用户空间是否为 64 位,并且能够运行 64 位可执行二进制文件(ELF 64 位 x86-64)。
这与在编译时检测架构是 32 位还是 64 位不同。
理想情况下,我希望以最便携的方式执行此操作,因此更愿意避免做依赖于
的file $(which init) | grep x86-64 之类的事情
我也不认为读取 cpuid 是一种解决方案 - 可以在 64 位 CPU 上运行 32 位操作系统。
检测以长模式运行的 64 位 cpu 似乎也不是解决方案,检测内核本身是否为 64 位也不是解决方案,因为操作系统可能是具有 64 位内核的 32 位用户空间(因为可以使用some Debian configurations)。
我主要对检测除 32 和 64 以外的位数感兴趣。
我能想到的一个可能的可靠解决方案是实际包含并尝试调用 64 位 ELF 二进制文件并查看它是否运行,但这并不是一种非常有效的方法。 stl 或 boost 中是否有 linux 功能或其他东西可以帮助我可靠地找出答案?
具有讽刺意味的是,有一次等价的问题是very easy to solve under Windows。
【问题讨论】:
-
为什么?
file $(which init) | grep x86-64的想法可能没有那么疯狂。当然你会在 ARM64 上遇到问题,但是现在谁在运行 ARM64? -
@MSalters 在我的系统上,init 在
/sbin/init中,而/sbin不在$PATH中,除非您是root用户。 -
@MSalters
file $(which init)的想法取决于路径中是否有可用的 init,这代表了系统的能力。对于非特权用户,情况可能并非如此。 @mafso:是的,uname 解决方案会告诉您内核是什么,但对于 32 位用户空间和 64 位内核,如问题中所述,这可能是一个问题。 -
你可以使用
uname... -
@Gophyr:它告诉您有关内核的信息,但没有解决问题中提到的 64 位内核以 32 位用户空间运行的情况,或者 64 位用户空间正在运行的情况使用 32 位内核。
标签: c++ c linux 64-bit 32bit-64bit