2019年2月9日土曜日

Renesas V850 64bit Linux 版ツールチェインの Docker イメージを作る

Dockerfile の作り方

基本的に前回の記事を Dockerfile に落とし込むだけ。

記事からの変更点は以下の通り。

  • ダウンロードする場所を最初から / にした

cd は、 RUN ではなくて Dockerfile の WORKDIR コマンドで行う。

実行環境の構築

追加の作業として、ビルドした成果物のバイナリとライブラリのみを実行用環境にコピーする。

こうすることで、実行環境のコンテナイメージのサイズ削減ができる

使用ライブラリの特定

ldd を使って、各バイナリがどのライブラリを使用しているか確認する。

# ldd /usr/local/bin/* | grep ".so" | cut -d '(' -f -1 | sort -u
        /lib64/ld-linux-x86-64.so.2
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6
        linux-vdso.so.1
# ldd /lib64/ld-linux-x86-64.so.2 /lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libdl.so.2 /lib/x86_64-linux-gnu/libgcc_s.so.1 /lib/x86_64-linux-gnu/libm.so.6 /lib/x86_64-linux-gnu/libstdc++.so.6 | grep ".so" | cut -d '(' -f -1 | sort -u
        /lib64/ld-linux-x86-64.so.2
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6
        linux-vdso.so.1

ということで、この辺があれば良さそう。

  • /lib64/ld-linux-x86-64.so.2
  • /lib/x86_64-linux-gnu/libc.so.6
  • /lib/x86_64-linux-gnu/libdl.so.2
  • /lib/x86_64-linux-gnu/libgcc_s.so.1
  • /lib/x86_64-linux-gnu/libm.so.6
  • /lib/x86_64-linux-gnu/libstdc++.so.6

buster-slim には全部入っている。

完成した Dockerfile

# ビルド環境を構築してビルド
FROM debian:buster-slim as build-env

LABEL maintainer "mikoto2000 <mikoto2000@gmail.com>"
LABEL version="v14.01"
LABEL description "Runesas V850 Toolchain v14.01(fromhttps://gcc-renesas.com/ja/v850/v850-download-toolchains/)"

RUN apt-get update \
    && apt-get -y install \
        build-essential \
        libgmp-dev \
        libmpfr-dev \
        libmpc-dev \
        texinfo \
        wget \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# ツールチェインのソース取得
WORKDIR /
RUN wget https://gcc-renesas.com/downloads/d.php?f=v850/binutils/14.01/binutils-2.24_v850_v14.01.tar.bz2 -O binutils-2.24_v850_v14.01.tar.bz2
RUN tar xf binutils-2.24_v850_v14.01.tar.bz2
RUN wget https://gcc-renesas.com/downloads/d.php?f=v850/gcc/14.01/gcc-4.9.2_v850_v14.01.tar.bz2 -O gcc-4.9.2_v850_v14.01.tar.bz2
RUN tar xf gcc-4.9.2_v850_v14.01.tar.bz2
RUN wget https://gcc-renesas.com/downloads/d.php?f=v850/newlib/14.01/newlib-2.1.0_v850_v14.01.tar.bz2 -O newlib-2.1.0_v850_v14.01.tar.bz2
RUN tar xf newlib-2.1.0_v850_v14.01.tar.bz2

# binutils のビルド
RUN mkdir -p /build/binutils
WORKDIR /build/binutils
RUN ../../binutils-2.24/configure --target=v850-elf --prefix=/usr/local --enable-soft-float
RUN make CFLAGS="-Wno-cast-function-type -Wno-implicit-fallthrough -Wno-shift-negative-value -Wno-unused-value -Wno-pointer-compare"
RUN make install


# gcc のビルド
RUN mkdir -p /build/gcc
WORKDIR /build/gcc
RUN ../../gcc-4.9.2/configure --target=v850-elf --prefix=/usr/local --enable-languages=c,c++ --disable-nls --disable-multilib --disable-libssp --with-newlib --with-headers=/newlib-2.1.0/newlib/libc/include
RUN make CXXFLAGS="-std=c++03"
RUN make install


# newlib のビルド
RUN mkdir -p /build/newlib
WORKDIR /build/newlib
RUN ../../newlib-2.1.0/configure --target=v850-elf --prefix=/usr/local
RUN make
RUN make install


# 実行環境を構築してビルド環境からバイナリをコピー
FROM debian:buster-slim

LABEL maintainer "mikoto2000 <mikoto2000@gmail.com>"
LABEL version="v14.01"
LABEL description "Runesas V850 Toolchain v14.01(fromhttps://gcc-renesas.com/ja/v850/v850-download-toolchains/)"

# build-env から必要なファイルをコピー
COPY --from=build-env \
    /usr/local \
    /usr/local

# make くらい必要でしょ?
RUN apt-get update \
    && apt-get -y install \
        make \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

イメージのビルド

cd /PATH/TO/Dockerfile
docker build -t mikoto2000/v850-toolchain:latest .

動作確認

# cd /athrill/sample/barmetal/step2/
# make clean all
rm -f start.o vector.o training.o main.o test_suite.o test_instruction.o test_main.elf *.map
v850-elf-gcc -c -I. -I../common -I../../../trunk/src/config/target/v850esfk3 -O0 -mdisable -callt -mno-app-regs -mtda=0 -gdwarf-2 -Wall -Wno-unused-label -Wpointer-arith  -mv850e2 -Wa,-mno-bcond17 -Wa,-mwarn-signed-overflow -Wa,-mwarn-unsigned-overflow start.S
/usr/local/libexec/gcc/v850-elf/4.9-GNUV850_v14.01/cc1: error while loading shared libraries: libmpc.so.3: cannot open shared object file: No such file or directory
make: *** [../build/v850esfk3/Makefile.common:35: start.o] Error 1

おや?ここにも実行ファイルがあったんですね。依存ライブラリ確認。

# cd /usr/local/libexec/gcc/v850-elf/4.9-GNUV850_v14.01/
# ldd cc1 cc1plus coll
ect2 liblto_plugin.so.0.0.0
cc1:
        linux-vdso.so.1 (0x00007ffdcfdd8000)
        libmpc.so.3 => not found
        libmpfr.so.6 => not found
        libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x00007ff060af8000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff060af3000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff060970000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff0607ed000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff0607d1000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff060610000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ff061877000)
cc1plus:
        linux-vdso.so.1 (0x00007ffeb59b3000)
        libmpc.so.3 => not found
        libmpfr.so.6 => not found
        libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f5c57a0d000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5c57a08000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5c57885000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5c57702000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5c576e6000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5c57525000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f5c588f6000)
collect2:
        linux-vdso.so.1 (0x00007fff6cf2a000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6c99fde000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6c99e5b000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6c99e41000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6c99c80000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f6c9a1de000)
liblto_plugin.so.0.0.0:
        linux-vdso.so.1 (0x00007ffc407a1000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f92edef9000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f92ee0d1000)

これが無い。

  • libmpc.so.3 => not found
  • libmpfr.so.6 => not found

さっき作ったビルド用コンテナイメージでライブラリの場所を確認して Dockerfile に追加。

COPY --from=build-env \
    /usr/lib/x86_64-linux-gnu/libmpc.so.3 \
    /usr/lib/x86_64-linux-gnu/libmpc.so.3
COPY --from=build-env \
    /usr/lib/x86_64-linux-gnu/libmpfr.so.6 \
    /usr/lib/x86_64-linux-gnu/libmpfr.so.6

...gmp はどこいった? 対処療法っぽいけどまぁその辺は後々問題が出たら対応で。

docker イメージを再ビルドする。

動作確認再挑戦

# cd /athrill/sample/barmetal/step2/
# make clean all

OK.

Docker Hub に公開した

以上。

更新履歴

日付 更新内容
2019/2/9 新規作成
2019/3/11 gcc のビルド時、『s/--with-header/--with-headers/ で target-libstdc++-v3 のビルドエラーは解消できる』という指摘を反映

1 件のコメント:

  1. いつもありがとうございます。利用させていただきます、

    返信削除