本文参考以下文章:
建立交叉编译器 for arm (binutils-2.17 gcc-3.4.6 glibc-2.3.6)
特此致谢!
一直以来就很好奇:交叉编译工具d到底是怎么制作出来的?之前做嵌入式工程师的时候,都是拿过厂家现成的BSP中提供的交叉编译工具直接使用,虽然也想过这个问题,但最终都被主研发任务“湮没”了。近几年成为内核工程师后越来越觉得这个问题是核心和关键的,可以说这是内核系统界“根本的问题”。因此,终于下定决心、同时也有时间能踏下心来把这个问题详细研究一下,至少自己实际做出一个交叉编译工具。
一、准备工作
1. 下载源码(压缩)包
根据参考文章中的提示,需要先准备以下几个包:binutils、gcc、glibc以及kernel。记得其它文章中提到过,这几个工具需要互相配合,要求版本要匹配,否则可能会出现错误。这里选择LFS(Linux From Scratch)中给出的各个包,应该是LFS之前已经探索好的。链接如下:Chapter 3. Packages and Patches
以上4个组件分别如下:
- Binutils (2.41) - 26,139 KB:
Home page: Binutils- GNU Project - Free Software Foundation
Download: https://sourceware.org/pub/binutils/releases/binutils-2.41.tar.xz
MD5 sum:
256d7e0ad998e423030c84483a7c1e30
- GCC (13.2.0) - 85,800 KB:
Home page: GCC, the GNU Compiler Collection- GNU Project
Download: https://ftp.gnu.org/gnu/gcc/gcc-13.2.0/gcc-13.2.0.tar.xz
MD5 sum:
e0e48554cc6e4f261d55ddee9ab69075
SHA256 sum:
- Glibc (2.38) - 18,471 KB:
Home page: https://www.gnu.org/software/libc/
Download: https://ftp.gnu.org/gnu/glibc/glibc-2.38.tar.xz
MD5 sum:
778cce0ea6bf7f84ca8caacf4a01f45b
- Linux (6.4.10) - 134,621 KB:
Home page: The Linux Kernel Archives
Download: https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.4.10.tar.xz
MD5 sum:
2e19e7badc3d4b080bf6b4864912f2d3
分别下载这4个源码压缩包。
2. 构建工程目录
按照参考文章中的步骤,先建立专门构建交叉编译工具的目录,这里为了更方便和接近,与之取相同的名称,如下所示:
$ mkdir cross-compiler
$ cd cross-compiler/
~/cross-compiler$ mkdir build-tools
~/cross-compiler$ tree ./
./
└── build-tools
1 directory, 0 files
然后建立存放内核源码的目录,如下所示:
~/cross-compiler$ mkdir kernel
~/cross-compiler$ ls
build-tools kernel
将下载的内核源码包放在kernel/下,其它3个源码包放入build-tools/。如下所示:
~/cross-compiler$ mv ~/下载/binutils-2.41.tar.xz ./build-tools/
~/cross-compiler$ mv ~/下载/gcc-13.2.0.tar.xz ./build-tools/
~/cross-compiler$ mv ~/下载/glibc-2.38.tar.xz ./build-tools/
~/cross-compiler$ mv ~/下载/linux-6.4.10.tar.xz ./build-tools/
~/cross-compiler$
~/cross-compiler$ tree
.
├── build-tools
│ ├── binutils-2.41.tar.xz
│ ├── gcc-13.2.0.tar.xz
│ └── glibc-2.38.tar.xz
└── kernel
└── linux-6.4.10.tar.xz
2 directories, 4 files
3. 准备内核头文件
(1)解压内核源码
进入cross-compiler/kernel目录。运行以下命令解压内核源码:
tar xvf linux-6.4.10.tar.xz
解压之后内容如下:
$ ls
linux-6.4.10 linux-6.4.10.tar.xz
(2)拷贝内核头文件
在系统/usr/local/下建立arm/arm-linux/include目录。如下所示:
$ mkdir -p /usr/local/arm/arm-linux/include
$ ls /usr/local/arm/arm-linux/include/ -d
/usr/local/arm/arm-linux/include/
将下载解压之后的kernel源码即linux-6.4.10/下的(部分)头文件拷贝到/usr/local/arm/arm-linux/include/目录。如下所示:
$ cp -a linux-6.4.10/include/linux /usr/local/arm/arm-linux/include/
$ cp -a linux-6.4.10/include/asm-generic /usr/local/arm/arm-linux/include/
拷贝之后/usr/local/arm/arm-linux/include/下的内容为:
$ ls /usr/local/arm/arm-linux/include/
asm-generic linux
至此,准备工作就完成了。下一回开始进行各组件的编译构建。