在Podman容器中构建RISC-V GNU工具链失败求助
构建RISC-V GCC工具链时出现"Killed signal terminated program cc1plus"错误的解决方法
问题描述
尝试在容器中构建riscv32-unknown-elf-gcc工具链,构建过程失败,核心错误为g++: fatal error: Killed signal terminated program cc1plus。
我的ContainerFile
FROM ubuntu:latest RUN apt-get update && apt-get install -y \ build-essential \ curl \ git \ autoconf \ automake \ autotools-dev \ python3 \ libmpc-dev \ libmpfr-dev \ libgmp-dev \ gawk \ bison \ flex \ texinfo \ gperf \ libtool \ patchutils \ bc \ zlib1g-dev \ libexpat-dev \ ninja-build ENV CARGO_HOME /root/.cargo RUN curl https://sh.rustup.rs -sSf | sh -s -- -y ENV PATH=\"/root/.cargo/bin:${PATH}\" RUN rustup target add riscv32i-unknown-none-elf RUN cargo install cargo-binutils && rustup component add llvm-tools-preview WORKDIR /app RUN git clone https://github.com/riscv-collab/riscv-gnu-toolchain.git ENV PATH=\"/opt/riscv/bin:${PATH}\" RUN (cd riscv-gnu-toolchain; ./configure --prefix=/opt/riscv --with-arch=rv32gc --with-abi=ilp32d) RUN (cd riscv-gnu-toolchain; make linux)
构建输出末尾错误日志
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 -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -DHAVE_CONFIG_H -fno-PIE -I. -I. -I../.././gcc/gcc -I../.././gcc/gcc/. -I../.././gcc/gcc/../include -I../.././gcc/gcc/../libcpp/include -I../.././gcc/gcc/../libcody -I../.././gcc/gcc/../libdecnumber -I../.././gcc/gcc/../libdecnumber/dpd -I../libdecnumber -I../.././gcc/gcc/../libbacktrace -o insn-emit-1.o -MT insn-emit-1.o -MMD -MP -MF ./.deps/insn-emit-1.TPo insn-emit-1.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 -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -DHAVE_CONFIG_H -fno-PIE -I. -I. -I../.././gcc/gcc -I../.././gcc/gcc/. -I../.././gcc/gcc/../include -I../.././gcc/gcc/../libcpp/include -I../.././gcc/gcc/../libcody -I../.././gcc/gcc/../libdecnumber -I../.././gcc/gcc/../libdecnumber/dpd -I../libdecnumber -I../.././gcc/gcc/../libbacktrace -o insn-emit-2.o -MT insn-emit-2.o -MMD -MP -MF ./.deps/insn-emit-2.TPo insn-emit-2.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 -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -DHAVE_CONFIG_H -fno-PIE -I. -I. -I../.././gcc/gcc -I../.././gcc/gcc/. -I../.././gcc/gcc/../include -I../.././gcc/gcc/../libcpp/include -I../.././gcc/gcc/../libcody -I../.././gcc/gcc/../libdecnumber -I../.././gcc/gcc/../libdecnumber/dpd -I../libdecnumber -I../.././gcc/gcc/../libbacktrace -o insn-emit-3.o -MT insn-emit-3.o -MMD -MP -MF ./.deps/insn-emit-3.TPo insn-emit-3.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 -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -DHAVE_CONFIG_H -fno-PIE -I. -I. -I../.././gcc/gcc -I../.././gcc/gcc/. -I../.././gcc/gcc/../include -I../.././gcc/gcc/../libcpp/include -I../.././gcc/gcc/../libcody -I../.././gcc/gcc/../libdecnumber -I../.././gcc/gcc/../libdecnumber/dpd -I../libdecnumber -I../.././gcc/gcc/../libbacktrace -o insn-emit-4.o -MT insn-emit-4.o -MMD -MP -MF ./.deps/insn-emit-4.TPo insn-emit-4.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 -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -DHAVE_CONFIG_H -fno-PIE -I. -I. -I../.././gcc/gcc -I../.././gcc/gcc/. -I../.././gcc/gcc/../include -I../.././gcc/gcc/../libcpp/include -I../.././gcc/gcc/../libcody -I../.././gcc/gcc/../libdecnumber -I../.././gcc/gcc/../libdecnumber/dpd -I../libdecnumber -I../.././gcc/gcc/../libbacktrace -o insn-emit-5.o -MT insn-emit-5.o -MMD -MP -MF ./.deps/insn-emit-5.TPo insn-emit-5.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 -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -DHAVE_CONFIG_H -fno-PIE -I. -I. -I../.././gcc/gcc -I../.././gcc/gcc/. -I../.././gcc/gcc/../include -I../.././gcc/gcc/../libcpp/include -I../.././gcc/gcc/../libcody -I../.././gcc/gcc/../libdecnumber -I../.././gcc/gcc/../libdecnumber/dpd -I../libdecnumber -I../.././gcc/gcc/../libbacktrace -o insn-emit-6.o -MT insn-emit-6.o -MMD -MP -MF ./.deps/insn-emit-6.TPo insn-emit-6.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 -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -DHAVE_CONFIG_H -fno-PIE -I. -I. -I../.././gcc/gcc -I../.././gcc/gcc/. -I../.././gcc/gcc/../include -I../.././gcc/gcc/../libcpp/include -I../.././gcc/gcc/../libcody -I../.././gcc/gcc/../libdecnumber -I../.././gcc/gcc/../libdecnumber/dpd -I../libdecnumber -I../.././gcc/gcc/../libbacktrace -o insn-emit-7.o -MT insn-emit-7.o -MMD -MP -MF ./.deps/insn-emit-7.TPo insn-emit-7.cc g++: fatal error: Killed signal terminated program cc1plus compilation terminated. make[2]: *** [Makefile:1198: insn-emit-7.o] Error 1 make[2]: Leaving directory '/app/riscv-gnu-toolchain/build-gcc-linux-stage1/gcc' make[1]: *** [Makefile:4673: all-gcc] Error 2 make[1]: Leaving directory '/app/riscv-gnu-toolchain/build-gcc-linux-stage1' make: *** [Makefile:472: stamps/build-gcc-linux-stage1] Error 2
错误原因
这个错误是容器内存不足导致的。构建GCC工具链属于内存密集型操作,尤其是编译insn-emit-*.cc这类自动生成的大文件时,g++的编译后端cc1plus会占用大量内存。当系统内存耗尽,Linux的OOM Killer(内存不足杀手)会强制终止该进程,从而出现上述错误。
解决方法
1. 增加容器可用内存
- 使用Docker构建时,通过
--memory参数指定更大内存,比如分配4GB:docker build --memory=4g . - 使用Podman构建时同理:
podman build --memory=4g . - 也可以在Docker Desktop的设置中调整默认容器内存上限(建议调到4GB以上)。
2. 限制并行编译线程数
默认make会使用与CPU核心数相同的线程数,这会加剧内存消耗。可以手动指定-j参数减少并行线程,例如用2线程:
修改ContainerFile最后一行:
RUN (cd riscv-gnu-toolchain; make -j2 linux)
或者通过构建参数动态传递:
docker build --build-arg MAKEFLAGS="-j2" .
同时在ContainerFile中接收参数:
ARG MAKEFLAGS="-j$(nproc)" RUN (cd riscv-gnu-toolchain; make $MAKEFLAGS linux)
3. 添加交换分区缓解压力
在容器中创建交换分区,可临时补充内存空间(会降低构建速度,但能解决内存不足问题):
在ContainerFile中添加:
RUN fallocate -l 4G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile
内容的提问来源于stack exchange,提问作者14159
相关产品推荐
相关产品推荐

