りんけーじ - 開発資料 - H8 - binutil 2.9 for Cygwin


binutil 2.9 を h8300-hms ターゲットとしてコンパイルする

クロスコンパイラ構築の第一段階、binutil の make && make install の方法というか、試行錯誤の記録です。
使用したのは cygwin + gcc 3.3.3 (cygwin special)。

configure

./configure --prefix=/home/userlib/h8300-hms --target=h8300-hms
特に捻りなし。
/home/userlib は、/usr/local に置くと cygwin のファイルと混ざってバックアップが困難になるのを回避するために 作った別ユーザ(みたいなただのフォルダ)。
cygwin 上の configure はキレそうになるくらい重いですが、ここは我慢。最初だけですし。
lex が無い
checking lex output file root... ./configure: line 1701: lex: command not found
configure: error: cannot find output from lex; giving up
こんなことを言われたら、cygwin の setup.exe から、devel にある flex を追加インストール。
gcc などを勝手にアップデートされないよう、Curr から Keep に変更することをお忘れなく。
コレに引っかかった場合、最初だけとか思っていた configure が再び必要に。

libiberty 編

libiberty ディレクトリ内では結構エラーが出ます。以下、すべて cd libiberty している状態での作業です。
どーせエラーなしでなんか、そうそう通過できませんからネ!
dummy.c のコンパイルで怒られる
最初のファイルでコケるとかなめてますね。しかも 2>/dev/null とかしてくれちゃってるのでログが見えません。
実行されているのは、
gcc -c -g -O2 -I. -I./../include -DNEED_sys_siglist -DNEED_basename -DNEED_strsignal ./dummy.c
で、エラーは
In file included from dummy.c:46:
functions.def: In function `main':
functions.def:38: error: too few arguments to function `strstr'
functions.def:45: error: too few arguments to function `vprintf'
functions.def:46: error: too few arguments to function `vsprintf'
です。built-in な関数定義と当たっているだけなので、-fno-builtin を付けて手動でコンパイルを通します。
gcc -c -g -O2 -I. -I./../include -DNEED_sys_siglist -DNEED_basename -DNEED_strsignal -fno-builtin ./dummy.c
strerror.c で怒られる
gcc のコンパイル時にも同じエラーで引っかかります。gcc-4.1 のコンパイル時など、libibery を含んでいる場合はとにかく引っかかる模様。
エラーは次の通り。
strerror.c:461: error: conflicting types for `sys_errlist'
/usr/include/sys/errno.h:23: error: previous declaration of `sys_errlist'
errno.h での sys_errlist や sys_nerr の宣言との衝突なので、strerror.c を修正します。
#ifndef をコメントアウトする代わりに NEED_sys_errlist が config.h で宣言されているのを消しても構いません。
この diff patch は patch strerror.c とした後、標準入力から流し込めば OK。
10c10
< #ifndef NEED_sys_errlist
---
> //#ifndef NEED_sys_errlist
17c17,18
< #endif
---
> #define sys_nerr sys_nerr__
> //#endif
22c23
< #ifndef NEED_sys_errlist
---
> //#ifndef NEED_sys_errlist
24c25,26
< #endif
---
> #undef sys_nerr sys_nerr
> //#endif
ちなみに FreeBSD + gcc 3.4.4 な環境では strsignal.c でも同様のエラーに見舞われます。
こちらは str_nsig が引っかかるので、これまた同様に #define と #undef で処理します。
(何で strerror.c では後ろにアンダースコアを 2 つ付けて回避しているのに、こっちは #define sys_siglist no_such_symbol とかなってるんだろう…)
FATAL: can't create pic/〜 とか言われる
また何か面倒な問題か…と思いきや、ディレクトリが生成されていないだけです。
mkdir pic

srconv 編

sysroff から coff 形式へのコンバータ。binutils ディレクトリ内でコンパイルされます。
In file included from srconv.c:29:
bucomm.h:30:23: fopen-bin.h: No such file or directory
In file included from srconv.c:29:
bucomm.h:129: error: parse error before "boolean"
srconv.c:30:21: sysroff.h: No such file or directory
srconv.c:32:23: libiberty.h: No such file or directory
srconv.c:35:27: coff/internal.h: No such file or directory
In file included from srconv.c:36:
../bfd/libcoff.h:79: error: parse error before "boolean"
../bfd/libcoff.h:79: warning: no semicolon at end of struct or union
(以下略)
問題のコマンドラインはこれ。
gcc -g -O2 srconv.c -o srconv
…やたらシンプルですね。ちょっと手前の行と比較してみましょう。
gcc -DHAVE_CONFIG_H -I. -I. -I. -D_GNU_SOURCE -I. -I. -I../bfd -I./../bfd -I./../include -g -O2 -c wrstabs.c
はい、どう見ても -I の include ディレクトリ指定が足りません。しかしそれだけではなくて、なんと実は sysroff.h というファイルが生成されていません。
よく見ると実行ファイルの生成コマンドであるにも関わらず .exe が付いていません。つまり gnu make の built-in rule が実行されています。
この原因は Makefile の 126 行付近、
PROGS = $(SIZE_PROG) $(OBJDUMP_PROG) $(NM_PROG) $(AR_PROG) $(STRINGS_PROG) $(STRIP_PROG) $(RANLIB_PROG) $(DEMANGLER_PROG) $(OBJCOPY_PROG) $(SRCONV_PROG)$(EXEEXT) $(ADDR2LINE_PROG)

bin_PROGRAMS = $(SIZE_PROG) $(OBJDUMP_PROG) $(AR_PROG) $(STRINGS_PROG) $(RANLIB_PROG) $(DEMANGLER_PROG) $(OBJCOPY_PROG) $(SRCONV_PROG)$(EXEEXT) $(ADDR2LINE_PROG)

noinst_PROGRAMS = $(NM_PROG) $(STRIP_PROG)

EXTRA_PROGRAMS = $(NLMCONV_PROG) $(SRCONV_PROG) $(DLLTOOL_PROG) $(WINDRES_PROG)
ここの連中に $(EXEEXT) があったりなかったりする点にあります。
が、実は $(SRCONV_PROG) は複数のファイルが指定されていて、ただ $(EXEEXT) をつけただけでは通りません。 修正内容はちょっと HTML では書きづらいので、patch を置いておきます。
$(addsuffix a,b) を利用して EXEEXT をくっ付けるよう修正しています。
binutil29-binutils-makefile.patch