2、编译环境搭建:交叉编译工具链配置、Kconfig与Makefile基础、BusyBox源码获取与解压
好,咱们正式开始动手了。这一章要解决的是「工欲善其事,必先利其器」的问题。说白了,就是把你电脑变成一个能编译嵌入式Linux的专用工作站。我见过太多新手卡在这一步,工具链没配好,后面全是白费功夫。
2.1 交叉编译工具链:为什么非得用这个?
你想想看,咱们的PC是x86架构,而目标板子通常是ARM、MIPS或者RISC-V。PC上编译出来的程序,板子根本跑不了。交叉编译工具链,就是一套能在PC上生成目标架构机器码的工具集。
我个人习惯用Linaro GCC或者Buildroot生成的工具链。如果你用的是ARM Cortex-A系列,直接去Linaro官网下载预编译版本就行。
核心组件一览:
arm-linux-gnueabihf-gcc—— C编译器arm-linux-gnueabihf-ld—— 链接器arm-linux-gnueabihf-objcopy—— 二进制格式转换arm-linux-gnueabihf-strip—— 符号表剥离(裁剪利器)
我在项目中遇到过一个问题:下载了工具链,解压后直接扔到/usr/local/arm,结果编译时报错说找不到库。后来才发现,必须把工具链的bin目录加到PATH环境变量里。
# 解压工具链
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
sudo mv gcc-linaro-* /opt/arm-toolchain
# 配置环境变量(建议写到 ~/.bashrc 里)
export PATH=/opt/arm-toolchain/bin:$PATH
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
注意:交叉编译工具链的版本要和内核版本匹配。我曾经用gcc 9.x编译Linux 4.9的内核,结果一堆语法错误。后来换成gcc 7.5,一次通过。血的教训。
2.2 Kconfig与Makefile:BusyBox的配置骨架
BusyBox的配置系统,说白了就是Linux内核配置系统的简化版。它用Kconfig定义菜单选项,用Makefile实现编译逻辑。你不需要精通,但得知道怎么改。
2.2.1 Kconfig 基础
Kconfig文件定义了哪些功能可以开关。比如你想裁剪掉ping命令,就在Kconfig里找到对应的配置项。
# 摘自 busybox/networking/Config.in
config PING
bool "ping"
default y
help
ping sends ICMP ECHO_REQUEST packets to network hosts.
这里bool表示开关,default y表示默认开启。如果你想默认关闭,改成default n就行。
我的小技巧:在裁剪时,先把所有功能都关掉,然后按需打开。这样能最大程度减小体积。我做过一个项目,从1.2MB裁到280KB,就是这么干的。
2.2.2 Makefile 基础
BusyBox的Makefile结构清晰。每个子目录都有一个Makefile,负责编译该目录下的源文件。
# 摘自 busybox/networking/Makefile
obj-$(CONFIG_PING) += ping.o
obj-$(CONFIG_PING6) += ping6.o
当CONFIG_PING被设置为y时,ping.o就会被编译进BusyBox。如果设置为空,就跳过。
嗯,这里要注意:依赖关系。有些命令依赖其他库,比如wget依赖tls支持。裁剪时如果只关掉wget而没关tls,编译会报错。
2.3 BusyBox源码获取与解压
获取源码很简单,去官网或者GitHub拉取就行。我建议用稳定版,别追新。1.36.1这个版本我用了两年,很稳。
# 方式一:wget 下载
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
# 方式二:git 克隆(适合想跟踪最新代码的)
git clone git://busybox.net/busybox.git
解压命令也很常规:
tar -xjf busybox-1.36.1.tar.bz2
cd busybox-1.36.1
解压后,目录结构是这样的:
| 目录/文件 | 说明 |
|---|---|
applets/ |
主入口文件,包含main()函数 |
networking/ |
网络相关命令(ping、wget、telnet等) |
coreutils/ |
核心工具(cat、ls、cp、mv等) |
shell/ |
Shell实现(ash、hush等) |
Config.in |
顶层Kconfig配置文件 |
Makefile |
顶层Makefile |
快速验证:解压后先执行make defconfig,生成默认配置。然后执行make menuconfig,如果能弹出图形界面,说明环境没问题。
2.4 知识体系结构图
下面这张图,把本章的核心逻辑串起来了。你一看就明白:
这张图展示了从工具链配置到源码获取,再到配置裁剪的完整链路。你照着这个流程走,基本不会出大问题。
2.5 常见问题与避坑
- 问题1:执行
make menuconfig报错ncurses not found。解决:sudo apt install libncurses5-dev。 - 问题2:交叉编译时提示
cannot find -lc。解决:检查工具链路径是否正确,或者重新解压工具链。 - 问题3:编译出来的BusyBox在板子上运行报
Segmentation fault。解决:大概率是工具链版本和内核不匹配,换一个版本试试。
我的经验:每次修改配置后,先执行make clean再重新编译。别偷懒,否则可能遇到莫名其妙的链接错误。我曾经因为没clean,排查了整整一个下午,最后发现是旧的目标文件在作祟。
好了,环境搭建就到这里。记住一句话:环境配得好,编译没烦恼。下一章咱们开始真正的裁剪实战。