1. 什么是交叉编译工具链
编译工具的 --host 为 宿主机, --target为 目标机
2. 交叉编译工具链包括哪些
包括 预编译器,编译器,汇编器,链接器,库。
具体有如下包:
GCC : 构建gcc和编译器cc1,
Binutils: 构建 预编译器ccp,汇编器as,链接器ld,其他工具如 objdump, strip等
C库
gcc不是编译器,而是指挥编译链接的驱动程序。
crti.o crtn.o ... 目标文件中有 启动程序,终止程序等,由GCC提供
C库,C库是必须的,因为应用程序不应该直接访问内核服务,C库对内核服务进行封装,让应用使用。C库有多种版本,如Glibc uClibc等。
3. 构建交叉编译工具的顺序
先构建 Binutils,因为其没有任何依赖。
再构建 freestanding env 模式的 GCC,因为完整功能的GCC依赖Glibc,而Glibc又依赖 gcc(target为目标主机),所以必须先构建 freestanding env模式的GCC,这个模式 的 gcc 不依赖 Glibc,且能让 --target为 目标主机。
再构建 Glibc,使用 freestanding env 的gcc进行构建
最后构建完整功能的 gcc。
3.1 准备工作
groupadd vita
useradd -m -s /bin/bash -g vita vita
-m : 创建用户目录
在 /etc/sudoers.d目录下创建vita文件,内容为
vita ALL=(ALL) NOPASSWD: ALL
建立工作目录
mkdir sources cross-tool cross-gcc-tmp sysroot
chown -R vita.vita /vita
在.bashrc中定义环境变量
# 禁止中文环境
unset LANG
# 宿主信息
export HOST=i686-redhat-linux-gnu
# 构建程序的主机信息
export BUILD=$HOST
# 编译程序输出的 程序的运行主机 信息
export TARGET=i686-none-linux-gnu
export CROSS_TOOL=/home/vita/cross-tool
export CROSS_GCC_TMP=/home/vita/cross-gcc-tmp
# 编译程序 寻找头文件和库的系统根目录
export SYSROOT=/home/vita/sysroot
# 确保 CROSS_TMP在 CROSS_GCC_TMP前,如此当 完整功能的gcc安装后,能直接使用完整功能的gcc
PATH=$CROSS_TOOL/bin:$CROSS_GCC_TMP/bin:/sbin:/usr/sbin:$PATH
3.2 编译Binutils
cd build
tar xf ../sources/binutils.tar.bz2
mkdir binutils-build
cd binutils-build
../binutils-2.23.1/configure --prefix=$SYSROOT --target=$TARGET --with-sysroot=$SYSROOT
make && make install
--prefix : 配置安装目录
--target : 编译工具的输出 文件 在 target环境运行
--with-sysroot : 构建的工具 使用 $SYSROOT 为 系统根目录,所以在这个目录找 头文件 和 链接文件。
3.3 编译 freestanding env gcc
tar xf sources/gcc-xx.tar.bz2
gcc需要一些数学库,下载库
cd gcc-xx
./contrib/down_pre
mkdir gcc-build
cd gcc-build