c++ - Linux下检测64位环境下是否运行32位进程

标签 c++ c linux 64-bit 32bit-64bit

我正在分发一个软件的 32 位版本。我想在运行时检测它运行的用户区是否是 64 位,并且能够运行 64 位可执行二进制文件(ELF 64 位 x86-64)。

这与在编译时检测架构是 32 位还是 64 位不是同一个问题。

理想情况下,我希望尽可能以最便携的方式执行此操作,因此我宁愿避免执行类似 file $(which init) | 这样的操作。 grep x86-64 这取决于

我也不认为读取 cpuid 是一种解决方案——让 32 位操作系统在 64 位 CPU 上运行是可能的。

检测以长模式运行的 64 位 cpu 似乎也不是解决方案,检测内核本身是否为 64 位也不是解决方案,因为操作系统有可能是具有 64 位内核的 32 位用户空间(因为是可能与 some Debian configurations )。

除了 32 和 64 之外,我主要对检测位数不感兴趣。

我能想到的一个可能的稳健解决方案是实际包含并尝试调用 64 位 ELF 二进制文件并查看它是否运行,但这并不是一种非常有效的方法。 STL 或 boost 中是否有 linux 函数或其他东西可以帮助我可靠地找到答案?

具有讽刺意味的是,一次等价的问题是very easy to solve under Windows .

最佳答案

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

关于c++ - Linux下检测64位环境下是否运行32位进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26950303/

相关文章:

c++ - 在函数周围调用std::thread()的工作方式不同

c++ - 刷新文件读取缓存

c++ - C++如何绘制复杂的用户控件?

c - 崩溃后恢复与服务器的连接

linux - curl : (3) URL using bad/illegal format

linux - 通过syslog-ng转发日志

c++ - 为什么必须键入 getline(cin, string) 两次?

c - 在 C 中遍历数组

c - 如何找出0到9之间每隔一个奇数

linux - 错误 (104) : Connection reset by peer - Linux RHEL, Apache HTTP 服务器和 IIS 服务器