《深度探索Linux系统:系统构建和原理解析》笔记——2.工具链构建

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

3. 直接安装

多次尝试后,依然在构建完整GCC上失败,根据网上文档,构建GCC应该用cross-ng,而不是手动构建,所以我选择直接安装

apt install gcc-arm-linux-gnueabi -y

3.1 abi 和 eabi

  • abi : 应用程序二进制接口,只要abi系统,不同版本gcc编译的程序都能在相同abi环境运行
  • eabi : 嵌入式abi
    所以 arm-linux-gnuabi-gcc 编译的程序可以在相同位数的 arm系统上运行(早期版本除外)

posted on 2021-12-16 13:27  开心种树  阅读(156)  评论(0编辑  收藏  举报