前回まででNetBSDとMSYSでodcctoolsをビルドしました。どちらも同じ問題でi386用のアセンブラが起動しませんでした。
- http://7shi.hateblo.jp/entry/2012/06/13/005958 (NetBSD)
- http://7shi.hateblo.jp/entry/2012/06/13/013702 (MSYS)
問題を修正するパッチです。
--- odcctools/as/read.c.orig 2012-06-13 01:47:29 +0900 +++ odcctools/as/read.c 2012-06-13 01:47:47 +0900 @@ -488,7 +488,9 @@ { "lcomm", s_lcomm, 0 }, { "line", s_line, 0 }, { "long", cons, 4 }, +#ifndef I386 { "word", cons, 4 }, +#endif { "quad", cons, 8 }, { "lsym", s_lsym, 0 }, { "section", s_section, 0 },
たったこれだけでasが起動して動作するようになります。
$ cat att.s call _foo call _foo $ i386-darwin-as.exe att.s $ file a.out a.out: Mach-O object i386
パッチの詳細
起動に失敗するエラーを良く見ると理由が書いてあります。
FATAL:error constructing pseudo-op table (exists) ~~~~~~
デバッグの結果、予約語をハッシュテーブルに登録する際に衝突していることが分かりました。
重複しているキーワードはwordです。read.cに書かれたwordが4であることから、ARM用に追加されたものだと推測されます(i386では2)。そのためi386を除外するように修正しました。
またバグ
Intel記法には同じラベルを2回使うとエラーになるという奇妙なバグがあります。Mac OS X上のasでも同じエラーが出るため、移植に起因するバグではありません。
$ cat intel.s .intel_syntax noprefix call _foo call _foo $ i386-darwin-as intel.s intel.s:3:suffix or operands invalid for `call'
これを調査するのが今後の課題です。