Install gcc and binutils for H8 - TarosGitHub/EmbOSLab GitHub Wiki
# 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
# 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
/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引数を追加)。
./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
$ winpty docker exec -it <コンテナ名> bin/bash
# exit
$ docker container cp [<コンテナ名>:]<src> [<コンテナ名>:]<dst>
例: ホストからターゲットへコピー
$ docker container cp ./hoge.txt con:/tmp/
例: ターゲットからホストへコピー
$ docker container cp con:/home/foo/hoge.txt ./