読者です 読者をやめる 読者になる 読者になる

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

odcctoolsの修正 (1)

Mach-O

前回まででNetBSDとMSYSでodcctoolsをビルドしました。どちらも同じ問題でi386用のアセンブラが起動しませんでした。

問題を修正するパッチです。

--- 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'

これを調査するのが今後の課題です。