如何判断linux二进制文件是32位还是64位?

如何判断linux二进制文件是32位还是64位?

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,AVR32S/390Unicore32. 就 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 容器中很有用。

相关内容