LoginSignup
2
2

More than 3 years have passed since last update.

Mac上で動作するVirtualBoxのUbuntu上でGccクロスコンパイル環境をDockerで構築

Last updated at Posted at 2020-03-31

Mac上で動作するVirtualBoxのUbuntu上でGccクロスコンパイル環境をDockerで構築

Gccのクロスコンパイル環境をMacOSで起動したVirtualbox上のUbuntuのDockerで構築しました。

なんでこんな複雑な構成にしているかというと、環境/作業によるかと思いますが、体感的にはMacOSのDockerより早い気がしているため。

構成

レイヤー 動作環境 OS
Docker Ubuntu18.04(ここに構築)
VirtualBox Ubuntu18.04
Macboo MacOS

Docker環境のインストール

リンク先を参照ください。
MacOS の VirtualBox Ubntu上にDocker環境を構築

VirtualBox上のUbuntu18.4環境

tagucchan@tagvbbuntugcc:~$ uname -a
Linux tagvbbuntugcc 5.3.0-42-generic #34~18.04.1-Ubuntu SMP Fri Feb 28 13:42:26 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
tagucchan@tagvbbuntugcc:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.4 LTS
Release:    18.04
Codename:   bionic
tagucchan@tagvbbuntugcc:~$ sudo docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b7f0
 Built:             Wed Mar 11 01:25:46 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b7f0
  Built:            Wed Mar 11 01:24:19 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

Ubuntu18.04イメージをプル

tagucchan@tagvbbuntugcc:~$ sudo docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
5bed26d33875: Pull complete 
f11b29a9c730: Pull complete 
930bda195c84: Pull complete 
78bf9a5ad49e: Pull complete 
Digest: sha256:bec5a2727be7fff3d308193cfde3491f8fba1a2ba392b7546b43a051853a341d
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04
tagucchan@tagvbbuntugcc:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               4e5021d210f6        7 days ago          64.2MB
hello-world         latest              fce289e99eb9        15 months ago       1.84kB

Dockerでubuntu 18.04のコンテナを作成

tagucchan@tagvbbuntugcc:~$ sudo docker run -it -d --name gcc-ubuntu ubuntu:18.04 
af48c1a975a26096ca8b0df01bd33f1c083604916f23c562607635f03548deb0

tagucchan@tagvbbuntugcc:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
af48c1a975a2        ubuntu:18.04        "/bin/bash"         2 minutes ago       Up 2 minutes                            gcc-ubuntu

"/bin/bash”を起動

tagucchan@tagvbbuntugcc:~$ sudo docker exec -it gcc-ubuntu /bin/bash
root@af48c1a975a2:/# 

Dockerの基本的な使い方

docker ps -a
docker start <CONTAINER IDまたはNAME> # コンテナの起動
docker stop <CONTAINER IDまたはNAME> # コンテナの停止

クロスコンパイラのビルドに必要なパッケージをインストール

root@af48c1a975a2:/# apt-get update
root@af48c1a975a2:/# apt-get upgrade
root@af48c1a975a2:/# apt-get install build-essential texinfo gawk
root@af48c1a975a2:/# apt-get install vim-tiny less wget rsync

bisonをインストール

root@af48c1a975a2:/# mkdir ~/dev
root@af48c1a975a2:/# mkdir ~/dev/bison
root@af48c1a975a2:/# cd ~/dev/bison

GUN M4をインストール

root@af48c1a975a2:/# wget https://ftp.gnu.org/gnu/m4/m4-1.4.18.tar.gz
root@af48c1a975a2:/# tar xf m4-1.4.18.tar.gz
root@af48c1a975a2:/# cd m4-1.4.18
root@af48c1a975a2:/# ./configure --prefix=/usr/local
root@af48c1a975a2:/# make
root@af48c1a975a2:/# make install
root@af48c1a975a2:/# cd ..

bisonをインストール

root@af48c1a975a2:/# wget https://ftp.gnu.org/gnu/bison/bison-3.5.tar.gz
root@af48c1a975a2:/# tar xf bison-3.5.tar.gz
root@af48c1a975a2:/# cd bison-3.5
root@af48c1a975a2:/# ./configure --prefix=/usr/local
root@af48c1a975a2:/# make
root@af48c1a975a2:/# make install

VirtualBoxのUbuntu内Dockerの情報

root@af48c1a975a2:/# gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

root@af48c1a975a2:/# uname -a
Linux af48c1a975a2 5.3.0-42-generic #34~18.04.1-Ubuntu SMP Fri Feb 28 13:42:26 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

root@af48c1a975a2:/# lsb_release -a
bash: lsb_release: command not found
root@af48c1a975a2:/# apt-get install lsb-release
root@af48c1a975a2:/# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.4 LTS
Release:    18.04
Codename:   bionic

root@af48c1a975a2:/# /lib/x86_64-linux-gnu/libc
libc-2.27.so  libc.so.6     
root@af48c1a975a2:/# /lib/x86_64-linux-gnu/libc.so.6
GNU C Library (Ubuntu GLIBC 2.27-3ubuntu1) stable release version 2.27.
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 7.3.0.
libc ABIs: UNIQUE IFUNC
For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>.

物理 CPU、CPU コア、および論理 CPU の数を確認

root@af48c1a975a2:~/dev/xgcc# grep physical.id /proc/cpuinfo | sort -u | wc -l
1

シェルスクリプトを作成

root@af48c1a975a2:/# mkdir ~/dev/xgcc
root@af48c1a975a2:/# cd ~/dev/xgcc

シェルスクリプト(ソースコードをダウンロード)

root@af48c1a975a2:~/dev/xgcc# vi ~/dev/xgcc/xgcc_download.sh
xgcc_download.sh
#!/bin/bash

set -e

BINUTILS_VERSION=binutils-2.34
GCC_VERSION=gcc-7.3.0
LINUX_KERNEL_VERSION=linux-5.3
GLIBC_VERSION=glibc-2.27

wget -nc http://ftpmirror.gnu.org/binutils/$BINUTILS_VERSION.tar.gz
wget -nc http://ftpmirror.gnu.org/gcc/gcc-7.3.0/$GCC_VERSION.tar.gz
wget -nc https://www.kernel.org/pub/linux/kernel/v5.x/$LINUX_KERNEL_VERSION.tar.xz
wget -nc http://ftpmirror.gnu.org/glibc/$GLIBC_VERSION.tar.xz

for f in *.tar*; do
    tar xfk $f
done

cd $GCC_VERSION
./contrib/download_prerequisites

シェルスクリプト(ソースコードをビルド)

root@af48c1a975a2:~/dev/xgcc# vi ~/dev/xgcc/xgcc_build.sh
xgcc_build.sh
#!/bin/bash

set -e

PREFIX=/usr/local
# CPU 1
PARALLEL_MAKE=
#CONFIGURATION_OPTIONS="--disable-multilib --disable-nls"
CONFIGURATION_OPTIONS="--disable-multilib --disable-nls --disable-libmpx"

BINUTILS_VERSION=binutils-2.34
GCC_VERSION=gcc-7.3.0
LINUX_KERNEL_VERSION=linux-5.3
GLIBC_VERSION=glibc-2.27

build() {
    local TARGET="$1"
    local LINUX_ARCH="$2"

    # Step 1. Binutils
    mkdir -p build-binutils-$TARGET
    cd build-binutils-$TARGET
    ../$BINUTILS_VERSION/configure --prefix=$PREFIX --target=$TARGET $CONFIGURATION_OPTIONS
    make $PARALLEL_MAKE
    make install
    cd ..

    # Step 2. Linux Kernel Headers
    cd $LINUX_KERNEL_VERSION
    make ARCH=$LINUX_ARCH INSTALL_HDR_PATH=$PREFIX/$TARGET headers_install
    cd ..

    # Step 3. C/C++ Compilers
    mkdir -p build-gcc-$TARGET
    cd build-gcc-$TARGET
    ../$GCC_VERSION/configure --prefix=$PREFIX --target=$TARGET --enable-languages=c,c++ $CONFIGURATION_OPTIONS
    make $PARALLEL_MAKE gcc_cv_libc_provides_ssp=yes all-gcc
    make install-gcc
    cd ..

    # Step 4. Standard C Library Headers and Startup Files
    mkdir -p build-glibc-$TARGET
    cd build-glibc-$TARGET
    ../$GLIBC_VERSION/configure --prefix=$PREFIX/$TARGET --build=$MACHTYPE --host=$TARGET --target=$TARGET --with-headers=$PREFIX/$TARGET/include $CONFIGURATION_OPTIONS libc_cv_forced_unwind=yes
    make install-bootstrap-headers=yes install-headers
    make $PARALLEL_MAKE csu/subdir_lib
    install csu/crt1.o csu/crti.o csu/crtn.o $PREFIX/$TARGET/lib
    $TARGET-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o $PREFIX/$TARGET/lib/libc.so
    touch $PREFIX/$TARGET/include/gnu/stubs.h
    cd ..

    # Step 5. Compiler Support Library
    cd build-gcc-$TARGET
    make $PARALLEL_MAKE all-target-libgcc
    make install-target-libgcc
    cd ..

    # Step 6. Standard C Library & the rest of Glibc
    cd build-glibc-$TARGET
    make $PARALLEL_MAKE
    make install
    cd ..

    # Step 7. Standard C++ Library & the rest of GCC
    cd build-gcc-$TARGET
    make $PARALLEL_MAKE all
    make install
    cd ..

    rm -rf build-binutils-$TARGET build-gcc-$TARGET build-glibc-$TARGET
}

build i686-linux-gnu x86
build arm-linux-gnueabi arm
build arm-linux-gnueabihf arm
build aarch64-linux-gnu arm64
build mips-linux-gnu mips
build mipsel-linux-gnu mips
build mips64el-linux-gnuabi64 mips

# 以下は私の環境ではエラーが出て駄目でした。
#build powerpc-linux-gnu powerpc
#build powerpc64le-linux-gnu powerpc
#build alpha-linux-gnu alpha
#build s390x-linux-gnu s390
#build m68k-linux-gnu m68k

# 以下は不要のため試していません
#build x86_64-linux-gnu x86
#build sparc-linux-gnu sparc
#build sparc64-linux-gnu sparc
#build cris-linux-gnu cris
#build sh4-linux-gnu sh

シェルスクリプト(各アーキテクチャのbinutilsをビルド)

root@af48c1a975a2:~/dev/xgcc# vi ~/dev/xgcc/xgcc_build_all_binutils.sh
xgcc_build_all_binutils.sh
#!/bin/bash
# build-binutils-all.sh

set -e

PREFIX=/usr/local
# cpu 1
PARALLEL_MAKE=
CONFIGURATION_OPTIONS="--disable-multilib --disable-nls"

BINUTILS_VERSION=binutils-2.34

mkdir -p build_all_binutils
cd build_all_binutils
../$BINUTILS_VERSION/configure --prefix=$PREFIX --enable-targets=all --enable-64-bit-bfd --program-prefix=all- $CONFIGURATION_OPTIONS
make $PARALLEL_MAKE
make install
cd ..

rm -rf build_all_binutils

スクリプトを実行

要:かなりの時間とディスク容量

root@af48c1a975a2:~/dev/xgcc# cd ~/dev/xgcc
root@af48c1a975a2:~/dev/xgcc# bash xgcc_download.sh
root@af48c1a975a2:~/dev/xgcc# nohup bash xgcc_build.sh &
root@af48c1a975a2:~/dev/xgcc# nohup bash xgcc_build_all_binutils.sh &

動作テスト(MIPS向けのアセンブリ出力)

root@af48c1a975a2:~/dev/xgcc#  mkdir test
root@af48c1a975a2:~/dev/xgcc# cd test
root@af48c1a975a2:~/dev/xgcc/test# vi main.c
main.c
#include <stdio.h>
int main(void) {
   printf("Hellow");
   return 0;
}

実行例

root@af48c1a975a2:~/dev/xgcc/test# mips-linux-gnu-gcc -S main.c
root@af48c1a975a2:~/dev/xgcc/test# cat main.s 
    .file   1 "main.c"
    .section .mdebug.abi32
    .previous
    .nan    legacy
    .module fp=32
    .module nooddspreg
    .abicalls
    .text
    .rdata
    .align  2
$LC0:
    .ascii  "Hellow\000"
    .text
    .align  2
    .globl  main
    .set    nomips16
    .set    nomicromips
    .ent    main
    .type   main, @function
main:
    .frame  $fp,32,$31      # vars= 0, regs= 2/0, args= 16, gp= 8
    .mask   0xc0000000,-4
    .fmask  0x00000000,0
    .set    noreorder
    .set    nomacro
    addiu   $sp,$sp,-32
    sw  $31,28($sp)
    sw  $fp,24($sp)
    move    $fp,$sp
    lui $28,%hi(__gnu_local_gp)
    addiu   $28,$28,%lo(__gnu_local_gp)
    .cprestore  16
    lui $2,%hi($LC0)
    addiu   $4,$2,%lo($LC0)
    lw  $2,%call16(printf)($28)
    nop
    move    $25,$2
    .reloc  1f,R_MIPS_JALR,printf
1:  jalr    $25
    nop

    lw  $28,16($fp)
    move    $2,$0
    move    $sp,$fp
    lw  $31,28($sp)
    lw  $fp,24($sp)
    addiu   $sp,$sp,32
    jr  $31
    nop

    .set    macro
    .set    reorder
    .end    main
    .size   main, .-main
    .ident  "GCC: (GNU) 7.3.0"
root@af48c1a975a2:~/dev/xgcc/test# 

Dockerコンテナを停止

exit  # Ubuntuのshellから抜ける
docker stop gcc-ubuntu # コンテナが停止
docker ps -a # 停止確認
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2