MacでクロスコンパイラのGCCをビルドする

  • 0
    Like
  • 0
    Comment

    動機

    自作OSの独自の実行形式をサポートするためにリンカスクリプトを作成する必要があったが、MacのデフォルトのGCC(clang)・ldは、リンカスクリプト指定オプション-Tを受け付けていなかった。そこで、リンカスクリプトを受け付けてくれるクロスコンパイラのGCCをビルドしてみることにした。

    環境

    Max OS X El Capitan(10.11.2)
    macOS Sierra(10.12.3)

    手順

    # GMP、MPFR、MPC をインストール
    brew install gmp
    brew install mpfr
    brew install libmpc
    
    # MacデフォルトのGCC(clang)によるビルドはサポートされてないらしいので、非LLVMなGCCをインストールする
    brew install gcc
    
    # 環境変数の設定
    export CC=/usr/local/bin/gcc-5 # ↑の手順でinstallしたGCCのパス
    export LD=/usr/local/bin/gcc-5
    
    export PREFIX="/usr/local/i386elfgcc"
    export TARGET=i386-elf
    export PATH="$PREFIX/bin:$PATH"
    
    # binutilsのインストール
    mkdir /tmp/src
    cd /tmp/src
    curl -O http://ftp.gnu.org/gnu/binutils/binutils-2.28.tar.gz
    tar xf binutils-2.28.tar.gz
    mkdir binutils-build
    cd binutils-build
    ../binutils-2.28/configure --target=$TARGET --enable-interwork --enable-multilib --disable-nls --disable-werror --prefix=$PREFIX 2>&1 | tee configure.log
    sudo make all install 2>&1 | tee make.log
    
    # OSXデフォルトのlibiconvは古すぎてGCCのビルドでこけたので、最新版をインストールする
    cd /tmp/src
    curl -O https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz
    tar xf libiconv-1.15.tar.gz
    cd libiconv-1.15
    ./configure -prefix=/usr/local
    make
    make install
    
    # クロスコンパイラなGCCをビルド
    # バージョンは特にこだわりがなかったので、homebrewで入れたGCCのバージョンに合わせた
    cd /tmp/src
    curl -O https://ftp.gnu.org/gnu/gcc/gcc-5.3.0/gcc-5.3.0.tar.bz2
    tar xf gcc-5.3.0.tar.bz2
    mkdir gcc-build
    cd gcc-build
    ../gcc-5.3.0/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --disable-libssp --enable-languages=c --without-headers --with-gmp=/usr/local --with-mpfr=/usr/local --with-mpfr=/usr/local --with-libiconv-prefix=/usr/local
    make all-gcc 
    make all-target-libgcc 
    sudo make install-gcc 
    sudo make install-target-libgcc
    
    # /usr/local/i386elfgcc/bin配下にGCCがインストールされている
    # 念のためバージョン確認
    /usr/local/i386elfgcc/bin/i386-elf-gcc -v
    

    これでGCCに-Tオプションを渡せるようになった。

    参考

    http://stackoverflow.com/questions/25634708/gnu-linker-equivalent-command-in-os-x
    http://wiki.osdev.org/GCC_Cross-Compiler#OS_X_Users
    http://lv4.hateblo.jp/entry/20130704/1372943744