この記事では逆アセンブラobjdumpを使った逆アセンブルの表示方法を説明しています。
objdumpを使った逆アセンブルの表示
前回までの連載ではndisasmを使って逆アセンブルを表示する方法を紹介しました。
この記事では、逆アセンブルする便利な方法をもう一つ紹介します。
いつものようにバッチファイルからコマンドプロンプトを起動します。
以下のコマンドを実行します。
gcc -c -g -o casm-c-sample.o casm-c-sample.c
このコマンドでオブジェクトファイルcasm-c-sample.oが作成されます。
ここではオブジェクトファイルとは機械語ファイルとほぼ同じ意味で使っています。
次に今作成したオブジェクトファイル(機械語)に対応する逆アセンブルを表示します。
下のコマンドを実行します。
objdump -d -S -M intel casm-c-sample.o
下の画像のように機械語と逆アセンブルが表示されました。
さらによく見ると対応するC言語の行も表示されています(青い下線)。
先ほどは以下のコマンド
gcc -c -g -o casm-c-sample.o casm-c-sample.c
を実行することでデバッグ情報付きのオブジェクトファイルを出力しました。
-gオプションを付けることでC言語の行と機械語などとの対応をデバッグ情報に含めます。
試しに-gオプションを指定しないでオブジェクトファイルを作成するコマンド
gcc -c -o casm-c-sample.o casm-c-sample.c
を実行してみます。
作成されたオブジェクトファイルはデバッグ情報が小さくなるのでその分小さくなります。
C言語の行との対応情報を含むオブジェクトファイルのサイズは2KBでした。
デバッグ情報を含まないオブジェクトファイルをobjdumpを使って下のコマンドで逆アセンブルを表示すると
objdump -d -S -M intel casm-c-sample.o
上の画像のようにC言語の対応する行が含まれない表示になりました。
ここまで見てきたコマンド
objdump -d -S -M intel casm-c-sample.o
についているオプションを説明しておきます。
-d:逆アセンブルモードでobjdumpを実行
-S:逆アセンブル結果にC言語のソースコードを混ぜて表示
-M intel :逆アセンブル結果をintel記法で表示
ここでは逆アセンブルする目的でobjdumpを使うので-dオプションは必須です。
-Sオプションは逆アセンブル結果にC言語のソースコードを混ぜて表示するか否かを決めます。オブジェクトファイル作成時に-gオプションを付けてC言語の対応情報を付加した場合は意味を持ちます。
ここまででは、以下のコマンド
gcc -c -o casm-c-sample.o casm-c-sample.c
によって作成したオブジェクトファイルをobjdumpを使って逆アセンブルしたものを表示しましたが、前回の記事で作成した機械語ファイルをobjdumpを使って逆アセンブルを表示してみます。
前回作成した機械語ファイルはcasm-c-sample.binです。
以下のコマンドを実行します。
objdump -d -S -M intel casm-c-sample.bin
上の画像のようにファイルフォーマットが認識されないということで逆アセンブルが表示できませんでした。
objdumpを使って逆アセンブルを表示させるときは以下のようなコマンド
gcc -c -o casm-c-sample.o casm-c-sample.c
で機械語ファイルを作成する必要があることがわかりました。
これまでの連載で逆アセンブルして表示するにはndisasmとobjdumpを使う方法の2通りがあることを学習しました。
なお、ndisasmとobjdumpの出力するアセンブリ言語は書式が少し異なります。必要に応じて使用する逆アセンブラを選択します。
この記事は以上です。