检测 Linux 下的 32 位进程是否在 64 位环境中运行

Detect if a 32bit process is running in a 64bit environment under Linux

本文关键字:环境 运行 进程 Linux 下的 检测 是否      更新时间:2023-10-16

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

这与在编译时检测体系结构是 32 位还是 64 位的问题不同。

理想情况下,我希望以最便携的方式执行此操作,因此宁愿避免file $(which init) | grep x86-64执行

依赖于

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

检测以长模式运行的 64 位 CPU 似乎也不是一个解决方案,检测内核本身是否是 64 位也不是解决方案,因为操作系统有可能是具有 64 位内核的 32 位用户空间(在某些 Debian 配置中是可能的)。

我主要对检测32和64以外的位数不感兴趣。

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

具有讽刺意味的是,一旦在Windows下很容易解决等效的问题。

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