【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

クロスコンパイラ

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