Install gcc and binutils for H8 - TarosGitHub/EmbOSLab GitHub Wiki

H8用のgcc, binutilsのインストール

binutilsのインストール

# tar xvzf binutils-2.19.1.tar.gz (※1)
# cd binutils-2.19.1
# ./configure --target=h8300-elf --disable-nls --disable-werror
# make
# make install

※1. Ubuntu 上では解凍できなかったため Windows 上で解凍した。
cf. dockerコンテナ間(ホスト-ターゲット)でファイルコピー

次のようにインストールされていることを確認する。

$ ls /usr/local/bin
h8300-elf-addr2line  h8300-elf-as       h8300-elf-gprof  h8300-elf-nm       h8300-elf-objdump  h8300-elf-readelf  h8300-elf-strings
h8300-elf-ar         h8300-elf-c++filt  h8300-elf-ld     h8300-elf-objcopy  h8300-elf-ranlib   h8300-elf-size     h8300-elf-strip

gccのインストール

# tar xvzf gcc-3.4.6.tar.gz (※1)
# cd gcc-3.4.6
# ./configure --target=h8300-elf --disable-nls --disable-threads --disable-shared --disable-werror --enable-languages=c
# make
# make install

※1. Ubuntu 上では解凍できなかったため Windows 上で解凍した。
cf. dockerコンテナ間(ホスト-ターゲット)でファイルコピー

次のようにインストールされていることを確認する。

$ ls /usr/local/bin
h8300-elf-cpp  h8300-elf-gcc-3.4.6  h8300-elf-gcov   h8300-elf-gcc  h8300-elf-gccbug

トラブルシューティング1

/usr/include/x86_64-linux-gnu/bits/fcntl2.h:50:4: error: call to '__open_missing_mode' declared with attribute error: open with O_CREAT or O_TMPFILE in second argument needs 3 arguments
    __open_missing_mode ();
    ^~~~~~~~~~~~~~~~~~~~~~

gcc-3.4.6/gcc/collect2.c の 1537行目の

redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT);

redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT, 0755);

と修正する(第4引数を追加)。

トラブルシューティング2

./libgcc2.c: In function `__muldi3':
./libgcc2.c:537: error: unrecognizable insn:
(insn 244 243 245 0 ./libgcc2.c:528 (set:HI (reg:HI 3 r3)
        (const_int 4294967222 [0xffffffb6])) -1 (nil)
    (nil))
./libgcc2.c:537: internal compiler error: in extract_insn, at recog.c:2083

gcc-3.4.6-h8300.patchというファイル名の次の内容のファイルを作成し、

--- gcc/config/h8300/h8300.c.orig	2004-02-10 02:25:35.000000000 +0900
+++ gcc/config/h8300/h8300.c	2012-10-17 21:24:02.000000000 +0900
@@ -52,8 +52,8 @@
 static int h8300_saveall_function_p (tree);
 static int h8300_monitor_function_p (tree);
 static int h8300_os_task_function_p (tree);
-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);
 static unsigned int compute_saved_regs (void);
 static void push (int);
 static void pop (int);
@@ -368,7 +368,7 @@
    SIZE to adjust the stack pointer.  */
 
 static void
-h8300_emit_stack_adjustment (int sign, unsigned int size)
+h8300_emit_stack_adjustment (int sign, HOST_WIDE_INT size)
 {
   /* H8/300 cannot add/subtract a large constant with a single
      instruction.  If a temporary register is available, load the
@@ -397,8 +397,8 @@
 
 /* Round up frame size SIZE.  */
 
-static int
-round_frame_size (int size)
+static HOST_WIDE_INT
+round_frame_size (HOST_WIDE_INT size)
 {
   return ((size + STACK_BOUNDARY / BITS_PER_UNIT - 1)
 	  & -STACK_BOUNDARY / BITS_PER_UNIT);

次のコマンドを打つ。

# patch gcc-3.4.6/gcc/config/h8300/h8300.c < ./gcc-3.4.6-h8300.patch

dockerの使い方

dockerコンテナに入る

$ winpty docker exec -it <コンテナ名> bin/bash

dockerコンテナから出る

# exit

dockerコンテナ間(ホスト-ターゲット)でファイルコピー

$ docker container cp [<コンテナ名>:]<src> [<コンテナ名>:]<dst>

例: ホストからターゲットへコピー
$ docker container cp ./hoge.txt con:/tmp/

例: ターゲットからホストへコピー
$ docker container cp con:/home/foo/hoge.txt ./

参考

⚠️ **GitHub.com Fallback** ⚠️