我有一堆为SSE4
(流式 SIMD 扩展 4)指令集。我想在不支持该指令集的处理器上运行它们。当我尝试运行这些二进制文件时,很自然地会收到非法硬件指令错误。但有些二进制文件仍然可以工作,因为它们实际上不使用SSE4
。
我正在寻找一种快速方法来确定二进制文件是否实际使用SSE4
指令集。这样我就可以扫描一堆文件并列出需要重建的文件。
答案1
此文件包含一份相当不错的汇编指令列表及其与 vim 一起使用的相应指令集:
https://raw.githubusercontent.com/Shirk/vim-gas/master/syntax/gas.vim
如果你的系统上有 objdump,那么你可以直接将二进制文件转储为汇编代码,使用
objdump -d FILEPATH
因此,结合这两点,您可以列出二进制文件使用的系列。我创建了一个 Python 脚本,过去曾用它来自动执行此操作。
http://pastebin.com/raw/AaRZdQLc
示例输出:(此输出包含 SSE4 指令)
$ ./binary_families.py /bin/busybox These instruction families were used: 186_Base, 386_Base, 8086_Base, ARM_THUMB, Base, KATMAI_Base, KATMAI_MMX, KATMAI_SSE, NEHALEM_Base, P6_Base, PENT_3DNOW, PENT_Base, PENT_MMX, PRESCOTT_SSE3, SANDYBRIDGE_AVX, SSE2, SSE41, SSE42, X64_Base, X64_MMX, X64_SSE, X64_SSE2 These instructions could not be categorized: bndmov, cltd, cltq, cmova, cmovae, cmovb, cmovbe, cmove, cmovg, cmovge, cmovl, cmovle, cmovne, cmovns, cmovs, cqto, cvtsi2sdl, cwtl, decl, divl, divq, flds, fldt, fstpt, idivl, ja, jae, jb, jbe, je, jg, jge, jl, jle, jne, jnp, jns, jp, js, leaveq, lock, movabs, movsbl, movsbq, movsbw, movslq, movswl, movswq, movzbl, movzwl, mull, negl, nopl, nopw, notb, notq, rep, repnz, repz, seta, setae, setb, setbe, sete, setg, setge, setl, setle, setne, setnp, setns, setp, tzcnt, vinserti128, vmovdqu64
(这不)
$ ./binary_families.py /bin/ls
These instruction families were used: 186_Base, 386_Base, 8086_Base, ARM_THUMB, KATMAI_SSE, P6_Base, PENT_MMX, SSE2, X64_Base, X64_MMX, X64_SSE, X64_SSE2 These instructions could not be categorized: cltq, cmova, cmovae, cmovb, cmovbe, cmove, cmovg, cmovge, cmovle, cmovne, cmovns, cmovs, fadds, fildll, fistpll, flds, fldt, fstpt, ja, jae, jb, jbe, je, jg, jge, jl, jle, jne, jns, jo, js, movabs, movsbl, movslq, movzbl, movzwl, nopl, nopw, rep, repnz, repz, seta, setb, sete, setg, setge, setl, setle, setne, setp