Ubuntu 20.04下安装R 4.0.5的R包时触发gcc内部编译器段错误
环境与异常概况
- 系统为Ubuntu 20.04.2 LTS,已安装R 4.0.5(2021-03-31发布版本),R本身运行状态无异常
- 异常表现:无编译依赖的R包(如
R.matlab)可正常安装,涉及C源码编译的包在安装过程中触发gcc内部段错误,无法完成编译流程
典型报错日志
安装data.table时报错
* installing *source* package ‘data.table’ ... ** package ‘data.table’ successfully unpacked and MD5 sums checked ** using staged installation gcc -std=gnu99 9.3.0 zlib 1.2.11 is available ok R CMD SHLIB supports OpenMP without any extra hint ** libs gcc -std=gnu99 -I"/usr/share/R/include" -DNDEBUG -fopenmp -fpic -g -O2 -fdebug-prefix-map=/build/r-base-tRgc13/r-base-4.0.5=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c assign.c -o assign.o during GIMPLE pass: ccp assign.c: In function ‘memrecycle’: assign.c:1205:1: internal compiler error: Segmentation fault 1205 | } | ^ Please submit a full bug report, with preprocessed source if appropriate. See <file:///usr/share/doc/gcc-9/README.Bugs> for instructions. make: *** [/usr/lib/R/etc/Makeconf:172: assign.o] Error 1 ERROR: compilation failed for package ‘data.table’
安装xfun时报错(截断版本)
gcc -std=gnu99 -I"/usr/share/R/include" -DNDEBUG -fpic -g -O2 -fdebug-prefix-map=/build/r-base-tRgc13/r-base-4.0.5=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c base64.c -o base64.o during GIMPLE pass: ccp base64.c: In function ‘base64_decode_impl’: base64.c:237:1: internal compiler error: Segmentation fault 237 | } | ^
已完成的排查操作
- 重装gcc-9,故障未消除
- 排查R会话中的
Sys.getenv("PATH")发现原路径包含miniconda3安装目录,手动将PATH调整为/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/lib/rstudio/bin/postback,故障未消除
可落地的解决方案
升级gcc-9到补丁版本(根本解决方法)
当前Ubuntu 20.04仓库中原生的gcc-9.3.0存在已知编译缺陷:在GIMPLE优化的ccp阶段处理部分代码时会触发内存越界,导致编译器自身段错误。执行系统命令安装仓库内最新的gcc-9补丁版本即可修复该问题:sudo apt update sudo apt upgrade gcc-9 g++-9补丁版本已修复ccp pass阶段的内存访问错误,可正常完成-O2等级的代码编译。
临时调整编译优化等级绕过缺陷
如果暂时无法升级gcc版本,可修改R的编译配置,将默认的-O2优化等级调整为-O1,跳过触发bug的优化流程。在R会话中执行以下命令生成用户级的R编译配置文件,永久生效:# 生成配置目录(不存在则自动创建) config_dir <- file.path(Sys.getenv("HOME"), ".R") dir.create(config_dir, showWarnings = FALSE, recursive = TRUE) config_file <- file.path(config_dir, "Makevars") # 写入编译参数,将-O2替换为-O1 writeLines( c( "CFLAGS = -O1 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2", "CXXFLAGS = -O1 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2" ), con = config_file )配置完成后重新安装失败的R包,即可正常完成编译。
彻底清理miniconda的环境残留
手动修改PATH无法完全清除miniconda对编译流程的干扰:miniconda会向环境中注入自定义的编译参数、动态库路径变量,即使从PATH中移除conda路径,残留的环境变量仍可能影响编译流程。启动R安装包前,先在终端执行以下命令彻底清理conda相关环境:# 退出当前激活的conda环境 conda deactivate # 清空所有conda相关的环境变量 unset CONDA_PREFIX CONDA_DEFAULT_ENV CONDA_PYTHON_EXE CONDA_SHLVL # 启动R后再执行包安装操作 R
内容的提问来源于stack exchange,提问作者Mazin Abdelghany
相关产品推荐
相关产品推荐

