第2章:源码获取与编译环境搭建

好,咱们正式开始动手了。

上一章我们聊了BusyBox能干什么,这一章就来点实在的——下载源码、配好工具链、然后跑通第一次编译。

这一步其实不难,但很多人栽在细节上。我见过不少新手,源码下了半天,编译报错一脸懵,最后发现是工具链版本不对。嗯,咱们今天就把它捋清楚。

2.1 获取BusyBox源码

源码获取,说白了就两种方式:

  • 从官网下载稳定版
  • 从Git仓库拉取最新代码

我个人习惯用稳定版。为什么?因为生产环境求稳,最新代码可能藏着坑。我在项目中遇到过,拉了个开发版,编译通过但运行起来莫名其妙死机,查了半天是某个新特性没稳定。

方式一:官网下载

BusyBox官网是 https://busybox.net/。进去后点"Download",找到你想要的版本。

举个例子,下载1.36.1版本:

wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -xjf busybox-1.36.1.tar.bz2
cd busybox-1.36.1/

解压完,你会看到一堆目录和文件。别慌,核心就几个:Makefile、Config.in、applets/、libbb/。后面我们会慢慢拆解。

方式二:Git拉取

如果你想尝鲜,或者需要某个特定commit的补丁:

git clone git://busybox.net/busybox.git
cd busybox
git checkout 1_36_1  # 切到稳定tag

注意,Git仓库的master分支是开发分支,不建议直接用于产品。

我的小建议: 第一次学习,用稳定版就好。1.36.x系列比较成熟,网上资料也多,遇到问题好查。

2.2 配置交叉编译工具链

这一步是重中之重。你想想看,你的PC是x86架构,但嵌入式设备通常是ARM、MIPS、RISC-V。你得用交叉编译器,在PC上编译出能在目标板上运行的二进制。

2.2.1 工具链的选择

常见的交叉编译工具链有:

工具链 适用场景 我的评价
arm-linux-gnueabihf- ARM Cortex-A系列,带硬浮点 最常用,资料多
aarch64-linux-gnu- ARM 64位(如树莓派3B+以上) 现在越来越主流
mipsel-linux-gnu- MIPS小端架构 老设备还在用
riscv64-linux-gnu- RISC-V 64位 新兴架构,我最近在玩

怎么选?看你的目标板CPU。比如我用的是ARM Cortex-A7,那就选arm-linux-gnueabihf-。

2.2.2 安装工具链

我推荐用Linaro提供的预编译工具链,省心。以ARM 32位为例:

wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
tar -xf gcc-linaro-*.tar.xz
sudo mv gcc-linaro-* /opt/toolchains/arm-linux-gnueabihf

然后配置环境变量:

export PATH=/opt/toolchains/arm-linux-gnueabihf/bin:$PATH
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-

验证一下:

arm-linux-gnueabihf-gcc --version

如果看到版本信息,说明工具链装好了。

注意: 环境变量只在当前终端有效。建议写到 ~/.bashrc 里,省得每次都要export。我曾经忘了这茬,换了终端编译报错,排查了半天才发现是环境变量没加载。

2.3 首次编译验证

工具链配好了,源码也下了,咱们来跑第一次编译。

2.3.1 配置BusyBox

BusyBox的配置方式和Linux内核很像,基于Kconfig。运行:

make defconfig

这会生成一个默认配置,包含了大部分常用命令。对于第一次编译,用默认配置就够了。

如果你想定制,可以运行:

make menuconfig

这会打开一个图形化界面,你可以勾选或取消勾选具体命令。不过第一次,咱们先别折腾,直接默认配置走一遍。

2.3.2 开始编译

make -j$(nproc)

-j$(nproc) 表示用所有CPU核心并行编译,速度会快很多。我第一次编译时,单核跑了快10分钟,后来发现加-j4只要2分钟……嗯,这坑我踩过。

编译完成后,你会看到:

LINK    busybox
...
BusyBox v1.36.1 (2024-01-01 12:00:00 CST) multi-call binary.

这说明编译成功了。当前目录下会生成一个busybox可执行文件。

2.3.3 验证编译结果

检查一下文件信息:

file busybox

输出类似:

busybox: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, stripped

看到ARM字样了吗?这说明我们交叉编译成功了——在x86的PC上,生成了ARM架构的可执行文件。

再查看一下大小:

ls -lh busybox

默认配置下,动态链接的BusyBox大概700KB左右。如果静态链接,会更大一些,但部署更方便。

关键点: 第一次编译的目标不是得到一个能用的系统,而是验证整个工具链是否通畅。只要编译通过,后面裁剪、定制才有基础。

2.4 常见问题与避坑

我整理了几个新手最容易遇到的问题:

  • 编译报错"arm-linux-gnueabihf-gcc: command not found" —— 工具链没加到PATH里,或者没安装。检查一下echo $PATH。
  • 编译报错"undefined reference to ..." —— 通常是库文件缺失。检查你的工具链是否完整,或者试试静态编译。
  • 编译通过但运行报错"FATAL: kernel too old" —— 目标板内核版本太老,BusyBox编译时用了较新的内核头文件。可以在menuconfig里降低内核版本要求。

我曾经在一个MIPS项目上,编译了三天都报错,最后发现是工具链的glibc版本和内核头文件不匹配。从那以后,我每次都会先确认工具链的内核头文件版本是否和目标板匹配。

2.5 本章小结

这一章我们做了三件事:

  1. 从官网下载了BusyBox 1.36.1源码
  2. 配置了ARM交叉编译工具链
  3. 用默认配置成功编译了BusyBox

说白了,就是搭好了台子。后面我们就可以在这个台子上,开始真正的裁剪实战了。

额外提醒: 如果你用的是Windows,建议装个WSL或者虚拟机跑Ubuntu。交叉编译在Linux环境下最顺手,Windows上折腾起来太痛苦——我早期试过Cygwin,编译速度慢不说,还经常出莫名其妙的问题。
第2章 知识体系结构图 源码获取 官网下载 / Git拉取 工具链配置 选择 / 安装 / 环境变量 首次编译 defconfig → make → 验证 稳定版:busybox-1.36.1.tar.bz2 开发版:git clone + checkout tag 选择:arm / aarch64 / mips / riscv 安装:Linaro预编译工具链 配置:export PATH / ARCH / CROSS_COMPILE make defconfig(默认配置) make -j$(nproc)(并行编译) file busybox 验证架构 目标:验证工具链通畅,为裁剪打基础 常见问题:工具链未找到 / 库缺失 / 内核版本不匹配 避坑:先确认工具链内核头文件版本是否匹配目标板
可可精品资料库