交叉编译之为RISC v平台编译x86的gcc

发布时间 2023-06-13 20:53:14作者: LightningStar

读者应该比较了解交叉编译的概念,一般都是在x86平台下使用gcc编译出其它平台的代码,这里我尝试在RISC v平台下编译出可以在x86平台使用的代码。

环境

  1. 在 x86_64 平台上编译 riscv64-unknown-linux-gnu-gcc 编译器,网上教程很多不再赘述
  2. 在 x86_64 平台上使用 riscv64-unknown-linux-gnu-gcc 编译出能够在RISC v平台上使用的 x86_64 gcc
    本文默认第一步已经完成,只介绍第二步。

一些软件环境:根据实际情况去安装,我这里只需要安装下面这些软件

apt-get install gcc-multilib g++-multilib

下载源码

根据 https://gcc.gnu.org/install/prerequisites.html 中的说明下载对应版本的MPFR\MPC\ISL\GMP源码和gcc的源码。

wget https://ftp.gnu.org/gnu/mpc/mpc-1.0.1.tar.gz
wget https://ftp.gnu.org/gnu/gmp/gmp-4.3.2.tar.gz
wget https://ftp.gnu.org/gnu/mpfr/mpfr-3.1.0.tar.xz
wget https://gcc.gnu.org/pub/gcc/infrastructure/isl-0.15.tar.bz2

假设gcc的源码位于GCCSRC=/root/gcc-build/gcc-releases-gcc-12.2.0,那么请把上述下载的lib的源码放置于$GCCSRC/mpfr, $GCCSRC/mpc .......

创建编译gcc的文件夹:GCCBUILD=/root/gcc-build/build, 安装文件夹GCCINSTALL=/root/gcc-build/_install

准备环境变量:

export ARCH=riscv
export CROSS_COMPILE=riscv64-unknown-linux-gnu-
export GCCINSTALL=/root/gcc-build/_install
export GCCBUILD=/root/gcc-build/build
export GCCSRC=/root/gcc-build/gcc-releases-gcc-10.4.0
export HOST=riscv64-unknown-linux-gnu
export PROGRAM_PREFIX=x86_64-linux-gnu-

编译

cd $GCCBUILD

$GCCSRC/configure --build=$BUILD --host=$HOST --target=$TARGET \
    -with-sysroot=$SYSROOT --prefix=$GCCINSTALL \
    --program-prefix=$PROGRAM_PREFIX --enable-checking=release \
    --enable-languages=c,c++ --enable-threads=posix  \
    --enable-shared --enable-tls --disable-libmudflap \
    --disable-libssp --disable-libquadmath --disable-libsanitizer \
    --disable-nls --disable-bootstrap --enable-multiarch --disable-werror \
    --with-arch-32=i686 --with-abi=m64 \
    --with-mulilib-list=m32,m64.mx32 --enable-multilib

make -j16

全部代码

export GCCINSTALL=/root/gcc-build/_install
export GCCBUILD=/root/gcc-build/build
export GCCSRC=/root/gcc-build/gcc-releases-gcc-9.4.0
export BUILD=x86_64-linux-gnu
export HOST=riscv64-unknown-linux-gnu
export TARGET=x86_64-linux-gnu
export PROGRAM_PREFIX=x86_64-linux-gnu-
export SYSROOT=/opt/riscv-gnu-toolchain/sysroot

cd $GCCBUILD

$GCCSRC/configure --build=$BUILD --host=$HOST --target=$TARGET \
    -with-sysroot=$SYSROOT --prefix=$GCCINSTALL \
    --program-prefix=$PROGRAM_PREFIX --enable-checking=release \
    --enable-languages=c,c++ --enable-threads=posix  \
    --enable-shared --enable-tls --disable-libmudflap \
    --disable-libssp --disable-libquadmath --disable-libsanitizer \
    --disable-nls --disable-bootstrap --enable-multiarch --disable-werror \
    --with-arch-32=i686 --with-abi=m64 \
    --with-mulilib-list=m32,m64.mx32 --enable-multilib

make -j64

参考文献

insall gcc
编译工具链