3、获取源码:从ARM官网下载GCC源码、从kernel.org下载Linux内核源码、从sourceware.org下载binutils和glibc源码
好,源码获取这一步,说白了就是去官方仓库“提货”。
我个人习惯把源码下载看作整个工具链搭建的基石。你想想看,如果地基都不稳,后面编译出问题你都不知道该怪谁。我见过太多新手随便找个第三方打包的源码,结果编译到一半报错,排查半天发现是源码被改过——嗯,这种坑我踩过不止一次。
3.1 下载GCC源码:从ARM官网出发
GCC是编译器的大脑。我们要交叉编译,就得用ARM版本的GCC。
为什么不去GCC官网?因为ARM官网提供的版本是专门针对ARM架构优化过的,打好了补丁。我在项目中试过直接用GNU官方的GCC源码,结果编译出来的程序在ARM板子上跑起来总有点小毛病。后来换成ARM官网的版本,问题就消失了。
下载地址:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain
具体操作步骤:
- 打开ARM官网的GNU Toolchain页面
- 选择对应架构的版本(比如aarch64或arm32)
- 找到源码包(通常以
.tar.xz结尾) - 用wget或curl下载
# 以ARM64为例,下载GCC 12.2版本
wget https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz
小技巧:我个人习惯把下载的源码统一放在/opt/toolchain/src/目录下,方便管理。你可以在家目录下建个src文件夹,随你喜好。
3.2 下载Linux内核源码:kernel.org是唯一选择
内核源码必须从kernel.org下载。为什么?因为这是Linus Torvalds亲自维护的官方仓库,所有补丁和更新都从这里发出。
我记得有一次项目急着用,从某个镜像站下载了内核源码,结果编译时发现头文件版本对不上——镜像站同步有延迟,少了一个关键补丁。从那以后,我只认kernel.org。
# 下载Linux 6.1 LTS版本(长期支持版,推荐)
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.tar.xz
# 解压
tar -xf linux-6.1.tar.xz
这里有个选择问题:该用哪个版本?
- LTS版本:稳定,适合产品开发。我建议新手直接选LTS。
- 主线版本:功能最新,但可能有bug。适合尝鲜或研究。
- 稳定版本:介于两者之间,修复了主线的一些问题。
注意:不要下载rc(候选发布)版本做产品开发。我曾经图新鲜用了rc版,结果内核模块接口变了,导致驱动全部重写——血的教训。
3.3 下载binutils和glibc:sourceware.org是老家
binutils和glibc是工具链的另外两个核心组件。它们都托管在sourceware.org上。
binutils负责汇编、链接等底层操作。glibc是C运行库,应用程序跑起来全靠它。
# 下载binutils 2.40
wget https://sourceware.org/pub/binutils/releases/binutils-2.40.tar.xz
# 下载glibc 2.37
wget https://sourceware.org/pub/glibc/releases/glibc-2.37.tar.xz
版本搭配很重要。我列个表,方便你对照:
| 组件 | 推荐版本 | 下载路径 |
|---|---|---|
| GCC | 12.2 | ARM官网 |
| Linux内核 | 6.1 LTS | kernel.org |
| binutils | 2.40 | sourceware.org |
| glibc | 2.37 | sourceware.org |
核心原则:版本之间要兼容。GCC 12.2搭配binutils 2.40和glibc 2.37,是我在项目中验证过的组合,稳定可靠。
3.4 本章知识体系:源码获取全景图
下面这张图帮你理清四个组件的关系和下载来源:
3.5 避坑指南:我踩过的那些坑
最后分享几个我亲身经历过的坑,你遇到了可以少走弯路:
- 版本不匹配:我曾经把GCC 11和glibc 2.38混在一起用,结果编译时一堆符号找不到。后来老老实实查了官方兼容性列表。
- 下载中断:源码包很大,网络不稳定容易断。我建议用
wget -c支持断点续传,或者用aria2c多线程下载。 - 解压失败:下载的压缩包可能损坏。下载完后用
sha256sum校验一下,官方页面会提供校验值。 - 路径含中文:源码路径里不要有中文或空格。我见过有人把源码放在“桌面”目录下,编译时各种奇葩错误。
我的习惯:下载完所有源码后,我会在/opt/toolchain/src/下建一个checksum.txt文件,记录每个包的校验值。这样以后出问题可以快速排查是不是源码被改了。
好了,源码都拿到手了。下一步就是解压、打补丁、配置编译选项——嗯,那是下一节的内容了。