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内でコンパイルしたハローワールドなどの自作バイナリでも同様です。