第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分支是开发分支,不建议直接用于产品。
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 本章小结
这一章我们做了三件事:
- 从官网下载了BusyBox 1.36.1源码
- 配置了ARM交叉编译工具链
- 用默认配置成功编译了BusyBox
说白了,就是搭好了台子。后面我们就可以在这个台子上,开始真正的裁剪实战了。