读者应该比较了解交叉编译的概念,一般都是在x86平台下使用gcc编译出其它平台的代码,这里我尝试在RISC v平台下编译出可以在x86平台使用的代码。
环境
- 在 x86_64 平台上编译 riscv64-unknown-linux-gnu-gcc 编译器,网上教程很多不再赘述
- 在 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