Linuxでコンパイル済みのバイナリを拾ってきたとき、どんな命令セットが使われているのか調べたい時があります。
例えばバイナリで提供されているとツールを実行してもエラーになってしまい未対応の命令セットを使っているのではと疑っているときなど、私がそれを調べるのに使った方法を紹介します。
環境
下記の環境でとあるロジックアナライザ(Saleae Logic16)のソフトが動作しなかったため、命令セットを調査することにしました。
- PC:Toshiba Dynabook A1/X10
- CPU:Pentium3 1GHz
- Memory:128 + 256MByte
- OS:Linux (Debian8 jessie) 32bit
illegal instructionが発生して動かない、、、何故に?
CPUの対応状況を確認する
まず自分が使っているCPUがどの機能に対応しているか調べます。
$ cat /proc/cpuinfo
このPCは古いラップトップでPentium3が載っていました。flagsを見るとsseはありますがsse2/sse3はありません。ここに無い命令セットを使うとエラーが発生します。
processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 8 model name : Pentium III (Coppermine) stepping : 10 microcode : 0x4 cpu MHz : 996.905 cache size : 256 KB physical id : 0 siblings : 1 core id : 0 cpu cores : 1 apicid : 0 initial apicid : 0 fdiv_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pse36 mmx fxsr sse bogomips : 1993.81 clflush size : 32 cache_alignment : 32 address sizes : 36 bits physical, 32 bits virtual power management:
実行ファイルの命令セットを調べる
目的の実行ファイルでどんな命令セットが使われているかを調べます。objdumpでダンプして命令を調べるという手もありますが、命令セットを指定すると該当するものを抽出してくれる便利なスクリプトがあるので、これを使わせてもらいます。
- PASTEBIN - opcode
http://pastebin.com/A8bAuHAP
上記のURLからスクリプトをダウンロードして実行権限をつけます。
objdumpの出力をこのスクリプトに渡してやると、指定した命令コードがあると該当部分をハイライトして出力してくれます。
オプション"-s"で指定できる命令セットは以下の通りです。
X86 IA64 X64 MMX MMX2 3DNOW SSE SSE2 SSE3 SSSE3 VMX SSE4_1 SSE4_2 SSE4A SSE5 FMA AVX
私の場合、SSE2,SSE3が使われているか確認するのに以下のように実行しました。
$ objdump -d target_program | opcode -s SSE2 -s SSE3
実行してしばらくすると該当する命令コードが書かれたアドレスと命令が出力されます(movsdはSSE2)。結果を見ると、このプログラムにはsse2命令が使われていることが分かります(つまりPentium3では動作しません)。
8326b56: f2 0f 10 45 80 movsd -0x80(%ebp),%xmm0 -- 8326b62: f2 0f 11 44 24 10 movsd %xmm0,0x10(%esp) -- 8328c77: f2 0f 10 85 38 fe ff movsd -0x1c8(%ebp),%xmm0 --
参考
この記事は以下のページを参考に記載しました。
- superuser - How to check if a binary requires SSE4 or AVX on Linux
http://superuser.com/questions/726395/how-to-check-if-a-binary-requires-sse4-or-avx-on-linux - PASTEBIN - opcode
http://pastebin.com/A8bAuHAP - Wikipedia - Streaming SIMD Extensions
https://ja.wikipedia.org/wiki/Streaming_SIMD_Extensions - オフィスデイタイム - x86/x64 SIMD命令一覧表 (SSE~AVX2)
http://www.officedaytime.com/tips/simd.html