「自作エミュレータで学ぶx86アーキテクチャ」という面白そうな本を見つけました。それを読んで実行したことを記事に書いていきます。
開発環境を導入する
まず、開発環境を整えます。開発環境は「自作エミュレータで学ぶx86アーキテクチャ」のサポートページより「tolset_p86.zip」として配布されています。
tolset_p86.zipをダウンロードしました。
ダウンロードしたフォルダを任意のフォルダに展開します。自分はダウンロードフォルダに展開しました。
それ以上の説明はないので開発環境はこれで構築できたと思います。
binファイルを作成する
まずは機械語を逆アセンブルする練習をします。その機械語(binファイル)を作るためにC言語ファイルをコンパイル、リンクして機械語にします。
使うC言語ファイルは「tolset_p86\casm-c-sample\casm-c-sample.c」です。
本書に従いバッチファイルからコマンドプロンプトを起動し以下のコマンドを実行しました。
自分はKindleの「自作エミュレータで学ぶx86アーキテクチャ」を読んでいます。この本の表示形式はテキストではなくて画像です。コピペで貼り付けることができないので、コマンドは自分でタイプして入力しました。
エラーがいくつか出ています。タイプミスだと思います。
-WI(大文字のI)でなくて小文字のlで -Wl のようです。
-fon-でなくて-fno-でした。
改めてコマンドを実行します。
またしてもエラーになってしまいました。
エラーになったのは -fno-asynchronous-unwind-tables の -fno- と asynchronous- の間にスペースが入っていたことが原因でした。
これで一応はコマンドを実行できたのですがエラーになってbinファイルが作られませんでした。
何が原因なんだろう?
i386-elf/bin/ld.exe: cannot find : Invalid argument collect2.exe: error: ld returned 1 exit status
cannot findと書いてあるので見つからないファイルがあるようです。
さらにInvalid argument と書いてあるのでその意味をネットで調べると解釈できないパラメータが指定されているらしい。
まだコマンドにタイプミス的不具合があっておかしなパラメータが読み込まれているようです。
今回はスペースの有無なども確認してから実行しました。
何も表示されていません。今度はうまく実行されたようです。
エラーが出た原因は -Wl,と–entry=funcの間にスペースが入っていたことでした。-Wl,–entry=func,–oformatのようにスペースを除去したらうまく実行されました。
フォルダを見ると.binファイルが生成されています。
そのまま実行できるコマンドを下に書いておきます。これのコピペで実行できます。
gcc -Wl,--entry=func,--oformat=binary -nostdlib -fno-asynchronous-unwind-tables -o casm-c-sample.bin casm-c-sample.c
今回の記事はbinファイルを生成するところまでです。この記事は以上です。