以下は2011年より進めていたアセンブラ解析と書籍執筆について, 当時公開していた情報です. 今となっては昔の情報ですが,いちおう削除せずにそのまま残しておきます.


「フィーリングで読むアセンブラ入門」執筆中です!

2012/02/26時点での最新の環境を配布します. おそらくこれが書籍版になると思います. (2012/10/18追記:なりませんでした(^^;).とくに理由がなければ, 書籍用の最新版のほうを利用してください)

上記アーカイブファイルは,環境構築用スクリプトとパッチ類,サンプルプログラム, またサンプルプログラムをビルドしてアセンブラを出力した状態でアーカイブして あります.このため解凍すれば,とりあえずは(環境構築無しでも)アセンブラを 見てみることができます.

FreeBSD, Ubuntu, WindowsXP+Cygwinの環境で構築し,出力された逆アセンブラファイル が一致することを確認してあります.

ツール類には binutils-2.21.1, gcc-3.4.6, gdb-7.3.1 を利用します. GNUのサイトからダウンロードできますが (そしてこのページの下の方でも配布していますが), いちおうオリジナルを以下で改めて配布します.

以下,環境構築の手順です.環境構築の方法は下のほうの2011/09/09の記事でも説明 してありますが,最新版ではいくつか変更が加わっています.こちらを参考にして 環境構築してください.

(注1:全てのアーキテクチャ用のクロスコンパイラをビルドしようとすると, ビルドディレクトリに7GB程度,インストール先(/usr/local/cross)に 2.5GB程度が必要になります.また時間もけっこうかかります)
(注2:cygwinだと必要なHDD容量は2〜3割増し,時間も長めにかかります)

  1. システムに,以下をあらかじめインストールしておいてください. もしくは必要に応じてインストールしてください.
  2. 上記から「cross-20120226.zip」をダウンロードして解凍してください.
    解凍すると以下のフォルダが作成されます.
  3. 上記 gnu のディレクトリに binutils-2.21.1.tar.bz2, gcc-3.4.6.tar.gz, gdb-7.3.1.tar.gz を解凍して ください. (注:以前の例に比べbinutilsのバージョンが2.21→2.21.1に変更してあります)
        % cd gnu
        % tar xvzf binutils-2.21.1.tar.bz2 (うまく解凍できない場合は「xvjf」で)
        % tar xvzf gcc-3.4.6.tar.gz
        % tar xvzf gdb-7.3.1.tar.gz
        
  4. patch に置いてあるパッチを当ててください. (binutils が3つ,gccが4つ,gdbが1つ)
    パッチは以下のようにして当てられます.(FreeBSD, Ubuntu, Cygwin共通)
        % cd binutils-2.21.1
        % patch -p0 < ../../patch/patch-binutils-2.21.1-alpha.txt
        % patch -p0 < ../../patch/patch-binutils-2.21.1-sed-am.txt
        % patch -p0 < ../../patch/patch-binutils-2.21.1-sed-in.txt
        % cd ../gcc-3.4.6
        % patch -p0 < ../../patch/patch-gcc-3.4.6-alpha.txt
        % patch -p0 < ../../patch/patch-gcc-3.4.6-gcc4.txt
        % patch -p0 < ../../patch/patch-gcc-3.4.6-ia64.txt
        % patch -p0 < ../../patch/patch-gcc-3.4.6-vax.txt
        % cd ../gdb-7.3.1
        % patch -p0 < ../../patch/patch-gdb-7.3.1-centos.txt
        
  5. 不要なアーキテクチャがあれば, build/{binutils,gcc,gdb}/{build.sh,install.sh} を修正して外してください.
  6. build/binutils に入って ./build.sh を実行してください.
    (注:34アーキテクチャをすべてビルドするとけっこうな時間がかかります. build/binutilsディレクトリにアーキテクチャごとのディレクトリが できていくことで進度を見れますので,気長に待ってください)
  7. スーパーユーザになって(Ubuntuではsudoで),./install.sh を実行して ください.
  8. ls /usr/local/cross/*/bin をして,各アーキテクチャ用ツールが インストールされていることを確認してください.
  9. build/gcc で同様のことを行なってください. (gccのインストールにはbinutilsが必要なので,binutilsのインストール 後に行なってください)
  10. シミュレータ実行も試したい場合には,さらに build/gdb で同様のことを 行なってください.
  11. sampleディレクトリに入って,makeを実行してみてください.
    (注:クロスコンパイラを構築していないアーキテクチャがある場合には, make -k でエラーをスキップしてください)
    以下のファイルがアーキテクチャごとに作成されれば成功です.
    1. <ターゲット名>.c ... ソースコード(sample.c)をアーキテクチャ専用にコピーしたもの
    2. <ターゲット名>.s ... コンパイル結果のアセンブラ
    3. <ターゲット名>.o ... アセンブル結果のオブジェクトファイル
    4. <ターゲット名>.x ... リンク結果の実行形式
    5. <ターゲット名>.d ... 逆アセンブル結果のアセンブラ

    (書籍では主に逆アセンブル結果の *.d を扱います)
  12. execディレクトリに入って,make ; make run を実行してみてください.
    アーキテクチャごとに Hello World が実行されれば成功です.

以下は2011/12/30に書いた記事です.


2011/12/30時点での最新の環境を配布します. おそらくこれが書籍版になると思います. (2012/02/26追記:さらに更新しました.上の最新版を参照してください)

また書籍中ではバイナリエディタにhexeditを利用します. で,ぼくはhexeditに以下の修正を加えて利用していますのでそれもついでに パッチとして公開します.
(2012/05/14追記:現在はさらに修正を加え, こちらで新たに配布しなおしています. 以下のパッチの内容も取り込んであるため,とくに理由がなければ新しいパッチの ほうを利用してください) いちおうhexeditのオリジナルも以下で配布します. 以下はパッチの内容.けっこう便利. パッチは hexedit-1.2.12 用です.FreeBSDのportsに付属しているパッチもマージして あるので,FreeBSDでportsを利用する場合は /usr/ports/editors/hexedit/files の ファイルを上書きして make でビルドできます.それ以外は,hexeditを展開後にパッチ当て して ./configure ; make ; make install です.

以下は2011/12/09に書いた記事です.


環境を修正しました.また cross/sample, cross/exec をビルド済みの状態で 配布しますので,とりあえずアセンブラを見てみたいというかたはどうぞ.

以下は2011/12/05に書いた記事です.


以下は2011/12/05時点での最新のクロス環境構築用サンプルです.

環境を自動的に判断するようにビルドスクリプトを修正してあります (FreeBSD, Ubuntu, CentOS, cygwin で動作確認済み). 環境に合わせて build.sh を修正する必要がありません.現在の環境は cross/build/checkenv.sh で確認できます.

gdbのビルド用スクリプトが追加されています.cross/gnu に gdb-7.3.1.tar.gz を 展開し,cross/build/gdb/build.sh を実行することでビルドできます. ビルド後に install.sh でインストールします.

gdb-7.3.1をいちおう以下に置いておきます. もちろんGNUのサイトからもダウンロードできます.

また以下のアーキテクチャについては,gdbのシミュレータ機能を利用して エミュレーション動作させる環境(cross/exec)を追加してあります (そのための簡単なスタートアップとシステムコール呼び出しライブラリを作成して あります).各種アーキテクチャ用の簡単な Hello World が動作可能です.

arm-elf h8300-elf mips-elf powerpc-elf sh-elf avr-elf cris-elf frv-elf m32r-elf m6811-elf mcore-elf mn10300-elf sh64-elf sparc-elf v850-elf

以下のアーキテクチャはネイティブ実行します.

i386-elf

上記シミュレータとネイティブ実行は,cross/exec で make して make run を実行 することで動作します.

また他にも細かい点をいろいろ修正してあります.

以下は2011/10/10に書いた記事です.


以下は2011/10/10時点での最新のクロス環境構築用サンプルです. 以下2011/09/14に公開したものに対して,ビルド用スクリプト, サンプルプログラム等を修正してあります.

また binutils-2.21.1 を利用するように変更されています(以前は binutils-2.21). binutils-2.21.1 は以下,環境構築方法のところからダウンロードできます.

以下は2011/09/14に書いた記事です.


以下は2011/09/14時点での最新のサンプルです.以下2011/09/09に公開したものに対して, サンプルプログラム(sample/{sample.c,ld.scr,Makefile})をさらに修正してあります.

以下は2011/09/09に書いた記事です.


先行して,アセンブラの出力環境を公開しておきます(2011/09/09現在のもの). 興味のあるかたは見たりいじったりしてみてください.binutils-2.21 + gcc-3.4.6 の 組合せで34種類のアーキテクチャのクロス開発環境もどきを構築して,39種類の アセンブラを出力させています.
(注:現在はさらに改良してあります.とくに理由が無ければ本ページの上のほうの 最新情報を参照してください)

(注1:ここで「もどき」といっているのは,アセンブラ解読を目的として作成した 環境なので,リンカスクリプトは逆アセンブラ解読向けで実開発向けではなく, またスタートアップやライブラリなどが用意されていない,という意味です)

(注2:言うまでもありませんが,ここで説明している内容は無保証です. 試すかたは自分の責任のもとで試してください)

クロスコンパイラ作成には,七誌さんの情報を参考にさせていただきました. ありがとうございます!

以下のアーキテクチャのクロス開発環境を構築しています.(34種類)

alpha-elf, arc-elf, arm-elf, avr-elf, cris-elf, fr30-elf, frv-elf, h8300-elf, hppa-linux, i386-elf, i960-elf, ia64-elf, m32r-elf, m6811-elf, m68k-elf, mcore-elf, mips-elf, mips64-elf, mmix-elf, mn10300-elf, pdp11-aout, powerpc-elf, powerpc64-linux, s390-linux, sh-elf, sh64-elf, sparc-elf, strongarm-elf, v850-elf, vax-netbsdelf, x86_64-linux, xscale-elf, xstormy16-elf, xtensa-elf

以下のアセンブラは,上記環境でコンパイルオプションを変えることによって 出力させています.(5種類)

arm16-elf, avr8-elf, h8300h-elf, m6811s-elf, mips16-elf

(注:上記アーキテクチャは binutils-2.21 + gcc-3.4.6 の組合せでクロス開発環境を 構築できそうなものでなるべくOS依存など無いターゲットを片っ端から構築してみた, というものです.このため私自身,すべてのアーキテクチャをよく知っているという わけではなく,それどころかよく知らないアーキテクチャもいっぱい入っています. またすべてを書籍で扱うわけでもないです.まあお試しで戯れに作ってみた, 軽い気持で見てみよう,くらいの温度で見ていただければと思います)

FreeBSD, Ubuntu, WindowsXP+Cygwinの環境で構築し,出力された逆アセンブラファイル が一致することを確認してあります.

以下は2011年6月に書いた旧記事です.


「フィーリングで読むアセンブラ入門」というような本を書きたいと思っている.

とりあえずクロスコンパイラをビルドしてみた. で,25種類(!)のアセンブラを軽〜く眺めてみた.
※ 2011/06/25にalpha-elfを追加して,26種類になりました.クロスビルド方法を教えてくださった七誌さん,どうもありがとうございました.alpha-elf用のパッチはこちら

PDP11とかxtensaとか面白い.M6811はなんじゃこりゃ!って感じ. 64KB空間だからなのだと思うけどポインタサイズとか2バイトだし. AVRはマイコンだなあってかんじ.IA64は…なんつーか6バイト命令が 普通になってて,64ビットにもなるとコードサイズとかもうどうでもいいのね.

こうして見ると,昔ながらのCISCはプロセッサごとにクセがあって面白いし, どんなレジスタを持っているのかある程度予備知識が無いと,いきなり読むのは ちと厳しいかも(とくにアキュームレータ方式のやつ). RISCはだいたい似た感じなので,雰囲気でなんとなく読める. SPARCは初めて見たけど,スタックサイズをやたらでかくとっているのが気になる. レジスタウィンドウのせい?thumbやMIPS16は確かにサイズ縮小されているね. V850はH8に似ているなあ.

すっきりしているのはやっぱりPowerPCかMIPSかなあ.ARCもすっきりしているね.


メールは kozos(アットマーク)kozos.jp まで