系列文章目录
文章目录
- 系列文章目录
- 一、GNU工具链组成
- 二、构建工具链的过程
- 三、准备工作
- 1、环境变量
- 2、Binutils
- 四、编译freestanding的交叉编译器
- 1、GCC 下载
本文基于《深度探索Linux操作系统:系统构建和原理解析》
一、GNU工具链组成
编译过程分为4个阶段,分别是:编译预处理、编译、汇编以及链接。每个阶段都涉及了若干工具,GNU将这些工具分别包含在3个软件包中:Binutils、GCC、Glibc。
-
Binutils:GNU将凡是与二进制文件相关的工具,都包括在软件包Binutils中。Binutils就是 Binary utilities 的简写,其中主要包括生成目标文件的汇编器(as),链接目标文件的链接器(ld)以及若干处理二进制文件的工具,如objdump、strip等。但是也不是Binutils中的所有的工具都是处理二进制文件的,比如处理文本文件的预编器(cpp)也包含在其中。
-
GCC:GNU将编译器包含在GCC中,包括C编译器、C++编译器、Fortran编译器、Ada编译器等。GCC中还提供了C++的启动文件。
-
Glibc:C库包含在Glibc中。除了C库外,动态链接器(dynamic loader/linker)也包含在这个包中。另外这个包中还提供C的启动文件。事实上,有很多C库的实现,比如适用于Linux桌面系统的Glibc、EGlibc、uClibc;在嵌入式系统上,可以使用EGlibc或者uClibc;对于没有操作系统的系统,也就是所说的 freestanding enviroment ,可以选择newlib、dietlibc,或者根本就不用C库。
除了这三个软件包外,工具链中还需要包括内核头文件。用户空间中的很多操作需要借助内核来完成,但是通常用户程序不必直接和内核打交道,而是通过更易用的C库。C库中的很大一部分函数是对内核服务的封装。在某种意义上,内核头文件可以看作是内核与C库之间的协议。因此,构建C库之前,需要首先在工具链中安装内核头文件。
二、构建工具链的过程
C99标准定义了两种运行环境,一种是 “hosted environment” ,针对的是具有操作系统的环境,程序一般是运行在操作系统之上的,因此这个操作系统不仅是内核,还包括外围的C库,对于程序来说,就是一个"hosted environment"。另外一种是 “freestanding environment”,就是程序不需要额外环境的支持,直接运行在裸机(bare metal)上,比如Linux内核,以及一些运行在没有操作系统的裸板上的程序,不再依赖操作系统内核和C库,所有的功能都在单个程序的内部实现。
构建工具链步骤:
- 构建交叉 Binutils,包括汇编器as、链接器ld等。
- 构建临时的交叉编译器(仅支持 freestanding)。
- 安装目标系统的内核头文件。
- 构建目标系统的 C 库。
- 构建完整的交叉编译器(支持 hosted 和 freestanding )。
三、准备工作
1、环境变量
unset LANG
export HOST=i686-pc-linux-gnu
export BUILD=$HOST
export TARGET=i686-none-linux-gnu
export CROSS_TOOL=/vita/cross-toolexport CROSS_GCC_TMP=/vita/cross-gcc-tmp
export SYSROOT=/vita/sysroot
export PATH=$CROSS_TOOL/bin:$CROSS_GCC_TMP/bin:/sbin:/usr/sbin:$PATH
2、Binutils
Linux下载安装Binutils工具集
Linux 编写 configure.ac 和 Makefile.am 示例
Linux命令详解./configure、make、make install 命令
../binutils-2.23/configure --prefix=$CROSS_TOOL --target=$TARGET --with-sysroot=$SYSROOTmake && make install
c: error: this statement may fall through [-Werror=implicit-fallthrough=]
报错解决:error: this statement may fall through [-Werror=implicit-fallthrough=]
make CFLAGS='-Wno-implicit-fallthrough'
make CFLAGS='-Wno-error'
-Wno-error取消编译选项-Werror
GCC详解
Binutils 将二进制工具安装在 $CROSS_TOOL/bin 目录下,链接脚本安装在 $CROSS_TOOL/i686-none-linux-gnu/lib/ldscripts 目录下。
其中 elf_i386.x 用于IA32上ELF文件的链接,elf_i386.xbn、elf_i386.xc 等分别对应ld使用不同的链接参数时使用的链接脚本,如果使用了 “-N” 参数,那么ld使用链接脚本elf_i386.xbn。
Binutils 在 $CROSS_TOOL/i686-none-linux-gnu/bin 目录下也安装了一些二进制工具,这些是编译器内部使用的,我们不必关心,其实这个目录下的工具与 $CROSS_TOOL/bin 目录下的工具完全相同,只是名称不同而已。
四、编译freestanding的交叉编译器
1、GCC 下载
gcc7.3.0下载与安装
GCC FTP下载页
GCC Releases页
wget https://ftp.gnu.org/gnu/gcc/gcc-4.7.2/gcc-4.7.2.tar.gz
wget https://ftp.gnu.org/gnu/gcc/gcc-4.7.2/gcc-4.7.2.tar.bz2