You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:47:01