クロス開発環境の構築
IT基礎技術勉強会でクロス開発環境の構築方法を知ったので、さっそく実行。
以下のリンク先の方法でクロス開発環境の構築を行ったところ、gccのインストールに手こずったので、メモ。
IT初心者勉強会:クロス開発環境のインストール
- 開発環境
- Ubuntu 11.04 x64
gccビルド(H8300の例)
$ cd gcc-3.4.6 $ ln -s ../newlib-1.19.0/newlib . $ PATH=$PATH:/usr/local/trunk/cross/bin $ ./configure --target=h8300-elf --prefix=/usr/local/trunk/cross --disable-nls --disable-threads --disable-shared --with-newlib --enable-languages=c $ make
gccビルドエラー1: 全て(?)のターゲットCPUでパッチが必要なエラー
gcc -g -O2 -DIN_GCC -DCROSS_COMPILE -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -pedantic -Wno-long-long -DHAVE_CONFIG_H -I. -I. -I../../gcc -I../../gcc/. -I../../gcc/../include \ -DTARGET_MACHINE=\"h8300-elf\" \ -c ../../gcc/collect2.c -o collect2.o In file included from /usr/include/fcntl.h:252:0, from ../../gcc/system.h:214, from ../../gcc/collect2.c:30: In function ‘open’, inlined from ‘collect_execute’ at ../../gcc/collect2.c:1537:20: /usr/include/bits/fcntl2.h:51:24: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT in second argument needs 3 arguments make[1]: *** [collect2.o] Error 1 make: *** [all-gcc] Error 2
これは、gcc3.4.6/gcc/collect2.c に以下のパッチを当てればOK。
1537c1537 < redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT); --- > redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT, 0755);
gccビルドエラー2: 64bit環境でh8300のビルドのみで発生するエラー
../../gcc/libgcc2.c: In function `__muldi3': ../../gcc/libgcc2.c:537: error: unrecognizable insn: (insn 244 243 245 0 ../../gcc/libgcc2.c:528 (set:HI (reg:HI 3 r3) (const_int 4294967222 [0xffffffb6])) -1 (nil) (nil)) ../../gcc/libgcc2.c:537: internal compiler error: in extract_insn, at recog.c:2083 Please submit a full bug report, with preprocessed source if appropriate. See <URL:http://gcc.gnu.org/bugs.html> for instructions. make[2]: *** [libgcc/./_muldi3.o] Error 1 make[1]: *** [stmp-multilib] Error 2 make: *** [all-gcc] Error 2
これは、gcc3.4.6/gcc/config/h8300/h8300.c に以下のパッチを当てる。
55,56c55,56 < static void h8300_emit_stack_adjustment (int, unsigned int); < static int round_frame_size (int); --- > static void h8300_emit_stack_adjustment (int, HOST_WIDE_INT); > static HOST_WIDE_INT round_frame_size (HOST_WIDE_INT); 371c371 < h8300_emit_stack_adjustment (int sign, unsigned int size) --- > h8300_emit_stack_adjustment (int sign, HOST_WIDE_INT size) 400,401c400,401 < static int < round_frame_size (int size) --- > static HOST_WIDE_INT > round_frame_size (HOST_WIDE_INT size)
これで、makeは成功。あとは、make installが通ればOK。
make installのエラー
$ sudo make install /usr/bin/install -c -m 644 ./libgcc.a /usr/local/trunk/cross/lib/gcc/h8300-elf/3.4.6/ h8300-elf-ranlib /usr/local/trunk/cross/lib/gcc/h8300-elf/3.4.6/libgcc.a make[2]: h8300-elf-ranlib: Command not found make[2]: *** [install] Error 127 make[1]: *** [install-multilib] Error 2 make: *** [install-gcc] Error 2
binutilsをインストールすると入ってくるh8300-elf-ranlibが見つからないって言われる。
PATHを確認すると、h8300-elf-ranlibのある/usr/local/trunk/cross/binにパスは通っている。
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/trunk/golang/bin:/usr/local/trunk/cross/bin
これはsudo時のPATHにユーザのPATHが反映されていないのが原因。
$ sudo env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
Ubuntuには su*1 や setenv がない。
sudo時にユーザのPATHを反映させるために、以下のシェル・スクリプトを書いて、sudo で実行。
(IT初心者勉強会を開催されている坂井さんにご助言いただきました。ありがとうございます!)
#!/bin/sh # install.sh PATH=${PATH}:/usr/local/trunk/cross/bin make install
$ sudo sh install.sh
IT初心者勉強会:クロス開発環境のインストールにも書いてありますが、ターゲットCPUを sh にして --with-newlib オプションを付けてビルドすると失敗するため、shのみ newlib をインストールできなかった。いろいろ試したけど、うまくいかず…
毎回、開発環境の構築で手こずるなぁ…
参考ページ
(OS自作本編第3回)Ubuntu,Fedora,Cygwinで動作確認した
12ステップで作る 組込みOS自作入門
PATCH, h8300: Fix build on 64bit targets
*1:正確にはsuは無効化されている