ARM(骁龙855)编译x86 openwrt

Viewed 51

环境

宿主机:红米 K20 pro (12+512G)
系统:ubuntu 26
软件:Docker+ubuntu:22.04+大雕/coolsnowwolf/lede.git

结论

  • 可行,成功!
  • 耗时:1个小时50分钟 (上午10:02开始,11:52 完成)
    ( make dirclean && make -j$(nproc) V=s 开始算 )

步骤1.建立镜像

docker build -t lede-builder .

cat Dockerfile

# ============================================================
# LEDE (Lean's OpenWrt) 编译环境
# 宿主机: aarch64  |  目标固件: x86_64
# ============================================================
FROM ubuntu:22.04

LABEL maintainer="lede-builder"
LABEL description="LEDE x86_64 build environment for aarch64 host"

# 避免交互式提示
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai

# 允许 root 用户编译(绕过 autoconf/configure 的 root 检查)
ENV FORCE_UNSAFE_CONFIGURE=1

# ── 基础系统更新 ─────────────────────────────────────────────
RUN apt-get update -y && apt-get full-upgrade -y

# ── 安装编译依赖 ─────────────────────────────────────────────
# 注意:去除了 libc6-dev-i386 / gcc-multilib / g++-multilib
# 这三个包是 x86_64 宿主机专用的 32-bit 支持库,aarch64 上不存在
RUN apt-get install -y --no-install-recommends \
    ack \
    antlr3 \
    asciidoc \
    autoconf \
    automake \
    autopoint \
    binutils \
    bison \
    build-essential \
    bzip2 \
    ca-certificates \
    ccache \
    clang \
    cmake \
    cpio \
    curl \
    device-tree-compiler \
    flex \
    gawk \
    genisoimage \
    gettext \
    git \
    gperf \
    haveged \
    help2man \
    intltool \
    libelf-dev \
    libfuse-dev \
    libglib2.0-dev \
    libgmp3-dev \
    libltdl-dev \
    libmpc-dev \
    libmpfr-dev \
    libncurses5-dev \
    libncursesw5-dev \
    libpython3-dev \
    libreadline-dev \
    libssl-dev \
    libtool \
    llvm \
    lrzsz \
    msmtp \
    ninja-build \
    p7zip \
    p7zip-full \
    patch \
    pkgconf \
    python3 \
    python3-pyelftools \
    python3-setuptools \
    qemu-utils \
    rsync \
    scons \
    squashfs-tools \
    subversion \
    swig \
    texinfo \
    uglifyjs \
    unzip \
    upx-ucl \
    vim \
    wget \
    xmlto \
    xxd \
    zlib1g-dev \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*

# ── 使用 root,无需创建额外用户 ──────────────────────────────
WORKDIR /root

# ── 克隆 LEDE 源码 ───────────────────────────────────────────
RUN git clone --depth=1 https://github.com/coolsnowwolf/lede.git /root/lede

WORKDIR /root/lede

# ── 更新 feeds ───────────────────────────────────────────────
RUN ./scripts/feeds update -a \
 && ./scripts/feeds install -a

# ── 写入 x86_64 默认配置 ─────────────────────────────────────
RUN echo "CONFIG_TARGET_x86=y"                   >  .config \
 && echo "CONFIG_TARGET_x86_64=y"                >> .config \
 && echo "CONFIG_TARGET_x86_64_DEVICE_generic=y" >> .config \
 && make defconfig

# ── 预下载 dl 依赖包(可选,网络慢时建议开启)─────────────────
# RUN make download -j8 V=s

# ── 编译入口 ─────────────────────────────────────────────────
CMD ["/bin/bash"]

启动容器

docker run -it \
  -v $(pwd)/output:/root/lede/bin \
  --name lede \
  lede-builder

步骤2.进入容器后编译

## 进入容器
docker -exec -it lede /bin/bash

# 如果需要自定义配置(交互式菜单)
make menuconfig

# 下载依赖
make download -j8

# 编译(第一次推荐单线程)
make -j1 V=s

# 后续编译可多线程
make -j$(nproc) V=s

清空编译的内容重来

# 清理所有编译产物(保留源码和配置)
make clean

# 如果要连工具链也一起清掉(完全重来,耗时最长)
make dirclean
1 Answers

但是在编译过程中遇到了非常多问题,我解决了一两个,由于水平实在有限,还是不能编译出包。

编译ucl的时候,提示无法获取到系统架构,这个问题百度了一下解决了,需要在./configure 后加 --build=arm-linux,我的方法是修改tools/ucl/Makefile 中./configure一行。
编译到qemu时,提示 Unsupported CPU = aarch64 。我查了很多,qemu最新的源码可以在arm下编译成功,故替换feeds/packages/utils/qemu 到tools/qemu

编译到golang

提示Makefile:380: *** go-bootstrap cannot be installed on linux/arm64. Stop.

解决方法为apt install golang-go,然后配置文件修改languages-go-configation-external bootstrap go root directroy ,添加/usr/local/go,或者安装后直接编辑config,找到并修改CONFIG_GOLANG_EXTERNAL_BOOTSTRAP_ROOT="/usr/bin/go"

编译node时

提示 cc1:error:unrecognized command line option "-m64"

makefile 的109行--dest-cpu=$(NODEJS_CPU) \ 换成--dest-cpu=arm64
naiveproxy报错,删除lean/feeds/helloworld/naiveproxy/src/init_env.sh 的22行: [ "$(uname)" != "Linux" -o "$(uname -m)" != "x86_64" ] && { echo -e "Support Linux AMD64 only."; exit 1; };最新版naiveproxy-92.0.4515.107-1删除这项已经没有用了,仍旧报错:
( cd "/home/123/lede/build_dir/target-x86_64_musl/naiveproxy-92.0.4515.107-1/src" ; . ../init_env.sh "x86_64" "" "" "/home/123/lede/staging_dir/toolchain-x86_64_gcc-8.4.0_musl" ; export naive_flags+=" ${naive_ccache_flags}" ; mkdir -p "out" ; ./gn/out/gn gen "out/Release" --args="${naive_flags}" --script-executable="python" ; )
bash: ./gn/out/gn: cannot execute binary file: Exec format error