32 位内核 (x86) 只能运行 32 位代码。64 位内核 (x86_64) 可以运行 32 位和 64 位代码。
我想知道一台机器是否可以运行可执行文件:换句话说,我有一个二进制文件,我必须在 32 位 Ubuntu 上运行它,但我不知道该二进制文件是否是 32 位可执行文件。
我使用了file
命令,指定要检查的可执行文件,这是返回的结果:
ELF 64 位 LSB 可执行文件,x86-64,版本 1 (SYSV),动态链接(使用共享库),适用于 GNU/Linux 2.6.24,BuildID[sha1]=0x7329fa71323a6cd64823c2594338682065cd6e07,未剥离
答案1
标题中问题的答案就在输出的开头:
极低频64 位LSB 可执行文件,x86-64
ELF 是可执行和可链接格式,Linux最常用的二进制可执行文件格式。
x86-64 是二进制的体系结构,64 位版本的 x86 指令集最初引入由 AMD 提供。由于我无法理解的原因,微软将其称为“x64”,但这是同一件事。
如果你需要了解内核本身的体系结构,可以使用uname -mpi
。例如,在我的系统上,它会打印:
x86_64 未知 未知
这意味着我正在运行 x86-64 内核。
如果您对 CPU 本身感兴趣,请查看/proc/cpuinfo
有关 Linux 内核检测到的 CPU 的详细信息。
32 位 80x86 可执行文件标识为file
,例如:
极低频32 位LSB 可执行文件,英特尔80386,版本 1 (SYSV),动态链接(使用共享库),适用于 GNU/Linux 2.6.8,已剥离
这告诉我们它是一个使用 Intel 80386 指令集(可能带有扩展)的 32 位可执行文件。
请注意,这并不像 32 位架构与 64 位架构那么简单。例如,Linux 内核支持32 位架构,如 Intel 80386,AVR32,S/390和Unicore32. 就 64 位而言,Linux 可用于RISC,x86-64,安腾和Α等等。然而,并非所有发行版都为所有体系结构提供二进制文件(我怀疑是否有任何发行版针对全部支持的 CPU 架构)。因此,如果您想知道给定的二进制文件是否可以在给定的系统上执行,则需要考虑建筑学,而不是 CPU 的本机字大小。
答案2
Linux 二进制可执行文件的第 5 个字节 (ELF 格式,参见 Wikipedia) 为 1 表示 32 位可执行文件,为 2 表示 64 位可执行文件。
要查看名为“foo”的程序,请在命令行中输入
od -t x1 -t c foo | head -n 2
答案3
如果你想避免使用 'head' 管道,你可以这样做
od -An -t x1 -j 4 -N 1 foo
如果 foo 是 32 位二进制,则打印 01;如果是 64 位二进制,则打印 02。它可能仍包含一些前导空格 - 如果您对结果进行任何自动比较,则值得了解。
如果发现这在未安装“文件”的基本 Ubuntu Docker 容器中很有用。