编译RISC-V架构GCC编译器报错,寻求问题排查方案
编译RISC-V目标GCC时的汇编器标志错误及后续问题
编译环境与配置
主机无网络,已本地编译好GCC依赖库,自定义CPP_FLAGS修改时钟设置,环境变量如下:
PREFIX=/nobackup/builddir CPP_FLAGS="-D_GLIBCXX_USE_CLOCK_MONOTONIC=1 -D_GLIBCXX_USE_CLOCK_REALTIME=1 LD_LIBRARY_PATH=$PREFIX/mpc/lib:$PREFIX/mpfr/lib:$PREFIX/gmp/lib:$PREFIX/isl/lib C_INCLUDE_PATH=$PREFIX/mpc/include:$PREFIX/mpfr/include:$PREFIX/gmp/include:$PREFIX/isl/include
configure命令:
../gcc-13.2.0/configure --target=riscv64-unknown-elf --with-gmp=$PREFIX/gmp --with-mpfr=$PREFIX/mpfr --with-mpc=$PREFIX/mpc --with-isl=$PREFIX/isl --disable-shared --enable-static --disable-multilib --prefix=$PREFIX/riscv64-unknown-elf --enable-languages=all
编译错误情况
configure执行无报错,但make接近完成时出现汇编器错误:
/nobackup/builddir/build/./gcc/as: 114: exec: -march=rv64imafdc_zicsr: not found ../../gcc-13.2.0/gcc/m2/Make-lang.in:1586: recipe for target '/nobackup/builddir/build/gcc/m2/gm2-libs-corou tines/SYSTEM.def' failed make[2]: *** [/nobackup/builddir/build/gcc/m2/gm2-libs-coroutines/SYSTEM.def] Error 1 /nobackup/builddir/build/./gcc/as: 114: exec: -march=rv64imafdc_zicsr: not found ../../gcc-13.2.0/gcc/m2/Make-lang.in:1568: recipe for target '/nobackup/builddir/build/gcc/m2/gm2-libs/SYSTEM .def' failed make[2]: *** [/nobackup/builddir/build/gcc/m2/gm2-libs/SYSTEM.def] Error 1 rm m2/gm2-compiler-boot/P0SyntaxCheck.mod m2/gm2-compiler-boot/PCBuild.mod gccgo.pod gforttran.pod gcc.pod m2/gm2-compiler-boot/P1Build.mod m2/gm2-compiler-boot/P2Build.mod m2/gm2-compiler-boot/P3Build.mod m2/gm2-compiler-boot/PHBuild.mod make[2]: Leaving directory '/nobackup/builddir/build/gcc' Makefile:4619: recipe for target 'all-gcc' failed make[1]: *** [all-gcc] Error 2 make[1]: Leaving directory '/nobackup/builddir/build' Makefile:1036: recipe for target 'all' failed
改用单线程编译后出现新错误:
Makefile:1157: update target 'gcc-main.o' due to ../../gcc-13.2.0/gcc/gcc-main.cc g++ -fno-PIE -c -g -O2 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing-Wwrite-strings -Wcast-qual -Wmissing-format-attribute -Wconditionally-supported ... -DHAVE_CONFIG_H -I. -I. -I../../gcc-13.2.0/gcc -I../../gcc-13.2.0/gcc/. -I../../gcc-13.2.0/gcc/. -I../../gcc-13.2.0/gcc/../include -I../../gcc-13.2.0/gcc/../libcpp/include -I../../gcc-13.2.0/gcc/../libcody -I/nobackup/builddir/gmp/include -I/nobackup/builddir/mpfr/include -I/nobackup/builddir/mpc/include -I../../gcc-13.2.0/gcc/../libdecnumber -I../../gcc-13.2.0/gcc/../libdecnumber/dpd -I../libdecnumber -I../../gcc-13.2.0/gcc/../libbacktrace -I/nobackup/builddir/isl/include -D_GLIBCXX_USE_CLOCK_MONOTONIC=1 -D_GLIBCXX_USE_CLOCK_REALTIME=1 -o gcc-main.o -MT gcc-main.o -MMD -MP -MF ./.deps/gcc-main.TPo ../../gcc-13.2.0/gcc/gcc-main.cc mv ./.deps/gcc-main.TPo ./.deps/gcc-main.Po ../../gcc-13.2.0/gcc/m2/Make-lang.in:1542: target 'm2/gm2config.aci' does not exist NEW_SRCDIR=`../../gcc-13.2.0/gcc/m2/tools-src/calcpath ../ ../../gcc-13.2.0/gcc m2` ; \ export NEW_SRCDIR ; \ cd m2 ; \ if echo -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE | grep \\\-DCROSS_DIRECTORY_STRUCTURE; then \ AR= ; \ export AR ; \ RANLIB ; \ exprot RANLIB ; \ /bin/bash -c '${NEW_SRCDIR}/configure --srcdir=${NEW_SRCDIR} \ --target=riscv64-unknown-elf --program-suffix= \ --includedir=`echo /nobackup/builddir/riscv64-unknown-elf/lib/gcc/riscv64-unknown -elf/13.2.0/../../../../riscv64-unknown-elf/sys-include | sed -e :a -e 's,[^/]*/\\.\\./,,' -e ta` --libdir=/nobackup/builddir/riscv64-unknown-elf/lib \ --libexecdir=/nobackup/builddir/riscv64-unknown-elf/libexec' ; \ else \ /bin/bash -c '${NEW_SRCDIR}/configure --srcdir= \ --target=riscv64-unknown-elf --program-suffix=' ; \ fi /nobackup/builddir/build/gcc/m2 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE /bin/bash: /nobackup/builddir/build/gcc/m2: Is a directory ../../gcc-13.2.0/gcc/m2/Make-lang.in:1542: recipe for target 'm2/gm2config.aci' failed make[2]: *** [m2/gm2config.aci] Error 126
疑问:编译GCC不需要手动提供-march标志,是否遗漏了什么配置?
解决方案
1. 修复环境变量配置错误
第一个错误的本质是GCC调用汇编器时,把架构标志当成了可执行文件路径,根源是你设置的CPP_FLAGS未正确闭合引号,导致LD_LIBRARY_PATH和C_INCLUDE_PATH被误纳入CPP_FLAGS参数,引发解析混乱。正确的环境变量设置应该是:
PREFIX=/nobackup/builddir export CPP_FLAGS="-D_GLIBCXX_USE_CLOCK_MONOTONIC=1 -D_GLIBCXX_USE_CLOCK_REALTIME=1" export LD_LIBRARY_PATH="$PREFIX/mpc/lib:$PREFIX/mpfr/lib:$PREFIX/gmp/lib:$PREFIX/isl/lib" export C_INCLUDE_PATH="$PREFIX/mpc/include:$PREFIX/mpfr/include:$PREFIX/gmp/include:$PREFIX/isl/include"
每个变量单独定义并export,确保引号完全闭合,避免参数串扰。
2. 缩小编译语言范围
错误集中在Modula-2语言模块(gm2相关),如果你不需要该语言支持,可在configure时指定实际需要的语言,跳过该模块编译:
../gcc-13.2.0/configure --target=riscv64-unknown-elf --with-gmp=$PREFIX/gmp \ --with-mpfr=$PREFIX/mpfr --with-mpc=$PREFIX/mpc --with-isl=$PREFIX/isl --disable-shared --enable-static \ --disable-multilib --prefix=$PREFIX/riscv64-unknown-elf --enable-languages=c,c++,fortran
3. 清理重建编译环境
- 删除现有build目录,创建全新的空build目录
- 重新设置正确的环境变量
- 重新运行configure和make命令
4. 单线程编译错误的说明
单线程时出现的目录调用错误,同样是环境变量解析混乱+Modula-2模块配置脚本问题导致,按照上述步骤处理后即可解决。
内容的提问来源于stack exchange,提问作者prz
相关产品推荐
相关产品推荐

