写在前面

本文将详细讲述如何构建工具链

前置知识

在LFS-BOOK中,我们需要学习一些关于“交叉编译”的内容,详见书本

安装Binutils-2.39

我们cd到sources文件夹中,使用以下命令解压

tar -xf binutils-2.39.tar.xz

注意:该命令将会直接把原压缩包删除

解压需要一定的时间,解压完成后我们可以看到一个新的文件夹

随后,我们进入binutils-2.39文件夹中,在文件夹下创建编译目录,并进入编译目录中

我们进行编译的配置,输入以下的配置信息到终端中

../configure --prefix=$LFS/tools \
--with-sysroot=$LFS \
--target=$LFS_TGT \
--disable-nls \
--enable-gprofng=no \
--disable-werror

输入完成后回车,我们会看到它有一些检查的信息,这些我们可以忽略

随后,我们输入指令

make

此时,将会开始编译

编译完成后,我们需要安装编译结果,输入以下指令

make install

此时,该工具已经被构建完毕

安装GCC-12.2.0 - 步骤1

警告:LFS-BOOK 11.2中,对本处的描述不够清晰,未写明GCC需要先解压

(感谢这篇文章Linux From Scratch(LFS11.0)交叉编译临时工具 - GCC-11.2.0 - 第二遍 - 墨天轮 (modb.pro)

还有这位强者Lucifer三思而后行 - 个人中心 - 腾讯云开发者社区-腾讯云 (tencent.com)

我们首先需要解压GCC-12.2.0,解压方法和Binutils的安装类似,指令如下

敲指令前请确保当前目录为$LFS/sources
tar -xf gcc-12.2.0.tar.xz

由于GCC的构建需要GMP,MPFR和MPC三个包,因此我们需要对这三个包进行操作

首先,我们返回$LFS/sources目录下

我们需要对着三个包分别进行解压和重命名,命令如下:

tar -xf mpfr-4.1.0.tar.xz
mv -v mpfr-4.1.0 mpfr
tar -xf gmp-6.2.1.tar.xz
mv -v gmp-6.2.1 gmp
tar -xf mpc-1.2.1.tar.gz
mv -v mpc-1.2.1 mpc

并将三个文件夹都拖入gcc-12.2.0这个文件夹中,如图所示

接着,确保当前目录为$LFS/sources/gcc-12.2.0中

如果你的电脑指令集为x86_64,那么你需要在终端中输入以下的代码,该代码将设置64位库的默认目录名为" lib "

case $(uname -m) in
x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
esac

和Binutils的构造一样,我们构建一个build文件夹,并cd

mkdir -v build
cd build

输入以下配置文件

../configure \
--target=$LFS_TGT \
--prefix=$LFS/tools \
--with-glibc-version=2.36 \
--with-sysroot=$LFS \
--with-newlib \
--without-headers \
--disable-nls \
--disable-shared \
--disable-multilib \
--disable-decimal-float \
--disable-threads \
--disable-libatomic \
--disable-libgomp \
--disable-libquadmath \
--disable-libssp \
--disable-libvtv \
--disable-libstdcxx \
--enable-languages=c,c++

完成后,我们输入make即可开始编译

该步编译耗时非常久,需要耐心等待

完成编译后,输入make install

注意:完成GCC编译后,有部分文件尚未更新,需要进行更新

保持自己在$LFS/sources/gcc-12.2.0/build目录下,输入以下指令

cd ..
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
`dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/install-tools/include/limits.h

至此,我们完成了GCC的编译

安装Linux-5.19.2 API Headers

我们首先解压linux-5.19.2压缩包,然后cd进其对应的文件夹

随后,运行以下命令,准备编译内核:

make mrproper

该命令确保内核源代码树绝对干净,内核开发组建议在每次编译内核前运行该命令

随后,运行以下代码构建

make headers
find usr/include -type f ! -name '*.h' -delete
cp -rv usr/include $LFS/usr

安装Gllibc-2.36

和前文一样,我们进行解压和cd

完成后,创建一个符合LSB的符号链接,指令如下

case $(uname -m) in
i?86) ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3
;;
x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64
ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3
;;
esac

随后,安装补丁,指令如下

patch -Np1 -i ../glibc-2.36-fhs-1.patch

我们可以看到输出如下所示

随后,开始构建build文件夹,和前文方法相同

接着,我们需确保ldconfig和sln实用程序安装到/usr/sbin,指令如下

echo "rootsbindir=/usr/sbin" > configparms

和前文一样,我们准备configure,指令如下:

../configure \
--prefix=/usr \
--host=$LFS_TGT \
--build=$(../scripts/config.guess) \
--enable-kernel=3.2 \
--with-headers=$LFS/usr/include \
libc_cv_slibdir=/usr/lib

随后,我们就可以make了

完成make后,注意make install的指令有一定的不同,指令如下

make DESTDIR=$LFS install

设置的原因为:几乎所有包都使用DESTDIR make变量来定义应该安装包的位置。如果未设置,则默认为根(/)目录。这里我们指定包安装在$LFS中

阶段检查一

我们已经安装若干个工具,为确保安装的工具顺利工作,我们将进行一系列正确性测试

我们可以输出以下命令进行测试

echo 'int main(){}' | gcc -xc -
readelf -l a.out | grep ld-linux

该部分代码的含义是,新建一个最基础的c源文件,并进行编译

如果编译器工作正常,它将不会有错误信息的提示,输出应和下文内容一致

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

如果这部村存在错误,则说明之前构建的Binutils,GCC或Glibc中的一个存在问题

测试完毕后,运行此代码以清除编译出的可执行文件a.out

rm -v a.out

至此,我们完成了上述插件的测试

现在我们的跨工具链已经完成,最后完成limits.h头文件的安装,运行以下指令

$LFS/tools/libexec/gcc/$LFS_TGT/12.2.0/install-tools/mkheaders

Libstdc++ from GCC-12.2.0安装

Libstdc++在gcc源码中,所以需要重新解压gcc并编译Libstdc++。

注意:老的gcc掺了其他东西,因此我们需要删掉老的gcc包并重新

Libstdc++编译配置如下:

../libstdc++-v3/configure \
--host=$LFS_TGT \
--build=$(../config.guess) \
--prefix=/usr \
--disable-multilib \
--disable-nls \
--disable-libstdcxx-pch \
--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/12.2.0

然后make

完成make后,执行make DESTDIR=$LFS install(和之前一致)

完成install后,需删除libtool归档文件,因为它会影响交叉编译,删除命令如下:

rm -v $LFS/usr/lib/lib{stdc++,stdc++fs,supc++}.la

至此,我们完成Libstdc++的安装

至此,LFS-BOOK中第五章的“交叉工具链构建”已全部完成

VMware中的快照已更新

LFS(Linux From Scratch)构建过程全记录(五):交叉工具链的构建的更多相关文章

  1. LFS(Linux From Scratch)构建过程全记录(三):下载所需的软件包

    写在前面 本文将记录构建LFS的过程中,下载软件包的全过程 准备下载的路径 注意请确保$LFS已经设置完毕 我们需要创建一个文件夹,地址为$LFS/sources,用于保存对应的源码 输入的指令如下: ...

  2. LFS(Linux From Scratch)构建过程全记录(二):磁盘分区

    写在前面 本文将会详细记录LFS中,构建分区,构建文件系统和挂载分区的全过程 准备新硬盘 为了更加符合"从零开始构建Linux"的要求,我在虚拟机中,新建了一个磁盘 我们将会在这个 ...

  3. LFS(Linux From Scratch)构建过程全记录(六):交叉编译临时工具

    写在前面 本章将展示如何使用刚刚构建的跨工具链来交叉编译基本实用程序. M4安装 和前文一样,先进行解压,然后cd进入 注意:不需要构建build文件夹,直接输入以下配置文件 ./configure ...

  4. LFS(Linux From Scratch)构建过程全记录(一):准备工作

    写在前面 本人修学了一门课,名曰<操作系统课程设计>,其任务为基于LFS以编译源代码的方式制作一个基本的Linux操作系统,并且编写在linux下的GUI软件. 本操作系统构建的全过程将分 ...

  5. LFS(Linux From Scratch)构建过程全记录(七):进入Chroot并构建临时工具

    写在前面 本章将完成临时系统构建的最后缺失部分和各种包构建所需的工具. 解决了所有循环依赖关系后,就可以使用与主机操作系统完全隔离的"chroot"环境进行构建. 注意:接下来的指 ...

  6. LFS(Linux From Scratch)构建过程全记录(四):最后的准备

    写在前面 本章将进行一系列的环境配置 目录创建 在LFS中创建文件目录 我们可以用以下的指令来创建一些基础的目录,并进行连接 mkdir -pv $LFS/{etc,var} $LFS/usr/{bi ...

  7. 在CentOS6上配置MHA过程全记录

    在CentOS6上配置MHA过程全记录 MHA(Master High Availability)是一款开源的MariaDB or MySQL高可用程序,为MariaDB or MySQL主从复制架构 ...

  8. 在CentOS7上通过RPM安装实现LAMP+phpMyAdmin过程全记录

    在CentOS7上通过RPM安装实现LAMP+phpMyAdmin过程全记录 时间:2017年9月20日 一.软件环境: IP:192.168.1.71 Hostname:centos73-2.sur ...

  9. SAP S4HANA1610/Fiori安装过程全记录

    经历各种坑,从硬件到文件,终于安装成功. 有需要安装或使用S4HANA(含Fiori)的同学可以参考. 安装文件分享给大家 链接:http://pan.baidu.com/s/1mi7LfIS 密码: ...

随机推荐

  1. Java:如何打印整个字符串数组?

    例: public static void main(String[] args) { String prodName = "雇员姓名,雇员唯一号"; String[] prodN ...

  2. 10.2 如何运行Android项目到Android Studio自带模拟器

    Android开发一般都可以将应用运行到模拟器查看效果,除非特殊项目要用到真机,所以我们这里先讲解如何将项目运行到模拟器,以校验我们的开发环境以及创建的项目是否有问题. 创建模拟器 点击"C ...

  3. 我是如何将一个老系统的kafka消费者服务的性能提升近百倍的

    ☞☞☞ 我是如何将一个老系统的kafka消费者服务的性能提升近百倍的 ☜☜☜ ○○○○○○○○○○○○○○○ 大家好,又见面了~ kafka作为一种高吞吐量的分布式发布订阅消息系统,在业务系统中被广泛 ...

  4. 高精度10m/30米NPP净初级生产力分布数据

    数据下载链接:百度云下载链接​ 引言 第一性生产力是绿色植物呼吸后所剩下的单位面积单位时间内所固定的能量或所生产的有机物质,即是总第一性生产量减去植物呼吸作用所剩下的能量或有机物质.多种卫星遥感数据反 ...

  5. iOS中 Tagged Pointer 技术

    前言: ​ 从64位开始,iOS引入了Tagged Pointer技术,用于优化NSNumber.NSDate.NSString等小对象的存储. Tagged Pointer主要为了解决两个问题: 内 ...

  6. 利用基于Python的Pelican打造一个自己的个人纯静态网站

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_100 其实呢这么多年以来我一直建议每个有技术追求的开发者都要有写技术博客记笔记的良好习惯,一来可以积累知识,二来可以帮助别人,三来 ...

  7. 在半小时内从无到有开发并调试一款Chrome扩展(Chrome插件/谷歌浏览器插件)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_120 就在不久之前,我们目前这个毕业班的班长那日同学和我说,他正在公司开发Chrome扩展,看起来很高大上的技术,实际开发却非常简 ...

  8. Dubbo源码(六) - 服务路由

    前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 今天,来聊点短的,服务路由Router,本文讲的是路由的调用路径,不讲路由的规则解析.想了解规则 ...

  9. RestTemplate上传文件

    1.上传的文件是File类型 如果文件保存在本地,即可以通过File file = new File(path) 或者 文件路径地址获取到指定文件 public String uploadFile(F ...

  10. cmd命令行工具

    在windows下进行python开发,需要经常使用cmd命令行工具.打开命令行工具有很多种方法,最简单的就是win键+R键弹出运行窗口,然后输入cmd, 就会打开下面这样的窗口. 不同版本,可能配色 ...