クロス開発環境の構築

IT基礎技術勉強会でクロス開発環境の構築方法を知ったので、さっそく実行。

以下のリンク先の方法でクロス開発環境の構築を行ったところ、gccのインストールに手こずったので、メモ。
IT初心者勉強会:クロス開発環境のインストール

開発環境
Ubuntu 11.04 x64
インストールしたもの
binutils-2.21
gcc-3.4.6
newlib-1.19.0

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は無効化されている