【问题标题】:Detect if a 32bit process is running in a 64bit environment under LinuxLinux下检测32位进程是否在64位环境下运行
【发布时间】: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


【解决方案1】:

您可以测试/lib64/ld-linux-x86-64.so.2 的存在。从理论上讲,这并不总是有效,因为 Linux 系统可以将动态链接器放在其他地方,但是这个特定的路径是迄今为止最常见的,而且动态链接器的路径被硬编码到 ELF 二进制文件中,所以这适用于至少实际上与您的软件捆绑了一个 64 位库(只要有匹配的 libc,无论如何)。

【讨论】:

  • 这是真的! /lib64/ld-linux-x86-64.so.2 确实被硬编码到 64 位 ELF 中,我没有意识到这一点。我认为将其与从内核获取 uname 信息相结合以避免任何误报风险对我来说将是最强大的解决方案。
猜你喜欢
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多