Linuxの実行ファイルで使用している命令セットを確認する方法

Linuxでコンパイル済みのバイナリを拾ってきたとき、どんな命令セットが使われているのか調べたい時があります。

例えばバイナリで提供されているとツールを実行してもエラーになってしまい未対応の命令セットを使っているのではと疑っているときなど、私がそれを調べるのに使った方法を紹介します。

 

 環境

下記の環境でとあるロジックアナライザ(Saleae Logic16)のソフトが動作しなかったため、命令セットを調査することにしました。

  • PC:Toshiba Dynabook A1/X10
  • CPU:Pentium3 1GHz
  • Memory:128 + 256MByte
  • OS:Linux (Debian8 jessie) 32bit
ScreenShot_illegalInstruction.PNG

 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でダンプして命令を調べるという手もありますが、命令セットを指定すると該当するものを抽出してくれる便利なスクリプトがあるので、これを使わせてもらいます。

上記の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
--

 

参考

この記事は以下のページを参考に記載しました。

 

コメントを残す

メールアドレスが公開されることはありません。

This blog is kept spam free by WP-SpamFree.