如何确定Linux二进制文件是32位还是64位?


24

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,未剥离

Answers:


29

标题中问题的答案就在输出的开头:

ELF 64位 LSB可执行文件,x86-64

ELF是可执行和可链接格式,这是Linux最常用的二进制可执行文件格式。

x86-64是二进制的体系结构,即最初由AMD引入的x86指令集64位版本。由于超出我的原因,Microsoft将其称为“ x64”,但这是同一回事。

如果您需要了解内核本身的体系结构,可以使用uname -mpi。例如,在我的系统上,将输出:

x86_64未知未知

这意味着我正在运行x86-64内核。

如果您对CPU本身感兴趣,请查看/proc/cpuinfo有关Linux内核检测到的CPU的详细信息。

一个32位80x86可执行文件由以下代码标识file

用于GNU / Linux 2.6.8的ELF 32位 LSB可执行文件,英特尔80386版本1(SYSV),动态链接(使用共享库),已剥离

告诉我们它是使用Intel 80386指令集(可能带有扩展名)的32位可执行文件。

请注意,它并不像32位和64位体系结构那么简单。例如,Linux内核支持 32位架构,例如Intel 80386,AVR32S / 390Unicore32。在64位方面,Linux可用于PA-RISC,x86-64,ItaniumAlpha等。并非所有发行版都为所有架构提供二进制文件,但是(我怀疑是否有任何发行版均等地针对所有受支持的CPU架构)。因此,如果您想知道给定的二进制文件是否可以在给定的系统上执行,则需要考虑体系结构,而不是CPU的本机字长。


1
“超出我的理由”。我仍然记得那天我发现x64是64位而x86是32位。
Paul Draper 2014年

1
@PaulDraper术语“ x86”具有明显的词源。它的历史可以追溯到Intel的80x86系列CPU,使其与8008或8080的前代产品区别开来,如今,这些日子最常指的是具有32位(IA-32指令集)功能的变体(80386、80486,Pentium和更高版本) )。这些较新的型号通常通过在开头省略“ 80”来缩写,因此(暗示的32位)x86与386、486等匹配。但是,我不知道任何型号为的64位CPU。以“ 64”结尾的类似结构;当然,AMD和英特尔今天都没有使用这种命名方案。
CVn

尽管x64 一个非常常见的术语。随机示例:microsoft.com/en-us/download/details.aspx?id = 42482
Paul Draper

@PaulDraper 现在在Microsoft世界中很常见,但是其词源仍然不清楚,对于“ x86”而言,尚不清楚。
CVn

微软在安装程序
中将

7

Linux二进制可执行文件(ELF格式,请参阅Wikipedia)的第5个字节是32位可执行文件的1个字节,64位可执行文件的2个字节。

要在名为“ foo”的程序中看到此信息,请在命令行中键入

od -t x1 -t c foo | head -n 2

2

如果您想避开“头”管,可以这样做

od -An -t x1 -j 4 -N 1 foo

如果foo是32位二进制文​​件,它将打印01;如果是64,它将打印02。它可能仍然包含一些前导空格-值得一提的是,您是否要对结果进行任何自动比较。

如果发现它在未安装“文件”的基本Ubuntu Docker容器中很有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.