Debian无root权限编译安装GCC 11.2.0内部编译错误排查
无root权限编译GCC 11.2.0内存错误排查方案
问题背景
- 操作系统:Debian 3.16.84-1,无root权限,所有自定义软件均从源码编译安装到
$HOME/.local路径 - 现有GCC环境:系统全局预装版本为4.9.2,用户本地此前自编译安装了GCC 8.4.0
- 报错场景:尝试编译安装GCC 11.2.0时,分别使用GCC 8.4.0和系统GCC 4.9.2作为编译工具链,均在编译阶段触发
cc1程序内存崩溃错误
报错信息
使用GCC 8.4.0编译报错
if [ x"-fpic" != x ]; then \ gcc -c -DHAVE_CONFIG_H -g -I. -I../.././libiberty/../include -W -Wall -Wwrite-strings -Wc++-compat -Wstrict-prototypes -pedantic -D_GNU_SOURCE -fpic ../.././libiberty/floatformat.c -o pic/floatformat.o; \ else true; fi *** Error in `/home/user/.local/libexec/gcc/x86_64-pc-linux-gnu/8.4.0/cc1': free(): invalid next size (fast): 0x0000000002a19c70 *** ../.././libiberty/floatformat.c: In function ‘floatformat_to_double’: ../.././libiberty/floatformat.c:547:2: internal compiler error: Aborted dto = ldexp (1.0, exponent); ^~~
使用系统GCC 4.9.2编译报错
if [ x"-fpic" != x ]; then \ gcc -c -DHAVE_CONFIG_H -g -I. -I../.././libiberty/../include -W -Wall -Wwrite-strings -Wc++-compat -Wstrict-prototypes -pedantic -D_GNU_SOURCE -fpic ../.././libiberty/floatformat.c -o pic/floatformat.o; \ else true; fi *** Error in `/usr/lib/gcc/x86_64-linux-gnu/4.9/cc1': free(): invalid next size (fast): 0x0000000003626810 *** *** Error in `/usr/lib/gcc/x86_64-linux-gnu/4.9/cc1': malloc(): memory corruption: 0x0000000003626850 *** gcc: internal compiler error: Aborted (program cc1) Please submit a full bug report, with preprocessed source if appropriate. See <file:///usr/share/doc/gcc-4.9/README.Bugs> for instructions. Makefile:804: recipe for target 'floatformat.o' failed
排查与解决步骤
- 第一步:验证系统资源与硬件
关闭并行编译,使用单线程编译测试:执行make -j1,同时观测编译过程中的内存占用,确认是否存在内存不足的情况。可运行memtester 1G 2测试物理内存是否存在硬件错误,若测试报错需联系服务器管理员处理硬件问题。 - 第二步:消除环境变量冲突
执行unset LD_LIBRARY_PATH C_INCLUDE_PATH CPLUS_INCLUDE_PATH LIBRARY_PATH清空自定义编译相关环境变量,避免$HOME/.local下的旧库和系统库产生符号冲突,之后重新执行configure与编译流程。 - 第三步:确认编译流程正确性
编译GCC不能直接在源码根目录执行操作,必须单独创建构建目录,操作流程如下:
若此前已有编译残留,先清空构建目录所有内容再重新走上述流程。# 解压源码包 tar xf gcc-11.2.0.tar.xz cd gcc-11.2.0 # 下载GCC依赖的gmp、mpfr、mpc等组件 ./contrib/download_prerequisites cd .. # 单独创建构建目录 mkdir gcc-build && cd gcc-build # 配置编译参数,禁用32位支持,指定安装路径 ../gcc-11.2.0/configure --prefix=$HOME/.local --disable-multilib # 单线程编译 make -j1 # 安装到用户目录 make install - 第四步:验证源码完整性
核对GCC 11.2.0源码包的校验值,或重新下载源码包解压后编译,排除源码文件损坏的可能。
临时规避方案
如果自行编译始终无法成功,可使用conda安装预编译的GCC 11.2版本,无需编译即可直接安装到用户目录。
内容的提问来源于stack exchange,提问作者Menacer
相关产品推荐
相关产品推荐

