2016年8月15日月曜日

Ubuntuにクロスコンパイラを構築する方法

ARM用Linuxを構築したいため、Ubuntuにクロスコンパイラを構築する方法をメモっとく。

事前にbuild-essentialtexinfogawkをインストールしておく。

ARM用クロスコンパイラのモジュールのインストール先を$HOME/Programs/armccとするので、ディレクトリと環境変数を作っておく。


$ mkdir -pv $HOME/Programs
$ mkdir -pv $HOME/Programs/armcc
$ export PATH="$HOME/Programs/armcc/bin:$PATH"

binutils-2.25 をビルド
$ wget http://ftp.gnu.org/gnu/binutils/binutils-2.25.tar.bz2
$ tar jxvf binutils-2.25.tar.bz2
$ mkdir -pv binutils-2.25/build
$ cd binutils-2.25/build
$ ../configure --target=arm-linux-gnueabi --prefix=$HOME/Programs/armcc
$ make
$ make install

gcc-4.9.2 をビルド(1回め)
※gmp、mpc、mpfr を一緒にビルドする
$ wget http://ftp.gnu.org/gnu/gcc/gcc-4.9.2/gcc-4.9.2.tar.bz2
$ wget http://ftp.gnu.org/gnu//gmp/gmp-6.0.0a.tar.xz
$ wget http://www.multiprecision.org/mpc/download/mpc-1.0.2.tar.gz
$ wget http://www.mpfr.org/mpfr-3.1.2/mpfr-3.1.2.tar.xz
$ tar jxvf gcc-4.9.2.tar.bz2
$ tar -xf gmp-6.0.0a.tar.xz
$ mv gmp-6.0.0 gcc-4.9.2/gmp
$ tar -xf mpc-1.0.2.tar.gz
$ mv mpc-1.0.2 gcc-4.9.2/mpc
$ tar -xf mpfr-3.1.2.tar.xz
$ mv mpfr-3.1.2 gcc-4.9.2/mpfr
$ mkdir gcc-4.9.2/build1
$ cd gcc-4.9.2/build1
$ ../configure --target=arm-linux-gnueabi --prefix=$HOME/Programs/armcc --with-newlib \
--without-headers --disable-nls --disable-shared --disable-multilib \
--disable-decimal-float --disable-threads --disable-libatomic \
--disable-libgomp --disable-libitm --disable-libquadmath \
--disable-libsanitizer --disable-libssp --disable-libvtv \
--disable-libcilkrts --disable-libstdc++-v3 \
--enable-languages=c,c++
$ make
$ make install

Linux ヘッダインストール
$ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.19.tar.xz
$ tar -xf linux-3.19.tar.xz
$ cd linux-3.19
$ make mrproper
$ make headers_install ARCH=arm CROSS_COMPILE=arm-linux-gnueabi INSTALL_HDR_PATH=$HOME/Programs/armcc/arm-linux-gnueabi

glibc-2.21 のビルド
$ wget http://ftp.gnu.org/gnu/glibc/glibc-2.21.tar.xz
$ tar -xf glibc-2.21.tar.xz
$ mkdir -pv glibc-2.21/build
$ cd glibc-2.21/build
$ ../configure --prefix=$HOME/Programs/armcc/arm-linux-gnueabi \

  --host=arm-linux-gnueabi --build=$(../scripts/config.guess) \
  --disable-profile --enable-kernel=2.6.32 \
  --with-headers=$HOME/Programs/armcc/arm-linux-gnueabi/include \
  libc_cv_forced_unwind=yes \

  libc_cv_ctors_headers=yes \
  libc_cv_c_cleanup=yes
$ make
$ make install

libstdc++ のビルド
$ mkdir -pv gcc-4.9.2/build_libstdcpp
$ cd gcc-4.9.2/build_libstdcpp
$ ../libstdc++-v3/configure --target=arm-linux-gnueabi \
  --prefix=$HOME/Programs/armcc/arm-linux-gnueabi --disable-multilib \
  --disable-shared --disable-nls --disable-libstdcxx-threads \

  --disable-libstdcxx-pch \
  --with-gxx-include-dir=$HOME/Programs/armcc/arm-linux-gnueabi/include/c++/4.9.2
$ make
$ make install

gcc-4.9.2 のビルド(2回め)
$ mkdir -pv gcc-4.9.2/build2
$ cd gcc-4.9.2/build2
$ ../configure --target=arm-linux-gnueabi --prefix=$HOME/Programs/armcc \

  --disable-nls --disable-shared --disable-multilib \
  --disable-libgomp --disable-threads --enable-languages=c,c++ \
  --disable-libstdcxx-pch --disable-bootstrap
$ make
$ make install

gdb-7.11 のビルド
$ wget http://ftp.gnu.org/gnu/gdb/gdb-7.11.tar.xz $ tar -xf gdb-7.11.tar.xz
$ mkdir -pv gdb-7.11/build
$ cd gdb-7.11/build
$ ../configure --target=arm-linux-gnueabi --prefix=$HOME/Programs/armcc
$ make
$ make install

コンパイルテストする。a.c に以下のコードを書く。
#include <stdio.h>

int main()
{
printf("Hello ARM\n");
return 0;
}

ビルドしたクロスコンパイラでa.cをコンパイルする。
$ arm-linux-gnueabi-gcc a.c -o pa

$ arm-linux-gnueabi-readelf -h pra
ELF ヘッダ:
マジック: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
クラス: ELF32
データ: 2 の補数、リトルエンディアン
バージョン: 1 (current)
OS/ABI: UNIX - System V
ABI バージョン: 0
型: EXEC (実行可能ファイル)
マシン: ARM
バージョン: 0x1
エントリポイントアドレス: 0x102c4
プログラムの開始ヘッダ: 52 (バイト)
セクションヘッダ始点: 7520 (バイト)
フラグ: 0x5000202, has entry point, Version5 EABI, soft-float ABI
このヘッダのサイズ: 52 (バイト)
プログラムヘッダサイズ: 32 (バイト)
プログラムヘッダ数: 8
セクションヘッダ: 40 (バイト)
セクションヘッダサイズ: 37
セクションヘッダ文字列表索引: 34

qemu-arm で動かしてみる
$ qemu-arm -L $HOME/Programs/armcc/arm-linux-gnueabi ./pra
Hello ARM

0 件のコメント:

コメントを投稿