检测 Linux 下的 32 位进程是否在 64 位环境中运行
Detect if a 32bit process is running in a 64bit environment under Linux
我正在分发一个软件的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, 反正)。
相关文章:
- 在编译时为运行时设置环境变量
- 在运行时环境中使用 C++ w/ Lua
- 选择特定版本的 Visual Studio 命令行工具包,并根据特定版本的C++运行时环境编译文件
- Visual Studio代码运行环境
- 什么是运行英特尔线程构建模块的 XCode 8 环境变量
- 在运行时将更改的环境变量应用于 QApplication
- C++ - 我需要一个宏或环境变量来检测我何时在 Windows 上运行 bazel
- 在 Visual Studio 2017 C++项目中设置调试/运行环境变量
- CImg.h 无法在 Xcode 环境中运行
- 如何使用C JNI环境运行Springboot应用程序
- Java 运行时环境检测到致命错误:Java 中的 OpenCV 椭圆检测
- 是否可以在Windows 8环境上在Visual Studio 2005上运行VC ,Win32应用程序
- 为特定过程的特定运行设置环境变量
- 如果可执行文件在两个或多个节点上运行,为什么它不能看到环境变量?
- 如何改进此代码以便在多线程环境下运行
- 在 Linux 环境中运行内联汇编(使用 GCC/G++)
- QSerialPort 在开发环境之外运行时崩溃
- 创建一个可以在 Windows 环境中的现有生成文件项目上运行的 clang 工具
- 在没有 cygwin 环境的 Windows 中运行 cygwin 构建的 exe
- 检测 Linux 下的 32 位进程是否在 64 位环境中运行