Hatena::ブログ(Diary)

七誌の開発日記(旧) このページをアンテナに追加 RSSフィード

新ブログ Twitter OneDrive Wiki

2011-10-12

[]Insight

InsightgdbGUIフロントエンドです。昔のMinGWには標準で付属していたのですが、最近は含まれていないようです。公開されているバイナリで一番新しいのは以下の6.6のようです。

これを展開してbin/insight.exeを起動すれば良さそうですが、起動しません。MinGWのパスが通っている所に置いてもダメです。結論から言うとPEヘッダのSubsystemが02(GUI)だと起動しないようです。バイナリエディタで以下の手パッチを施すと起動しました。

  • 00DC: 02→03

ビルド

最初はSubsystemの違いに気付かなかったので、Insightのソースをダウンロードしてビルドしました。

gcc-4.5.2でビルドするには多少の修正が必要でした。

なぜか最初はinsightがビルドされなかったのですが、make installした後にもう一度makeするとビルドできました。理由はよく分かりません。

自分でビルドしたinsight.exeは起動しました。しかし邪魔なコマンドプロンプトが見えています。試しにバイナリエディタでPEヘッダのSubsystemを02(GUI)に書き換えた所、起動しなくなりました。これは配布バイナリと同じ症状です。そこで逆に配布バイナリのSubsystemを03(CUI)に書き換えたら、起動することを見付けました。

2011-06-27

[]クロスコンパイラ大集合

id:n7shi:20110625でご紹介した「フィーリングで読むアセンブラ入門」で使われているクロスコンパイラWindows用にビルドしたので配布します。MSYS用です。インストール方法はid:n7shi:20110513を参照してください。

SkyDrive:7shi/公開/MSYS/cross

詳細

基本構成は binutils-2.21.1, gcc-4.6.1 です。サポートされなくなったアーキテクチャは古いgccを使用しています。libgccがコンパイルできなかったものについては含めていません。

arm16-elf, h8300h-elf, mips16-elf, powerpc64-elf の4つは単独のコンパイラを持っていないため、他のコンパイラオプションを付けて使用します(備考欄参照)。

アーキテクチャbinutilsgcclibgcc備考
alpha-elf2.21.14.6.1パッチ適用
arc-elf2.21.14.6.1--enable-obsolete
arm-elf2.21.14.6.1-
arm16-elf---arm-elf-gcc -mthumb
avr-elf2.21.14.6.1-
h8300-elf2.21.14.6.1-
h8300h-elf---h8300-elf-gcc -mh
hppa-linux2.21.14.6.1×libcを省略したためlibgccなし
i386-elf2.21.14.6.1-
ia64-elf2.21.14.6.1libgccは空のstdlib.hで対処
m32r-elf2.21.14.6.1-
m6811-elf2.21.14.0.4gcc-4.1以降でビルド不可
m68k-elf2.21.14.6.1-
mips-elf2.21.14.6.1libgccはNetBSDビルド
mips16-elf---mips-elf-gcc -mips16
mips64-elf2.21.14.6.1libgccはNetBSDビルド
pdp11-aout2.21.14.6.1-
powerpc-elf2.21.14.6.1-
powerpc64-elf---powerpc-elf-gcc -mpowerpc64
sh-elf2.21.14.6.1-
sparc-elf2.21.14.6.1-
strongarm-elf2.21.14.2.4gcc-4.3以降でビルド不可
v850-elf2.21.14.6.1-
x86_64-linux2.21.14.6.1×libcを省略したためlibgccなし
xscale-elf2.21.14.2.4gcc-4.3以降でビルド不可
xtensa-elf2.21.14.6.1-

ビルドはある程度自動化しました。エラーなどは手動で対処する必要がありますが、参考までにMakefileを置いておきます。

2011-05-13

[][][][][][]クロスコンパイラ

第7回 IT初心者勉強会 アセンブラ大会に参加しました。色々なCPUのアセンブリ言語を比較していて、とても楽しかったです。

そこで使われていたクロスコンパイラWindows用にビルドしたので配布します。MSYS用です。MSYSはgccを動かすのに特化しており、Cygwinより手軽です。インストール方法はこちらを参照してください。

ダウンロード

インストール

/usr/localに展開するだけで完了です。以下にPowerPCインストール例を示します。他のアーキテクチャインストール方法も同様です。

$ mkdir /usr/local
$ tar xvJf gcc-4.6.1-msys-cross-powerpc-elf.tar.xz -C /usr/local

※ 既に/usr/localが存在する場合、mkdirは不要です。

使い方

配布バイナリにはlibcが含まれていないため、実行ファイルを出力する際には -nostdlib オプションを付けてください。出力ファイルを指定しないと a.out というファイル名で出力されます。

以下にPowerPCでの使用例を示します。他のアーキテクチャも同様です。

$ powerpc-elf-gcc -nostdlib hello.c
$ file a.out
a.out: ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), statically linked, not stripped

詳しい使い方は全資料に含まれるMakefileを参照してください。

ビルド手順

バイナリを使うだけなら必要ないのですが、参考までに配布物のビルド手順を書いておきます。

IT初心者勉強会環境構築方法とは若干異なります。

  • 勉強会のサンプルではlibcを使っていないため、newlibは省略しています。
  • gccのバージョンを4.6.1に上げました。
依存ライブラリ

まずgcc-4.6.1の依存ライブラリをビルドします。

  • gmp-5.0.2.tar.bz2
$ tar xvjf gmp-5.0.2.tar.bz2
$ cd gmp-5.0.2
$ ./configure
$ make
$ make install
  • mpfr-3.0.1.tar.xz
$ tar xvJf mpfr-3.0.1.tar.xz
$ cd mpfr-3.0.1
$ CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ./configure
$ make
$ make install
  • mpc-0.9.tar.gz
$ tar xvzf mpc-0.9.tar.gz
$ cd mpc-0.9
$ CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ./configure
$ make
$ make install
binutils/gcc

binutilsgccは各アーキテクチャでソースを共用するため、ソースの外でビルドします。このようにすれば、ソースの展開は1回で済みます。

$ tar xvjf binutils-2.21.1.tar.bz2
$ tar xvjf gcc-core-4.6.1.tar.bz2

以下にPowerPC用クロスコンパイラビルド手順を示します。

$ mkdir powerpc-elf
$ cd powerpc-elf
$ mkdir binutils
$ cd binutils
$ ../../binutils-2.21.1/configure --target=powerpc-elf
$ make
$ make install
$ cd ..
$ mkdir gcc
$ cd gcc
$ CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ../../gcc-4.6.1/configure --target=powerpc-elf
$ CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib make all-target-libgcc
$ make install-gcc
$ make install-target-libgcc

他のアーキテクチャはtargetを変えるだけで手順は同様です。ただしMSYSではMIPSのlibgccがメモリ不足でビルドできなかったため、配布バイナリにはNetBSDビルドしたものを入れています。

アーカイブ

配布バイナリの作成では、make installを一時ディレクトリに対して行いアーカイブしています。

$ cd powerpc-elf/binutils
$ make prefix=/opt install
$ cd ../gcc
$ make prefix=/opt install-gcc
$ make prefix=/opt install-target-libgcc
$ cd /opt
$ find . -name "*.exe" | xargs strip
$ tar cvJf gcc-4.6.1-msys-cross-powerpc-elf.tar.xz *

このようにして作成したバイナリを配布しています。

2011-03-04

[][][]クロスコンパイラ

MSYSでPDP-11のクロスgccビルドしました。バイナリを置いておきます。

/usr/localに展開すれば、pdp11-aout-gccとして呼び出せるようになります。特定OS用のcrtなどは含まれていないため、実行ファイルを出力する際には -nostdlib オプションを付けてください。出力ファイルを指定しないと a.out というファイル名で出力されます。

$ mkdir /usr/local
$ tar xvJf gcc-4.6.1-msys-cross-pdp11-aout.tar.xz -C /usr/local
$ pdp11-aout-gcc -nostdlib hello.c
$ file a.out
a.out: PDP-11 pure executable not stripped

用途

私の用途としては実行させるバイナリを作るよりも、アセンブリを確認してPDP-11の命令セットの雰囲気をつかむことが中心になると思います。アセンブリの確認方法などはid:n7shi:20101128を参照してください。

逆アセンブル

既存のバイナリを逆アセンブルするのにも使えます。たとえばid:n7shi:20101204でディスクイメージからファイルを取り出して逆アセンブルするなどです。

$ pdp11-aout-objdump -afph ls

ls:     ファイル形式 a.out-pdp11
ls
アーキテクチャ: pdp11, フラグ 0x00000082:
EXEC_P, WP_TEXT
開始アドレス 0x00000000

セクション:
索引名          サイズ      VMA       LMA       File off  Algn
  0 .text         00001100  00000000  00000000  00000010  2**1
                  CONTENTS, ALLOC, LOAD, CODE
  1 .data         00000228  00001400  00001400  00001110  2**1
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          000004f6  00001628  00001628  00000000  2**1
                  ALLOC

$ pdp11-aout-objdump -d ls > ls.s

カーネルはうまく逆アセンブルできませんでした。

$ pdp11-aout-objdump -afph rkunix

rkunix:     ファイル形式 a.out-pdp11
rkunix
アーキテクチャ: pdp11, フラグ 0x0000003e:
EXEC_P, HAS_LINENO, HAS_DEBUG, HAS_SYMS, HAS_LOCALS
開始アドレス 0x00000000

セクション:
索引名          サイズ      VMA       LMA       File off  Algn
  0 .text         00005d9c  00000000  00000000  00000010  2**1
                  CONTENTS, ALLOC, LOAD, CODE
  1 .data         0000056c  00005d9c  00005d9c  00005dac  2**1
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00003c60  00006308  00006308  00000000  2**1
                  ALLOC

$ pdp11-aout-objdump -d rkunix > rkunix.s
C:\MinGW\msys\1.0\local\bin\pdp11-aout-objdump.exe: rkunix: File truncated

【追記】simh上のv6でstripすると逆アセンブルできるようになりました。pdp11-aout-stripを使おうとしても落ちるため、どうやらbinutilsとはシンボルに互換性がないようです。これはv6内でコンパイルしたハローワールドなどの自作バイナリでも同様です。

2011-01-30

[][]クロスコンパイラ

PE勉強会が落ち着いたらELFを取り上げるのも面白いかなと思って、MSYSでELFが扱えるか確認してみました。そのまま何かのOSで動かせるバイナリを出力した方がいじりやすいため、NetBSD 5.1のクロスコンパイラを作ってみました。build.shを使わずにbinutilsgccを--target=i686-netbsdelfで直接ビルドしています。(i686-netbsdとしてビルドするとa.outになります)

/usr/localに展開すれば、i686-netbsdelf-gccとして呼び出せるようになります。

$ mkdir /usr/local
$ tar xvJf netbsd-5.1-i686-gcc.tar.xz -C /usr/local
$ i686-netbsdelf-gcc hello.c