Más contenido relacionado
Similar a Cコンパイラの改造(未) (13)
Cコンパイラの改造(未)
- 4. アセンブラと格闘
• 何だかよく分からないので、インタプリタが止
まっている付近を逆アセンブル
• 念のためV6のasでアセンブルしてバイナリを
確認
• あれ?一致しない
• 延々と悩み続けた結果・・・ mov 10
10(r0), r0
ディスプレースメントは
ディスプレースメントは
プレフィックスなしでも8進数 だ!!
プレフィックスなしでも 進数だ
プレフィックスなしでも 進数だ!!
プレフィックスなしでも8進数
進数だ
進数
- 6. 410
• オブジェクトファイルは一致していたので、他
の原因を調査。
• 410をサポートしていなかったため、-nを外し
て407にしていたのが原因か?と疑う
– それが問題になるとは考えにくいけど
• 410のサポートはdataセグメントをアラインす
るだけなので簡単にできた
• c0とc2は動くようになった
• 依然としてc1が動かない・・・
- 7. simhで確認
• インタプリタでビルドするとき、シェルスクリプ
トをMakefileに作り変えていた
• Makefileが実行するのと同じ手順を、手動で
simh上のV6で行ってc1をビルド
• エラーが止まらない!
– 自作インタプリタと同じ症状
– インタプリタ自体はまともに動いているらしい
– simh強制終了→ディスクイメージ破損
• どこかビルド手順を間違えたみたい・・・
- 8. runスクリプト
• ビルドはrunというシェルスクリプトで行う
• スクリプトをインタプリタ用に修正
• ビルドしたらsimh上とバイナリが完全一致
• もちろん完全動作
Makefileの作成ミスだった!
Makefileの作成ミスだった!
ミスだった
- 9. スタブ
• runとMakefileをよく見比べたら、c1をリンクす
るときにc1t.oが足りなかった
• リンクしなくてもundefinedにならないので気
付かなかった
– V6のldは同名のグローバルシンボルを1つにまと
めるためextern不要だが、その仕様を利用して
定義がc1h.cとc1t.sに重複していた
– c1h.cがスタブで、c1t.sが実体
– スタブの存在でundefinedが避けられていた
- 10. コンパイルフロー (1)
• cc a.c としてコンパイルするときに裏で呼ば
れるコマンド
cc a.c
/lib/c0 a.c /tmp/ctm1f /tmp/ctm2f
/lib/c1 /tmp/ctm1f /tmp/ctm2f /tmp/ctm3f
as - /tmp/ctm3f
/lib/as2 /tmp/atm1a /tmp/atm2a /tmp/atm3a -g
ld -X /lib/crt0.o a.o -lc -l
- 11. コンパイルフロー (2)
c0 c1 as
/tmp/ctm1f
a.c /tmp/ctm3f
/tmp/ctm2f
よくわからないバイナリ アセンブリ出力
シリアライズされたAST? (-Sと同じ)
• c0で位置情報を残して、c1で埋め込みたい