Debian:x86-64 二进制文件使用什么指令?

try*_*lly 7 64bit debian x86 cpu-architecture

我想知道二进制文件是否使用(编译用于)特殊指令集,如 SSE 4.1/4.2、AVX、F16C。如何确定包中的二进制文件是否使用某些指令集?

我知道我可以configure在手动编译软件包时使用开关启用此类指令,但是当使用来自 Debian 存储库的预编译软件包时,必须有一个默认值。

可能二进制文件没有用太具体的指令集编译,因为它们不能在任何系统上使用,或者,根据二进制文件,它们是用替代子程序编译的,这些子程序用基本指令“模拟”处理,以支持缺乏此类功能的 CPU。

我知道我可以查看rulesDebian 源包的文件,但我很感兴趣,如果有更简单的方法可以做到这一点。

  • x86-64 二进制文件使用的 CPU 指令是否非常有限?
  • 包是否可以使用非常具体的指令集,它们是否可以使用更原始的指令进行回退?

Ste*_*itt 6

为了一般地回答你的问题,https://superuser.com/questions/726395/how-to-check-if-a-binary-requires-sse4-or-avx-on-linux给出了一个脚本,可以提供一个反汇编二进制( 的输出objdump)并将尝试找出所需的最小指令集。这种技术必然是近似的,因为根据可用的指令集,给定的二进制文件可能具有不同的执行路径,而这样的二进制文件似乎需要它支持的“最佳”指令集,即使它实际上可以在没有它的情况下运行。

特别是关于 Debian 软件包,任何为amd64(64 位“PC”指令集)打包的东西都必须能够在任何 AMD64 或 x86-64 兼容的 CPU 上运行;这意味着它可以使用完整的标准 64 位指令集,其中包括 SSE2,但如果它为不支持它们的 CPU 提供回退,它只能使用其他功能(包括您列出的那些)。也有例外,但包应在包描述中指明(例如参见rr)。

Linux 内核本身可以使其功能适应它发现自己运行的 CPU 的功能。如果它是为 x86-64 编译的,则假定它可以使用 TSC、CMPXCHG64、CMOV(X86_64在该链接上查找任何依赖项)。但是可以编译它以在运行时检查 AES-NI、AVX、AVX2 等功能是否可用,并特别使用它们来加速加密计算。这可能使使用这些功能的任何程序受益(但以上下文切换到内核为代价)。

在某些情况下,动态链接器还可以帮助根据 CPU 提供替代方案:因此libc6-i686i386体系结构提供了一组库,这些库将自动使用,而不是与i686指令集兼容(并支持 CMOV)的CPU 上的准系统等效项。