linux之crosstool-NG(1)生成toolchain
Linux之crosstool-NG(1)生成交叉编译Toolchain
Author: Once Day Date: 2025年2月25日
一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…
本文相关内容翻译自crosstool-NG官方文档。
漫漫长路,有人对你微笑过嘛…
全系列文章可参考专栏: buildroot编译框架_Once_day的博客-ZEEKLOG博客。
参考文章:Buildroot - Making Embedded Linux Easycrosstool-NGDocumentation (crosstool-ng.github.io)crosstool-ng/crosstool-ng: A versatile (cross-)toolchain generator. (github.com)Yann E. MORIN - Re: Tutorial
文章目录
1. 概述
1.1 简介
Crosstool-NG 是一款用于建立交叉编译器的开源工具。交叉编译器是一种特殊类型的编译器,可以在一种类型的计算机上(称为“主机”)为另一种类型的计算机(称为“目标”)生成可执行代码。这对于嵌入式系统开发者特别有用,他们需要在功能强大的主机上为资源受限的目标设备(如 ARM 或 MIPS 微控制器)生成代码。
以下是 Crosstool-NG 的主要功能和作用:
- 自定义构建: Crosstool-NG 允许用户选择他们想要的特定版本的 GCC,glibc 和 binutils,以及其他的库和工具。这意味着你可以根据项目需求创建一个精细调整的工具链。
- 配置界面:Crosstool-NG 提供了一个基于菜单的配置界面,供用户选择各种选项,如工具链的组件版本、目标体系结构、硬件浮点设置等。
- 并行构建:Crosstool-NG 支持并行构建,这可以显著加快工具链的构建时间。
- 多平台支持:Crosstool-NG 支持多种目标体系结构,包括 ARM、MIPS、PowerPC、x86 和更多。
- 补丁系统:如果需要,可以通过补丁系统对源代码进行修改,以适应特定的需求。
- 生成工具链:最后,Crosstool-NG 会生成一个可在主机上运行的交叉编译工具链,以生成目标设备的可执行代码。
总的来说,Crosstool-NG 是一个强大的工具,它可以帮助开发者创建、定制和管理交叉编译工具链,从而简化了嵌入式开发流程。
1.2 背景
crosstool-NG旨在构建工具链。工具链是软件开发项目中必不可少的组成部分。它将编译、组装和链接正在开发的代码。工具链的某些部分最终会出现在生成的二进制文件中: 静态库只是一个例子。
因此,工具链是一个非常敏感的软件部分,因为其中一个组件或配置不当的组件中的任何错误都可能导致执行问题,包括性能不佳、应用程序意外结束、软件行为不当(通常很难检测到)、硬件损坏,甚至是人为风险(这非常令人遗憾)。
工具链是由不同的软件组成的,每个软件都非常复杂,需要特别设计的选项来构建和无缝地工作。这通常不那么容易,即使是在原生工具链的情况下。当涉及到交叉编译时,工作达到了更高的复杂性,这可能会成为一场噩梦……
互联网上存在一些跨工具链,可以用于一般开发,但它们有许多限制:
- 它们可以是通用的,因为它们是为大多数人配置的。
- 没有针对特定目标进行优化。
- 它们可能是为特定的目标而准备的,因此不容易使用,也不适合优化,甚至不支持你的目标。
- 他们经常使用老旧的组件(编译器、C库等),不支持你崭新处理器的特殊功能。
另一方面,这些工具链提供了一些优势:
- 他们已经准备好使用,很容易安装和设置。
- 如果被广泛的社区使用,它们是经过验证的。
但是,一旦想要充分利用特定硬件,就需要构建自己的工具链。这就是crosstool-NG发挥作用的地方。还有许多工具可以为特定需求构建工具链,这些工具实际上是不可伸缩的。例子有:
builroot,其主要目的是构建根文件系统,因此得名。但是,一旦拥有了带有buildroot的工具链,其中的一部分将安装在将来的根(sysroot)中,因此,如果想要构建一个全新的根(sysroot),要么必须将现有的根保存为模板并稍后恢复它,要么从头开始重新启动,这不太方便。- 对于其他项目(例如,
openenembedded.org,Yocto Project),同样用于构建根文件系统。
crosstool-NG的真正目标是构建工具链,而且仅仅是工具链。然后你就可以按照你想要的方式使用它。
NG的意思是下一代(Next Generation),经过So Yann的整理,脚本,文件,和软件包都相应的更新过,并形成了当前使用的crosstool版本。
1.3 编译类型
参考文档:https://crosstool-ng.github.io/docs/toolchain-types/
你可能会遇到四种类型的工具链。首先,你必须了解以下内容:当涉及到编译器时,最多会涉及四台机器:
- 配置工具链组件的机器:配置机器(config machine)。
- 构建工具链组件的机器:构建机器(build machine)。
- 运行工具链的机器:主机(host machine)。
- 工具链为其生成代码的目标机器:目标机器(target machine)。
我们通常可以假设配置机器和构建机器是相同的。大多数情况下,这是正确的。唯一的例外是,如果你使用分布式编译(如distcc)。为了简单起见,让我们暂时忽略这一点。
所以我们只剩下三台机器:构建机器(build),主机(host),目标机器(target)。
任何工具链都会涉及这三台机器。这一点你可以像确信"2加2等于4"一样确信。它们是这样发挥作用的:
- 构建机器 == 主机 == 目标机器 (“本地(native)”),这是一个普通的本地工具链,针对的是与构建它的机器完全相同的机器,并再次在完全相同的机器上运行。当你想使用更新的组件时,比如更新的gcc,你必须构建这样一个工具链。
- 构建机器 == 主机 != 目标机器 (“交叉(cross)”),这是一个经典的交叉工具链,它期望在编译它的同一台机器上运行,并生成代码在第二台机器(目标机器)上运行。
- 构建机器 != 主机 == 目标机器 (“交叉-本地(cross-native)”),这样的工具链也是一个本地工具链,因为它的目标机器与运行它的机器相同。但它是在另一台机器上构建的。当移植到新的架构时,或者如果构建机器比主机快得多时,你需要这样一个工具链。
- 构建机器 != 主机 != 目标机器 (“加拿大(canadian)”), 这个工具链被称为"加拿大交叉"工具链,很棘手。涉及的三台机器都不相同。如果你有一台快速的构建机器,但用户将在另一台机器上使用它,并且将生成代码在第三台机器上运行,你可能需要这样一个工具链。术语"加拿大交叉"的由来是因为当时在讨论所有这些问题时,加拿大有三个全国性的政党(根据维基百科)。
crosstool-NG可以构建所有这些类型的工具链,或者至少是朝这个方向努力的。不过,也有一些需要注意的地方。
在构建"本地"工具链时,crosstool-ng目前仍然会为目标机器编译新版本的libc。目前还没有办法将系统libc和/或系统内核头文件作为工具链的一部分。如果你选择兼容的版本(即,用工具链编译的应用程序将加载系统libc),这可能会奏效。
可以将"交叉-本地"工具链构建为"加拿大"工具链的一个平凡的案例。这并不理想,因为它会使crosstool-NG两次编译针对主机的工具(第一次,作为所有加拿大构建的先决条件的单独工具链;第二次,作为加拿大构建本身的一部分创建的临时工具链的一部分)。未来可能会对此进行改进。
要构建"加拿大"工具链,你必须先构建一个在构建机器上运行并以主机为目标的工具链作为先决条件(即一个简单的交叉工具链)。然后,将这个先决条件的/bin目录添加到$PATH环境变量中,并配置加拿大工具链,将先决条件工具链的目标指定为新工具链的主机。
crosstool-NG附带了一些加拿大工具链的示例。加拿大示例的名称由两个逗号分隔的部分组成,即HOST,TARGET。它们需要HOST示例作为先决条件。例如:
ct-ng x86_64-w64-mingw32 ct-ng build PATH=~/x-tools/x86_64-w64-mingw32/bin:$PATH ct-ng x86_64-w64-mingw32,x86_64-pc-linux-gnu ct-ng build 请注意,你将无法在构建机器上运行加拿大工具链生成的二进制文件!你需要将它们转移到运行配置为主机的操作系统的机器上。
1.4 交叉工具链的构建过程
参考文档:https://crosstool-ng.github.io/docs/toolchain-construction/
我想要一个交叉编译器!你说的这个工具链是什么?
交叉编译器实际上是一组紧密协作的不同工具的集合。这些工具排列成一种级联式的链,一个工具的输出成为另一个工具的输入,最终生成在机器上运行的实际二进制代码。所以,我们称这种安排为"工具链"。当工具链旨在为与运行它的机器不同的机器生成代码时,这被称为交叉工具链。
那么,工具链中有哪些组件呢?
工具链中起作用的组件首先是编译器本身。编译器将源代码(C、C++等)转换为汇编代码。首选的编译器是GNU编译器集合,众所周知的gcc。
汇编代码由汇编器解释,以生成目标代码。这是由二进制工具完成的,如GNU binutils。
一旦生成了不同的目标代码文件,它们就会被聚合在一起形成最终的可执行二进制文件。这称为链接,是通过使用链接器实现的。GNU binutils也附带了一个链接器。
到目前为止,我们得到了一个完整的工具链,能够将源代码转换为实际的可执行代码。根据在目标机器上运行的操作系统或没有操作系统,我们还需要C库。C库提供了一个标准的抽象层,用于执行基本任务(如分配内存、在终端上打印输出、管理文件访问等)。有许多C库,每个都针对不同的系统。对于Linux桌面,有glibc、eglibc,甚至uClibc;对于嵌入式Linux,你可以选择eglibc或uClibc;而对于没有操作系统的系统,你可以使用newlib、dietlibc,甚至不使用任何库。还有一些其他的C库,但它们没有那么广泛使用,或针对非常特定的需求(例如,klibc是C库的一个非常小的子集,旨在构建受限的初始ramdisk)。
在Linux下,C库需要知道内核的API,以决定存在哪些功能,如果需要,为缺失的功能包含什么仿真。该API由内核头文件提供。注意:这是特定于Linux的(可能还有极少数其他系统),其他操作系统上的C库不需要内核头文件。
现在,所有这些组件是如何链接在一起的?
到目前为止,所有主要组件都已涵盖,但它们仍需要以特定的顺序构建。这里我们看到了依赖关系,从我们最终要使用的编译器开始。我们称该编译器为最终编译器。
最终编译器(Final compiler)需要C库(C library),以知道如何使用它,但是:
构建C库需要编译器。
C library => Final compiler
A需要B,而B需要A。这是经典的先有鸡还是先有蛋的问题。解决方法是构建一个精简的编译器,它不需要C库,但能够构建C库。我们称之为bootstrap、初始或核心编译器。所以这里是新的依赖列表:
最终编译器需要C库(C library),以知道如何使用它,
构建C库需要核心编译器(Core compiler),但是:
核心编译器需要C库头文件(C library headers)和启动文件(start files),以知道如何使用C库。
C library headers + start files => Core compiler => C library => Final compiler
B需要C,而C需要B。又是先有鸡还是先有蛋。为了解决这个问题,我们需要构建一个C库,它只安装头文件和启动文件。启动文件(也称为"C运行时(C runtime)"或CRT)是gcc需要的极少数文件,用于在NPTL系统上启用线程本地存储(TLS)。所以现在我们有:
最终编译器需要C库(C library),以知道如何使用它,
构建C库(C library)需要核心编译器(Core compiler)
核心编译器需要C库头文件(C library headers)和启动文件(start files),以知道如何使用C库,但是:
构建启动文件(start files)需要编译器
???compiler => C library headers + start files => Core compiler => C library => Final compiler
天哪……C需要D,而D需要C,又来了。所以我们需要构建一个更简单的编译器,它不需要头文件,也不需要启动文件。这个编译器也是一个bootstrap、初始或核心编译器。为了区分这两个核心编译器,我们称前者为核心pass 2(core pass 2),称后者为核心pass 1(core pass 1)。依赖列表变为:
最终编译器需要C库(C library),以知道如何使用它,
构建C库(C library)需要编译器(Core compiler pass 2)
核心pass 2编译器(Core compiler pass 2)需要C库头文件(C library headers)和启动文件(start files),以知道如何使用C库
构建启动文件需要编译器(Core compiler pass 1)
我们需要一个核心pass 1编译器(Core compiler pass 1)
Core compiler pass 1=> C library headers + start files => Core compiler pass 2 => C library => Final compiler
正如我们前面所说,C库也需要内核头文件(Kernel headers)。内核头文件没有要求,所以在这种情况下就结束了:
最终编译器需要C库(C library),以知道如何使用它,
构建C库(C library)需要编译器(Core compiler pass 2)
核心pass 2编译器(Core compiler pass 2)需要C库头文件(C library headers)和启动文件(start files),以知道如何使用C库
构建启动文件需要编译器(Core compiler pass 1)和内核头文件(Kernel headers)
我们需要一个核心pass 1编译器(Core compiler pass 1)
Core compiler pass 1 + Kernel headers => C library headers + start files => Core compiler pass 2 => C library => Final compiler
我们需要添加一些新的要求。当我们为目标编译代码时,我们需要汇编器(Assembler)和链接器(linker)。这样的代码当然是从C库构建的,所以我们需要在C库启动文件之前构建binutils,以及完整的C库本身。此外,gcc中的一些代码也将在目标上运行。幸运的是,binutils没有要求。所以,我们的依赖链如下:
最终编译器需要C库(C library),以知道如何使用它,以及binutils ,
构建C库(C library)需要编译器(Core compiler pass 2)和binutils
核心pass 2编译器(Core compiler pass 2)需要C库头文件(C library headers)和启动文件(start files),以知道如何使用C库,以及binutils
构建启动文件需要编译器(Core compiler pass 1)和内核头文件(Kernel headers)和binutils
核心pass 1编译器(Core compiler pass 1)需要binutils
binutils => Core compiler pass 1 + Kernel headers => C library headers + start files => Core compiler pass 2 => C library => Final compiler
这转化为以下构建组件的顺序:
binutils
核心pass 1编译器(Core compiler pass 1)
内核头文件(Kernel headers)
C库头文件和启动文件(C library headers + start files)
核心pass 2编译器(Core compiler pass 2)
完整的C库(C library)
最终编译器(Final compiler)
太棒了!但我们完成了吗?
事实上,还没有,仍然缺少依赖项。就工具本身而言,我们不需要其他任何东西。
但是gcc有一些先决条件。它依赖一些外部库来执行一些非平凡的任务(例如在常量中处理复数)。有几个选项可以构建这些库。首先,人们可能会想依靠Linux发行版来提供这些库。唉,直到最近,它们还没有广泛提供。所以,如果发行版不是太新,我们很可能必须自己构建这些库(我们在下面构建)。受影响的库是:
- GNU多精度算术库,GMP;
- 用于具有正确舍入的多精度浮点计算的C库,MPFR;
- 用于复数算术的C库,MPC。
这些库的依赖关系是:
- MPC需要GMP和MPFR。
- MPFR需要GMP。
- GMP没有先决条件。
所以,构建顺序变成:
GNU多精度算术库(GMP)
用于具有正确舍入的多精度浮点计算的C库(MPFR)
用于复数算术的C库(MPC)
binutils
核心pass 1编译器(Core compiler pass 1)
内核头文件(Kernel headers)
C库头文件和启动文件(C library headers + start files)
核心pass 2编译器(Core compiler pass 2)
完整的C库(C library)
最终编译器(Final compiler)
完成了!还是还有呢?
这现在足以构建一个功能性的工具链。所以如果你现在已经足够了,可以在这里停下来。或者如果你很好奇,可以继续阅读。
gcc还可以使用一些其他外部库。这些附加的可选库用于在gcc中启用高级特性,例如循环优化(GRAPHITE)和链接时优化(LTO)。如果你想使用这些功能,你还需要三个附加库:
要启用GRAPHITE,根据GCC版本,它可能需要以下一个或多个:
- Parma多面体库,PPL;
- 整数集库,ISL;
- 使用PPL后端的分块循环生成器,CLooG/PPL;
- 使用ISL后端的分块循环生成器,CLooG。
要启用LTO:
- ELF目标文件访问库,libelf。
这些库的依赖关系是:
PPL需要GMP;
CLooG/PPL需要GMP和PPL或ISL之一;
ISL没有先决条件;
libelf没有先决条件。
现在的列表看起来像:
GNU多精度算术库(GMP)
用于具有正确舍入的多精度浮点计算的C库(MPFR)
用于复数算术的C库(MPC)
Parma多面体库(PPL,循环优化(GRAPHITE))
整数集库(ISL,循环优化(GRAPHITE))
分块循环生成器(CLooG,循环优化(GRAPHITE))
ELF目标文件访问库(ELF,链接时优化(LTO))
binutils
核心pass 1编译器(Core compiler pass 1)
内核头文件(Kernel headers)
C库头文件和启动文件(C library headers + start files)
核心pass 2编译器(Core compiler pass 2)
完整的C库(C library)
最终编译器(Final compiler)
这个列表现在完整了,哇哦,是吗?但是为什么crosstool-NG有更多步骤?
从理论的角度来看,这十三个步骤已经是必要的步骤了。但实际上,还是有一些小的差异;crosstool-NG中额外步骤有三个不同的原因。
首先,GNU binutils不支持某些类型的输出。使用binutils无法生成平面二进制文件,所以我们必须使用另一个组件来添加这种支持:elf2flt。elf2flt还需要zlib压缩库——如果我们正在构建加拿大或交叉本地工具链,我们可能无法使用主机的zlib。
其次,在某些主机操作系统上,工具链的本地化需要额外的库:gettext和libiconv。
第三,crosstool-NG还可以构建一些额外的调试实用程序以在目标上运行。这就是我们构建的地方,例如,交叉gdb、gdbserver和本机gdb(后两个在目标上运行,第一个在与工具链相同的机器上运行)。其他的(strace、ltrace、DUMA和dmalloc)与工具链完全无关,但在开发时可以提供很大帮助,所以作为额外的好东西包含进来(而且构建起来相当容易,所以没问题;更复杂的东西不值得花力气包含在crosstool-NG中)。
2. 编译ARM64交叉编译工具链
2.1 建立host主机环境
下面文档里官方列举了一些常见系统的运行环境搭建过程,包括Linux,Windows,FreeBSD,Macos:
Linux系统和其他设备不一样,官方默认Linux系统使用Docker来搭建编译环境,紧跟时代潮流,dockerfile也放在了源码目录下面,如下面所示:
FROM ubuntu:22.04 ARG CTNG_UID=1000 ARG CTNG_GID=1000 RUN groupadd -g $CTNG_GID ctng RUN useradd -d /home/ctng -m -g $CTNG_GID -u $CTNG_UID -s /bin/bash ctng # Non-interactive configuration of tzdata ENV DEBIAN_FRONTEND noninteractive ENV DEBCONF_NONINTERACTIVE_SEEN true RUN { echo 'tzdata tzdata/Areas select Etc'; echo 'tzdata tzdata/Zones/Etc select UTC'; } | debconf-set-selections RUN apt-get update RUN apt-get install -y gcc g++ gperf bison flex texinfo help2man make libncurses5-dev \ python3-dev autoconf automake libtool libtool-bin gawk wget bzip2 xz-utils unzip \ patch libstdc++6 rsync git meson ninja-build RUN wget -O /sbin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.5/dumb-init_1.2.5_x86_64 RUN chmod a+x /sbin/dumb-init RUN echo 'export PATH=/opt/ctng/bin:$PATH' >> /etc/profile ENTRYPOINT [ "/sbin/dumb-init", "--" ] 这个是ubuntu 22.04的配置,其他系统和linux分发版配置请查看对应dockerfile,这里不多说了。
下面直接安装好这些软件,docker操作有些麻烦(主要是下载)。
2.2 安装crosstool-ng
crosstool-NG 是一个用于构建交叉编译工具链的工具,支持多种架构(如 ARM、MIPS、RISC-V 等)。以下是根据官方文档 https://crosstool-ng.github.io/docs/install/ 介绍的 安装方法。
在安装 crosstool-NG 之前,需要先安装一些必备的软件包:
对于 Ubuntu/Debian:
sudoapt update sudoaptinstall-y autoconf automake libtool libncurses-dev \ flex bison gperf texinfo help2man gawk libtool-bin \ libssl-dev bash patch gzipbzip2 perl tar cpio unziprsync\filebcwget python3 对于 CentOS/RHEL:
sudo yum groupinstall -y"Development Tools"sudo yum install-y ncurses-devel flex bison gperf texinfo \ help2man gawk libtool libtool-ltdl-devel \ openssl-devel patch gzipbzip2 perl tar cpio unziprsync\filebcwget python3 对于 macOS(使用 Homebrew):
brew install autoconf automake libtool gawk gnu-sed \ bison flex texinfo help2man wget下载并安装 crosstool-NG:
方法 1:从官方 Git 仓库安装(推荐)
git clone https://github.com/crosstool-ng/crosstool-ng.git 方法 2:安装已发布的稳定版
如果不想从 GitHub 克隆最新代码,可以下载稳定版:
wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-latest.tar.bz2 tar-xjf crosstool-ng-latest.tar.bz2 然后是进入crosstool-ng目录,配置和编译crosstool-ng文件,最后安装到系统目录下面(也可以不安装):
cd crosstool-ng ./bootstrap # 用于生成 configure。 ./configure --prefix=/ # --enable-local 允许在当前目录下执行 crosstool-ng,无需全局安装。makemakeinstall# 这一步安装到系统根目录下2.3 配置crosstool-ng
使用 Crosstool-NG 定制交叉工具链的第一步,是下载和解压源代码包。然后进入解压后的目录,运行 ./configure 脚本配置编译安装选项,如指定安装目录等。配置完成后,接着运行 make 编译 Crosstool-NG 自身,再运行 make install 将其安装到之前指定的目录中。
有了 Crosstool-NG 工具之后,就可以开始创建自己的工具链配置了。运行 ct-ng menuconfig 即可打开一个交互式的配置界面。在这里,首先设置一些全局的选项,如 Crosstool-NG 的安装路径、工作目录、源码包下载存放目录等。
接下来,就要针对目标平台,进行一系列细节的配置。在 Target options 菜单下,可以选择 CPU 架构、字长、是否有浮点处理器等。Toolchain options 菜单可以指定工具链的名称前缀和版本号、使用的 C 库等。如果是为 Linux 系统编译,则在 Operating System 下配置内核头文件和目标系统的一些参数。
此外,binutils、gcc、C 库是构成工具链的核心组件,也要分别到 Binary utilities、C compiler、C-library 等菜单项中选择它们的具体版本和配置。所有配置完成后,保存退出,就生成了一个名为 .config 的配置文件。
最后,在配置好的目录下执行 ct-ng build,Crosstool-NG 就会自动下载源码包并启动编译构建过程,直到工具链安装完成。在 <工作目录>/x-tools/<工具链名称> 下,就可以找到交叉编译好的工具链文件了。
通过对配置文件的不同组合,可以用 Crosstool-NG 在同一台主机上同时配置构建多套不同目标的交叉工具链。编译过程中,还可以运行 ct-ng clean 清理临时文件。日后要升级更新工具链,修改配置里的版本号,重新运行构建命令即可,非常灵活方便。
实际配置时,需要注意静态编译和Plugin之间存在冲突,然后编译的时候,非必要二进制文件都不要编译,等工具链编译出来,可以慢慢再编译其他的软件包。
2.4 开始编译
首先需要下载软件包,比如下面这种(网络不好会下载很慢,需要使用一点小手段):
onceday->crosstool:# ll src/ total 289940 drwxrwxr-x 2 onceday onceday 4096 Feb 27 22:51 ./ drwxrwxr-x 4 onceday onceday 4096 Feb 27 22:35 ../ -rw-rw-r-- 1 onceday onceday 28174300 Feb 27 23:44 binutils-2.43.1.tar.xz -rw-rw-r-- 1 onceday onceday 460560 Feb 27 23:44 expat-2.5.0.tar.xz -rw-rw-r-- 1 onceday onceday 87909952 Feb 27 23:44 gcc-13.3.0.tar.xz -rw-rw-r-- 1 onceday onceday 24426680 Feb 27 23:44 gdb-16.2.tar.xz -rw-rw-r-- 1 onceday onceday 11038556 Feb 27 23:44 gettext-0.23.1.tar.xz -rw-rw-r-- 1 onceday onceday 18752204 Feb 27 23:44 glibc-2.40.tar.xz -rw-rw-r-- 1 onceday onceday 2094196 Feb 27 23:44 gmp-6.3.0.tar.xz -rw-rw-r-- 1 onceday onceday 2035560 Feb 27 23:44 isl-0.26.tar.xz -rw-rw-r-- 1 onceday onceday 5166734 Feb 27 23:44 libiconv-1.16.tar.gz -rw-rw-r-- 1 onceday onceday 104565100 Feb 27 23:44 linux-4.14.329.tar.xz -rw-rw-r-- 1 onceday onceday 773573 Feb 27 23:44 mpc-1.3.1.tar.gz -rw-rw-r-- 1 onceday onceday 1493608 Feb 27 23:44 mpfr-4.2.1.tar.xz -rw-rw-r-- 1 onceday onceday 3612591 Feb 27 23:44 ncurses-6.4.tar.gz -rw-rw-r-- 1 onceday onceday 2642452 Feb 27 23:44 strace-6.13.tar.xz -rw-rw-r-- 1 onceday onceday 1305740 Feb 27 23:44 zlib-1.3.1.tar.xz -rw-rw-r-- 1 onceday onceday 2406875 Feb 27 23:44 zstd-1.5.6.tar.gz 然后启动ct-ng build即可,不过很容易在GLIBC和GCC编译过程中出错,所以最好是把crosstool-ng的调试打开,支持断点重试。
编译完成之后,可以将x-tools目录打包,作为工具链(GCC和LIBC集合体)。
编译的Target根目录是x-tools/aarch64-onceday-linux-gnu/aarch64-onceday-linux-gnu/sysroot。
onceday->gnu-tool:$ file ~/x-tools/aarch64-onceday-linux-gnu/aarch64-onceday-linux-gnu/sysroot/usr/bin/getent /home/onceday/x-tools/aarch64-onceday-linux-gnu/aarch64-onceday-linux-gnu/sysroot/usr/bin/getent: ELF 64-bit LSB executable, ARM aarch64, version 1(SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=888828ba766ed708f46a25db39a8422bd1044afe, for GNU/Linux 4.14.255, with debug_info, not stripped 这里面是预编译出来的二进制文件,可以在目标Linux系统直接运行:
root@linux:~# ./getent -v ./getent: invalid option -- 'v' Try `getent --help' or `getent --usage' formore information. 3. 附件(参考配置)
# # Automatically generated file; DO NOT EDIT. # crosstool-NG 1.27.0 Configuration # CT_CONFIGURE_has_static_link=y CT_CONFIGURE_has_cxx11=y CT_CONFIGURE_has_wget=y CT_CONFIGURE_has_curl=y CT_CONFIGURE_has_meson=y CT_CONFIGURE_has_ninja=y CT_CONFIGURE_has_make_3_81_or_newer=y CT_CONFIGURE_has_make_4_0_or_newer=y CT_CONFIGURE_has_libtool_2_4_or_newer=y CT_CONFIGURE_has_libtoolize_2_4_or_newer=y CT_CONFIGURE_has_autoconf_2_65_or_newer=y CT_CONFIGURE_has_autoreconf_2_65_or_newer=y CT_CONFIGURE_has_automake_1_15_or_newer=y CT_CONFIGURE_has_gnu_m4_1_4_12_or_newer=y CT_CONFIGURE_has_python_3_4_or_newer=y CT_CONFIGURE_has_bison_2_7_or_newer=y CT_CONFIGURE_has_bison_3_0_4_or_newer=y CT_CONFIGURE_has_python=y CT_CONFIGURE_has_git=y CT_CONFIGURE_has_md5sum=y CT_CONFIGURE_has_sha1sum=y CT_CONFIGURE_has_sha256sum=y CT_CONFIGURE_has_sha512sum=y CT_CONFIGURE_has_install_with_strip_program=y CT_VERSION="1.27.0" CT_CONFIG_VERSION_ENV="4" CT_CONFIG_VERSION_CURRENT="4" CT_CONFIG_VERSION="4" CT_MODULES=y # # Paths and misc options # # # crosstool-NG behavior # # CT_OBSOLETE is not set # CT_EXPERIMENTAL is not set # CT_DEBUG_CT is not set # # Paths # CT_LOCAL_TARBALLS_DIR="${HOME}/crosstool/src" CT_SAVE_TARBALLS=y # CT_TARBALLS_BUILDROOT_LAYOUT is not set CT_WORK_DIR="${CT_TOP_DIR}/.build" CT_BUILD_TOP_DIR="${CT_WORK_DIR:-${CT_TOP_DIR}/.build}/${CT_HOST:+HOST-${CT_HOST}/}${CT_TARGET}" CT_BUILD_DIR="${CT_BUILD_TOP_DIR}/build" CT_PREFIX_DIR="${CT_PREFIX:-${HOME}/x-tools}/${CT_HOST:+HOST-${CT_HOST}/}${CT_TARGET}" CT_RM_RF_PREFIX_DIR=y CT_REMOVE_DOCS=y CT_INSTALL_LICENSES=y CT_PREFIX_DIR_RO=y CT_STRIP_HOST_TOOLCHAIN_EXECUTABLES=y # CT_STRIP_TARGET_TOOLCHAIN_EXECUTABLES is not set # # Downloading # CT_DOWNLOAD_AGENT_WGET=y # CT_DOWNLOAD_AGENT_CURL is not set # CT_DOWNLOAD_AGENT_NONE is not set # CT_FORBID_DOWNLOAD is not set # CT_FORCE_DOWNLOAD is not set CT_CONNECT_TIMEOUT=10 CT_DOWNLOAD_WGET_OPTIONS="--tries=3 -nc --progress=dot:binary" # CT_ONLY_DOWNLOAD is not set # CT_USE_MIRROR is not set CT_VERIFY_DOWNLOAD_DIGEST=y CT_VERIFY_DOWNLOAD_DIGEST_SHA512=y # CT_VERIFY_DOWNLOAD_DIGEST_SHA256 is not set # CT_VERIFY_DOWNLOAD_DIGEST_SHA1 is not set # CT_VERIFY_DOWNLOAD_DIGEST_MD5 is not set CT_VERIFY_DOWNLOAD_DIGEST_ALG="sha512" # CT_VERIFY_DOWNLOAD_SIGNATURE is not set # # Extracting # # CT_FORCE_EXTRACT is not set CT_OVERRIDE_CONFIG_GUESS_SUB=y # CT_ONLY_EXTRACT is not set CT_PATCH_BUNDLED=y # CT_PATCH_BUNDLED_LOCAL is not set CT_PATCH_ORDER="bundled" # # Build behavior # CT_PARALLEL_JOBS=0 CT_USE_PIPES=y # CT_CONFIG_SHELL_SH is not set # CT_CONFIG_SHELL_ASH is not set CT_CONFIG_SHELL_BASH=y # CT_CONFIG_SHELL_CUSTOM is not set CT_CONFIG_SHELL="${bash}" # # Logging # # CT_LOG_ERROR is not set # CT_LOG_WARN is not set # CT_LOG_INFO is not set CT_LOG_EXTRA=y # CT_LOG_ALL is not set # CT_LOG_DEBUG is not set CT_LOG_LEVEL_MAX="EXTRA" # CT_LOG_SEE_TOOLS_WARN is not set CT_LOG_PROGRESS_BAR=y CT_LOG_TO_FILE=y CT_LOG_FILE_COMPRESS=y # end of Paths and misc options # # Target options # # CT_ARCH_ALPHA is not set # CT_ARCH_ARC is not set CT_ARCH_ARM=y # CT_ARCH_AVR is not set # CT_ARCH_BPF is not set # CT_ARCH_M68K is not set # CT_ARCH_MIPS is not set # CT_ARCH_NIOS2 is not set # CT_ARCH_POWERPC is not set # CT_ARCH_PRU is not set # CT_ARCH_RISCV is not set # CT_ARCH_S390 is not set # CT_ARCH_SH is not set # CT_ARCH_SPARC is not set # CT_ARCH_X86 is not set # CT_ARCH_XTENSA is not set CT_ARCH="arm" CT_ARCH_CHOICE_KSYM="ARM" CT_ARCH_ARM_SHOW=y # # Options for arm # CT_ALL_ARCH_CHOICES="ALPHA ARC ARM AVR BPF C6X LM32 LOONGARCH M68K MICROBLAZE MIPS MOXIE MSP430 NIOS2 OPENRISC PARISC POWERPC PRU RISCV S390 SH SPARC TRICORE X86 XTENSA" # CT_OMIT_TARGET_VENDOR is not set # # Generic target options # # CT_MULTILIB is not set CT_DEMULTILIB=y CT_ARCH_SUPPORTS_BOTH_MMU=y CT_ARCH_DEFAULT_HAS_MMU=y CT_ARCH_USE_MMU=y CT_ARCH_SUPPORTS_FLAT_FORMAT=y CT_ARCH_SUPPORTS_LIBSANITIZER=y CT_ARCH_SUPPORTS_EITHER_ENDIAN=y CT_ARCH_DEFAULT_LE=y # CT_ARCH_BE is not set CT_ARCH_LE=y CT_ARCH_ENDIAN="little" CT_ARCH_SUPPORTS_32=y CT_ARCH_SUPPORTS_64=y CT_ARCH_DEFAULT_32=y CT_ARCH_BITNESS=64 # CT_ARCH_32 is not set CT_ARCH_64=y # # Target optimisations # CT_ARCH_SUPPORTS_WITH_ARCH=y CT_ARCH_SUPPORTS_WITH_CPU=y CT_ARCH_SUPPORTS_WITH_TUNE=y CT_ARCH_EXCLUSIVE_WITH_CPU=y # end of Target options # # Toolchain options # # # General toolchain options # CT_FORCE_SYSROOT=y CT_USE_SYSROOT=y CT_SYSROOT_NAME="sysroot" CT_WANTS_STATIC_LINK=y CT_WANTS_STATIC_LINK_CXX=y CT_STATIC_TOOLCHAIN=y CT_SHOW_CT_VERSION=y # # Tuple completion and aliasing # CT_TARGET_VENDOR="onceday" # # Toolchain type # CT_CROSS=y # CT_CANADIAN is not set CT_TOOLCHAIN_TYPE="cross" # # Build system # # # Misc options # CT_TOOLCHAIN_ENABLE_NLS=y # end of Toolchain options # # Operating System # CT_KERNEL_SUPPORTS_SHARED_LIBS=y # CT_KERNEL_BARE_METAL is not set CT_KERNEL_LINUX=y CT_KERNEL="linux" CT_KERNEL_CHOICE_KSYM="LINUX" CT_KERNEL_LINUX_SHOW=y # # Options for linux # CT_KERNEL_LINUX_PKG_KSYM="LINUX" CT_LINUX_DIR_NAME="linux" CT_LINUX_PKG_NAME="linux" CT_LINUX_SRC_RELEASE=y # CT_LINUX_SRC_DEVEL is not set CT_LINUX_PATCH_ORDER="global" # CT_LINUX_V_6_13 is not set # CT_LINUX_V_6_12 is not set # CT_LINUX_V_6_11 is not set # CT_LINUX_V_6_10 is not set # CT_LINUX_V_6_9 is not set # CT_LINUX_V_6_8 is not set # CT_LINUX_V_6_7 is not set # CT_LINUX_V_6_6 is not set # CT_LINUX_V_6_5 is not set # CT_LINUX_V_6_4 is not set # CT_LINUX_V_6_3 is not set # CT_LINUX_V_6_2 is not set # CT_LINUX_V_6_1 is not set # CT_LINUX_V_6_0 is not set # CT_LINUX_V_5_19 is not set # CT_LINUX_V_5_18 is not set # CT_LINUX_V_5_17 is not set # CT_LINUX_V_5_16 is not set # CT_LINUX_V_5_15 is not set # CT_LINUX_V_5_14 is not set # CT_LINUX_V_5_13 is not set # CT_LINUX_V_5_12 is not set # CT_LINUX_V_5_11 is not set # CT_LINUX_V_5_10 is not set # CT_LINUX_V_5_9 is not set # CT_LINUX_V_5_8 is not set # CT_LINUX_V_5_7 is not set # CT_LINUX_V_5_4 is not set # CT_LINUX_V_5_3 is not set # CT_LINUX_V_5_2 is not set # CT_LINUX_V_5_1 is not set # CT_LINUX_V_5_0 is not set # CT_LINUX_V_4_20 is not set # CT_LINUX_V_4_19 is not set # CT_LINUX_V_4_18 is not set # CT_LINUX_V_4_17 is not set # CT_LINUX_V_4_16 is not set # CT_LINUX_V_4_15 is not set CT_LINUX_V_4_14=y # CT_LINUX_V_4_13 is not set # CT_LINUX_V_4_12 is not set # CT_LINUX_V_4_11 is not set # CT_LINUX_V_4_10 is not set # CT_LINUX_V_4_9 is not set # CT_LINUX_V_4_4 is not set # CT_LINUX_V_4_1 is not set # CT_LINUX_V_3_16 is not set # CT_LINUX_V_3_13 is not set # CT_LINUX_V_3_12 is not set # CT_LINUX_V_3_10 is not set CT_LINUX_VERSION="4.14.329" CT_LINUX_MIRRORS="$(CT_Mirrors kernel.org linux ${CT_LINUX_VERSION})" CT_LINUX_ARCHIVE_FILENAME="@{pkg_name}-@{version}" CT_LINUX_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" CT_LINUX_ARCHIVE_FORMATS=".tar.xz .tar.gz" CT_LINUX_SIGNATURE_FORMAT="unpacked/.sign" CT_LINUX_5_19_or_older=y CT_LINUX_older_than_5_19=y CT_LINUX_5_12_or_older=y CT_LINUX_older_than_5_12=y CT_LINUX_5_5_or_older=y CT_LINUX_older_than_5_5=y CT_LINUX_5_3_or_older=y CT_LINUX_older_than_5_3=y CT_LINUX_later_than_4_8=y CT_LINUX_4_8_or_later=y CT_LINUX_later_than_3_7=y CT_LINUX_3_7_or_later=y CT_LINUX_REQUIRE_3_7_or_later=y CT_LINUX_later_than_3_2=y CT_LINUX_3_2_or_later=y CT_LINUX_REQUIRE_3_2_or_later=y CT_KERNEL_has_rsync=y CT_KERNEL_DEP_RSYNC=y CT_KERNEL_LINUX_VERBOSITY_0=y # CT_KERNEL_LINUX_VERBOSITY_1 is not set # CT_KERNEL_LINUX_VERBOSITY_2 is not set CT_KERNEL_LINUX_VERBOSE_LEVEL=0 CT_KERNEL_LINUX_INSTALL_CHECK=y CT_ALL_KERNEL_CHOICES="BARE_METAL LINUX WINDOWS" # # Common kernel options # CT_SHARED_LIBS=y # end of Operating System # # Binary utilities # CT_ARCH_BINFMT_ELF=y CT_BINUTILS_BINUTILS=y CT_BINUTILS="binutils" CT_BINUTILS_CHOICE_KSYM="BINUTILS" CT_BINUTILS_BINUTILS_SHOW=y # # Options for binutils # CT_BINUTILS_BINUTILS_PKG_KSYM="BINUTILS" CT_BINUTILS_DIR_NAME="binutils" CT_BINUTILS_USE_GNU=y # CT_BINUTILS_USE_ORACLE is not set CT_BINUTILS_USE="BINUTILS" CT_BINUTILS_PKG_NAME="binutils" CT_BINUTILS_SRC_RELEASE=y # CT_BINUTILS_SRC_DEVEL is not set CT_BINUTILS_PATCH_ORDER="global" CT_BINUTILS_V_2_43=y # CT_BINUTILS_V_2_42 is not set # CT_BINUTILS_V_2_41 is not set # CT_BINUTILS_V_2_40 is not set # CT_BINUTILS_V_2_39 is not set # CT_BINUTILS_V_2_38 is not set # CT_BINUTILS_V_2_37 is not set # CT_BINUTILS_V_2_36 is not set # CT_BINUTILS_V_2_35 is not set # CT_BINUTILS_V_2_34 is not set # CT_BINUTILS_V_2_33 is not set # CT_BINUTILS_V_2_32 is not set # CT_BINUTILS_V_2_31 is not set # CT_BINUTILS_V_2_30 is not set # CT_BINUTILS_V_2_29 is not set # CT_BINUTILS_V_2_28 is not set # CT_BINUTILS_V_2_27 is not set # CT_BINUTILS_V_2_26 is not set CT_BINUTILS_VERSION="2.43.1" CT_BINUTILS_MIRRORS="$(CT_Mirrors GNU binutils) $(CT_Mirrors sourceware binutils/releases)" CT_BINUTILS_ARCHIVE_FILENAME="@{pkg_name}-@{version}" CT_BINUTILS_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" CT_BINUTILS_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz" CT_BINUTILS_SIGNATURE_FORMAT="packed/.sig" CT_BINUTILS_later_than_2_41=y CT_BINUTILS_2_41_or_later=y CT_BINUTILS_later_than_2_39=y CT_BINUTILS_2_39_or_later=y CT_BINUTILS_later_than_2_30=y CT_BINUTILS_2_30_or_later=y CT_BINUTILS_later_than_2_27=y CT_BINUTILS_2_27_or_later=y CT_BINUTILS_later_than_2_26=y CT_BINUTILS_2_26_or_later=y # # GNU binutils # CT_BINUTILS_GOLD_SUPPORTS_ARCH=y CT_BINUTILS_GOLD_SUPPORT=y CT_BINUTILS_FORCE_LD_BFD_DEFAULT=y # CT_BINUTILS_LINKER_LD is not set CT_BINUTILS_LINKER_LD_GOLD=y CT_BINUTILS_GOLD_INSTALLED=y CT_BINUTILS_GOLD_THREADS=y CT_BINUTILS_LINKER_BOTH=y CT_BINUTILS_LINKERS_LIST="ld,gold" # CT_BINUTILS_LD_WRAPPER is not set CT_BINUTILS_LINKER_DEFAULT="bfd" # CT_BINUTILS_PLUGINS is not set CT_BINUTILS_RELRO=m CT_BINUTILS_DETERMINISTIC_ARCHIVES=y # CT_BINUTILS_FOR_TARGET is not set CT_ALL_BINUTILS_CHOICES="BINUTILS" # end of Binary utilities # # C-library # CT_LIBC_GLIBC=y # CT_LIBC_MUSL is not set # CT_LIBC_UCLIBC_NG is not set CT_LIBC="glibc" CT_LIBC_CHOICE_KSYM="GLIBC" CT_LIBC_GLIBC_SHOW=y # # Options for glibc # CT_LIBC_GLIBC_PKG_KSYM="GLIBC" CT_GLIBC_DIR_NAME="glibc" CT_GLIBC_USE_GNU=y # CT_GLIBC_USE_ORACLE is not set CT_GLIBC_USE="GLIBC" CT_GLIBC_PKG_NAME="glibc" CT_GLIBC_SRC_RELEASE=y # CT_GLIBC_SRC_DEVEL is not set CT_GLIBC_PATCH_ORDER="global" # CT_GLIBC_V_2_41 is not set CT_GLIBC_V_2_40=y # CT_GLIBC_V_2_39 is not set # CT_GLIBC_V_2_38 is not set # CT_GLIBC_V_2_37 is not set # CT_GLIBC_V_2_36 is not set # CT_GLIBC_V_2_35 is not set # CT_GLIBC_V_2_34 is not set # CT_GLIBC_V_2_33 is not set # CT_GLIBC_V_2_32 is not set # CT_GLIBC_V_2_31 is not set # CT_GLIBC_V_2_30 is not set # CT_GLIBC_V_2_29 is not set # CT_GLIBC_V_2_28 is not set # CT_GLIBC_V_2_27 is not set # CT_GLIBC_V_2_26 is not set # CT_GLIBC_V_2_25 is not set # CT_GLIBC_V_2_24 is not set # CT_GLIBC_V_2_23 is not set # CT_GLIBC_V_2_19 is not set # CT_GLIBC_V_2_17 is not set CT_GLIBC_VERSION="2.40" CT_GLIBC_MIRRORS="$(CT_Mirrors GNU glibc)" CT_GLIBC_ARCHIVE_FILENAME="@{pkg_name}-@{version}" CT_GLIBC_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" CT_GLIBC_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz" CT_GLIBC_SIGNATURE_FORMAT="packed/.sig" CT_GLIBC_2_41_or_older=y CT_GLIBC_older_than_2_41=y CT_GLIBC_later_than_2_38=y CT_GLIBC_2_38_or_later=y CT_GLIBC_later_than_2_37=y CT_GLIBC_2_37_or_later=y CT_GLIBC_later_than_2_36=y CT_GLIBC_2_36_or_later=y CT_GLIBC_later_than_2_34=y CT_GLIBC_2_34_or_later=y CT_GLIBC_later_than_2_32=y CT_GLIBC_2_32_or_later=y CT_GLIBC_later_than_2_31=y CT_GLIBC_2_31_or_later=y CT_GLIBC_later_than_2_30=y CT_GLIBC_2_30_or_later=y CT_GLIBC_later_than_2_29=y CT_GLIBC_2_29_or_later=y CT_GLIBC_later_than_2_28=y CT_GLIBC_2_28_or_later=y CT_GLIBC_later_than_2_27=y CT_GLIBC_2_27_or_later=y CT_GLIBC_later_than_2_26=y CT_GLIBC_2_26_or_later=y CT_GLIBC_later_than_2_25=y CT_GLIBC_2_25_or_later=y CT_GLIBC_later_than_2_24=y CT_GLIBC_2_24_or_later=y CT_GLIBC_later_than_2_23=y CT_GLIBC_2_23_or_later=y CT_GLIBC_later_than_2_20=y CT_GLIBC_2_20_or_later=y CT_GLIBC_later_than_2_17=y CT_GLIBC_2_17_or_later=y CT_GLIBC_later_than_2_14=y CT_GLIBC_2_14_or_later=y CT_GLIBC_DEP_KERNEL_HEADERS_VERSION=y CT_GLIBC_DEP_BINUTILS=y CT_GLIBC_DEP_GCC=y CT_GLIBC_DEP_PYTHON=y CT_THREADS="nptl" CT_GLIBC_BUILD_SSP=y CT_GLIBC_HAS_LIBIDN_ADDON=y # CT_GLIBC_USE_LIBIDN_ADDON is not set CT_GLIBC_NO_SPARC_V8=y CT_GLIBC_HAS_OBSOLETE_LIBCRYPT=y CT_GLIBC_ENABLE_DEBUG=y # CT_GLIBC_ENABLE_OBSOLETE_LIBCRYPT is not set # CT_GLIBC_DISABLE_VERSIONING is not set CT_GLIBC_FORCE_UNWIND=y # CT_GLIBC_LOCALES is not set # CT_GLIBC_KERNEL_VERSION_NONE is not set CT_GLIBC_KERNEL_VERSION_AS_HEADERS=y # CT_GLIBC_KERNEL_VERSION_CHOSEN is not set CT_GLIBC_MIN_KERNEL="4.14.329" CT_GLIBC_SSP_DEFAULT=y # CT_GLIBC_SSP_NO is not set # CT_GLIBC_SSP_YES is not set # CT_GLIBC_SSP_ALL is not set # CT_GLIBC_SSP_STRONG is not set CT_GLIBC_ENABLE_WERROR=y # CT_GLIBC_ENABLE_COMMON_FLAG is not set CT_ALL_LIBC_CHOICES="AVR_LIBC GLIBC MINGW_W64 MOXIEBOX MUSL NEWLIB NONE PICOLIBC UCLIBC_NG" CT_LIBC_SUPPORT_THREADS_ANY=y CT_LIBC_SUPPORT_THREADS_NATIVE=y # # Common C library options # CT_THREADS_NATIVE=y # CT_CREATE_LDSO_CONF is not set CT_LIBC_XLDD=y # end of C-library # # C compiler # CT_CC_CORE_NEEDED=y CT_CC_SUPPORT_CXX=y CT_CC_SUPPORT_FORTRAN=y CT_CC_SUPPORT_ADA=y CT_CC_SUPPORT_D=y CT_CC_SUPPORT_JIT=y CT_CC_SUPPORT_OBJC=y CT_CC_SUPPORT_OBJCXX=y CT_CC_SUPPORT_GOLANG=y CT_CC_GCC=y CT_CC="gcc" CT_CC_CHOICE_KSYM="GCC" CT_CC_GCC_SHOW=y # # Options for gcc # CT_CC_GCC_PKG_KSYM="GCC" CT_GCC_DIR_NAME="gcc" CT_GCC_USE_GNU=y # CT_GCC_USE_ORACLE is not set CT_GCC_USE="GCC" CT_GCC_PKG_NAME="gcc" CT_GCC_SRC_RELEASE=y # CT_GCC_SRC_DEVEL is not set CT_GCC_PATCH_ORDER="global" # CT_GCC_V_14 is not set CT_GCC_V_13=y # CT_GCC_V_12 is not set # CT_GCC_V_11 is not set # CT_GCC_V_10 is not set # CT_GCC_V_9 is not set # CT_GCC_V_8 is not set # CT_GCC_V_7 is not set # CT_GCC_V_6 is not set CT_GCC_VERSION="13.3.0" CT_GCC_MIRRORS="$(CT_Mirrors GNU gcc/gcc-${CT_GCC_VERSION}) $(CT_Mirrors sourceware gcc/releases/gcc-${CT_GCC_VERSION})" CT_GCC_ARCHIVE_FILENAME="@{pkg_name}-@{version}" CT_GCC_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" CT_GCC_ARCHIVE_FORMATS=".tar.xz .tar.gz" CT_GCC_14_or_older=y CT_GCC_older_than_14=y CT_GCC_later_than_13=y CT_GCC_13_or_later=y CT_GCC_later_than_12=y CT_GCC_12_or_later=y CT_GCC_later_than_11=y CT_GCC_11_or_later=y CT_GCC_later_than_10=y CT_GCC_10_or_later=y CT_GCC_later_than_9=y CT_GCC_9_or_later=y CT_GCC_later_than_8=y CT_GCC_8_or_later=y CT_GCC_later_than_7=y CT_GCC_7_or_later=y CT_GCC_later_than_6=y CT_GCC_6_or_later=y CT_GCC_REQUIRE_6_or_later=y CT_GCC_later_than_5=y CT_GCC_5_or_later=y CT_GCC_REQUIRE_5_or_later=y CT_GCC_later_than_4_9=y CT_GCC_4_9_or_later=y CT_GCC_REQUIRE_4_9_or_later=y CT_CC_GCC_GOLD=y CT_CC_GCC_HAS_LIBMPX=y CT_CC_GCC_STATIC_LIBSTDCXX=y # CT_CC_GCC_SYSTEM_ZLIB is not set CT_CC_GCC_CONFIG_TLS=m # # Optimisation features # CT_CC_GCC_USE_GRAPHITE=y # CT_CC_GCC_USE_LTO is not set # # Settings for libraries running on target # # CT_CC_GCC_ENABLE_DEFAULT_PIE is not set CT_CC_GCC_ENABLE_TARGET_OPTSPACE=y CT_CC_GCC_LIBSTDCXX=m # CT_CC_GCC_LIBSTDCXX_HOSTED_DISABLE is not set # CT_CC_GCC_LIBMUDFLAP is not set # CT_CC_GCC_LIBGOMP is not set # CT_CC_GCC_LIBSSP is not set # CT_CC_GCC_LIBQUADMATH is not set CT_CC_GCC_LIBSANITIZER=m CT_CC_GCC_LIBSTDCXX_VERBOSE=m # # Misc. obscure options. # CT_CC_CXA_ATEXIT=y CT_CC_GCC_TM_CLONE_REGISTRY=m # CT_CC_GCC_DISABLE_PCH is not set CT_CC_GCC_SJLJ_EXCEPTIONS=m CT_CC_GCC_LDBL_128=m CT_CC_GCC_BUILD_ID=y CT_CC_GCC_LNK_HASH_STYLE_DEFAULT=y # CT_CC_GCC_LNK_HASH_STYLE_SYSV is not set # CT_CC_GCC_LNK_HASH_STYLE_GNU is not set # CT_CC_GCC_LNK_HASH_STYLE_BOTH is not set CT_CC_GCC_DEC_FLOATS_AUTO=y # CT_CC_GCC_DEC_FLOATS_BID is not set # CT_CC_GCC_DEC_FLOATS_DPD is not set # CT_CC_GCC_DEC_FLOATS_NO is not set CT_ALL_CC_CHOICES="GCC" # # Additional supported languages: # CT_CC_LANG_CXX=y # CT_CC_LANG_FORTRAN is not set # end of C compiler # # Linkers # # # BFD enabled in binutils # # # GOLD enabled in binutils # # CT_LINKER_MOLD is not set CT_ALL_LINKER_CHOICES="MOLD" # end of Linkers # # Debug facilities # # CT_DEBUG_DUMA is not set CT_DEBUG_GDB=y CT_DEBUG_GDB_PKG_KSYM="GDB" CT_GDB_DIR_NAME="gdb" CT_GDB_PKG_NAME="gdb" CT_GDB_SRC_RELEASE=y # CT_GDB_SRC_DEVEL is not set CT_GDB_PATCH_ORDER="global" CT_GDB_V_16=y # CT_GDB_V_15 is not set # CT_GDB_V_14 is not set # CT_GDB_V_13 is not set # CT_GDB_V_12 is not set # CT_GDB_V_11 is not set # CT_GDB_V_10 is not set # CT_GDB_V_9 is not set # CT_GDB_V_8_3 is not set CT_GDB_VERSION="16.2" CT_GDB_MIRRORS="$(CT_Mirrors GNU gdb) $(CT_Mirrors sourceware gdb/releases)" CT_GDB_ARCHIVE_FILENAME="@{pkg_name}-@{version}" CT_GDB_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" CT_GDB_ARCHIVE_FORMATS=".tar.xz .tar.gz" CT_GDB_later_than_16=y CT_GDB_16_or_later=y CT_GDB_later_than_15=y CT_GDB_15_or_later=y CT_GDB_later_than_14=y CT_GDB_14_or_later=y CT_GDB_later_than_13=y CT_GDB_13_or_later=y CT_GDB_later_than_12=y CT_GDB_12_or_later=y CT_GDB_later_than_11=y CT_GDB_11_or_later=y CT_GDB_later_than_10=y CT_GDB_10_or_later=y CT_GDB_later_than_8_3=y CT_GDB_8_3_or_later=y CT_GDB_CROSS=y CT_GDB_CROSS_STATIC=y # CT_GDB_CROSS_SIM is not set # CT_GDB_NATIVE is not set CT_GDB_GDBSERVER=y # CT_GDB_NATIVE_BUILD_IPA_LIB is not set # CT_GDB_NATIVE_STATIC_LIBSTDCXX is not set CT_GDB_GDBSERVER_TOPLEVEL=y CT_GDB_CC_LD_LIBTOOL=y # CT_DEBUG_LTRACE is not set CT_DEBUG_STRACE=y CT_DEBUG_STRACE_PKG_KSYM="STRACE" CT_STRACE_DIR_NAME="strace" CT_STRACE_PKG_NAME="strace" CT_STRACE_SRC_RELEASE=y # CT_STRACE_SRC_DEVEL is not set CT_STRACE_PATCH_ORDER="global" CT_STRACE_V_6_13=y CT_STRACE_VERSION="6.13" CT_STRACE_MIRRORS="https://strace.io/files/${CT_STRACE_VERSION} https://github.com/strace/strace/releases/download/v${CT_STRACE_VERSION}" CT_STRACE_ARCHIVE_FILENAME="@{pkg_name}-@{version}" CT_STRACE_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" CT_STRACE_ARCHIVE_FORMATS=".tar.xz" CT_ALL_DEBUG_CHOICES="DUMA GDB LTRACE STRACE" # end of Debug facilities # # Companion libraries # # CT_COMPLIBS_CHECK is not set # CT_COMP_LIBS_CLOOG is not set CT_COMP_LIBS_EXPAT=y CT_COMP_LIBS_EXPAT_PKG_KSYM="EXPAT" CT_EXPAT_DIR_NAME="expat" CT_EXPAT_PKG_NAME="expat" CT_EXPAT_SRC_RELEASE=y # CT_EXPAT_SRC_DEVEL is not set CT_EXPAT_PATCH_ORDER="global" CT_EXPAT_V_2_5=y CT_EXPAT_VERSION="2.5.0" CT_EXPAT_MIRRORS="http://downloads.sourceforge.net/project/expat/expat/${CT_EXPAT_VERSION} https://github.com/libexpat/libexpat/releases/download/R_${CT_EXPAT_VERSION//./_}" CT_EXPAT_ARCHIVE_FILENAME="@{pkg_name}-@{version}" CT_EXPAT_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" CT_EXPAT_ARCHIVE_FORMATS=".tar.xz .tar.lz .tar.bz2 .tar.gz" CT_COMP_LIBS_GETTEXT=y CT_COMP_LIBS_GETTEXT_PKG_KSYM="GETTEXT" CT_GETTEXT_DIR_NAME="gettext" CT_GETTEXT_PKG_NAME="gettext" CT_GETTEXT_SRC_RELEASE=y # CT_GETTEXT_SRC_DEVEL is not set CT_GETTEXT_PATCH_ORDER="global" CT_GETTEXT_V_0_23_1=y # CT_GETTEXT_V_0_22_5 is not set # CT_GETTEXT_V_0_21 is not set # CT_GETTEXT_V_0_20_1 is not set # CT_GETTEXT_V_0_19_8_1 is not set CT_GETTEXT_VERSION="0.23.1" CT_GETTEXT_MIRRORS="$(CT_Mirrors GNU gettext)" CT_GETTEXT_ARCHIVE_FILENAME="@{pkg_name}-@{version}" CT_GETTEXT_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" CT_GETTEXT_ARCHIVE_FORMATS=".tar.xz .tar.gz" CT_GETTEXT_SIGNATURE_FORMAT="packed/.sig" CT_GETTEXT_later_than_0_23=y CT_GETTEXT_0_23_or_later=y CT_GETTEXT_later_than_0_21=y CT_GETTEXT_0_21_or_later=y CT_GETTEXT_INCOMPATIBLE_WITH_UCLIBC_NG=y # # This version of gettext is not compatible with uClibc-NG. Select # # # a different version if uClibc-NG is used on the target or (in a # # # Canadian cross build) on the host. # CT_COMP_LIBS_GMP=y CT_COMP_LIBS_GMP_PKG_KSYM="GMP" CT_GMP_DIR_NAME="gmp" CT_GMP_PKG_NAME="gmp" CT_GMP_SRC_RELEASE=y # CT_GMP_SRC_DEVEL is not set CT_GMP_PATCH_ORDER="global" CT_GMP_V_6_3=y # CT_GMP_V_6_2 is not set # CT_GMP_V_6_1 is not set CT_GMP_VERSION="6.3.0" CT_GMP_MIRRORS="https://gmplib.org/download/gmp https://gmplib.org/download/gmp/archive $(CT_Mirrors GNU gmp)" CT_GMP_ARCHIVE_FILENAME="@{pkg_name}-@{version}" CT_GMP_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" CT_GMP_ARCHIVE_FORMATS=".tar.xz .tar.lz .tar.bz2" CT_GMP_SIGNATURE_FORMAT="packed/.sig" CT_COMP_LIBS_ISL=y CT_COMP_LIBS_ISL_PKG_KSYM="ISL" CT_ISL_DIR_NAME="isl" CT_ISL_PKG_NAME="isl" CT_ISL_SRC_RELEASE=y # CT_ISL_SRC_DEVEL is not set CT_ISL_PATCH_ORDER="global" CT_ISL_V_0_26=y # CT_ISL_V_0_25 is not set # CT_ISL_V_0_24 is not set # CT_ISL_V_0_23 is not set # CT_ISL_V_0_22 is not set # CT_ISL_V_0_21 is not set # CT_ISL_V_0_20 is not set # CT_ISL_V_0_19 is not set # CT_ISL_V_0_18 is not set # CT_ISL_V_0_17 is not set # CT_ISL_V_0_16 is not set # CT_ISL_V_0_15 is not set CT_ISL_VERSION="0.26" CT_ISL_MIRRORS="https://libisl.sourceforge.io" CT_ISL_ARCHIVE_FILENAME="@{pkg_name}-@{version}" CT_ISL_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" CT_ISL_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz" CT_ISL_later_than_0_18=y CT_ISL_0_18_or_later=y CT_ISL_later_than_0_15=y CT_ISL_0_15_or_later=y CT_COMP_LIBS_LIBELF=y CT_COMP_LIBS_LIBELF_PKG_KSYM="LIBELF" CT_LIBELF_DIR_NAME="libelf" CT_LIBELF_PKG_NAME="libelf" CT_LIBELF_SRC_RELEASE=y # CT_LIBELF_SRC_DEVEL is not set CT_LIBELF_PATCH_ORDER="global" CT_LIBELF_V_0_8=y CT_LIBELF_VERSION="0.8.13" CT_LIBELF_MIRRORS="https://fossies.org/linux/misc/old http://oe-lite.org/mirror/libelf/ http://ftp.osuosl.org/pub/blfs/conglomeration/libelf/" CT_LIBELF_ARCHIVE_FILENAME="@{pkg_name}-@{version}" CT_LIBELF_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" CT_LIBELF_ARCHIVE_FORMATS=".tar.gz" CT_COMP_LIBS_LIBICONV=y CT_COMP_LIBS_LIBICONV_PKG_KSYM="LIBICONV" CT_LIBICONV_DIR_NAME="libiconv" CT_LIBICONV_PKG_NAME="libiconv" CT_LIBICONV_SRC_RELEASE=y # CT_LIBICONV_SRC_DEVEL is not set CT_LIBICONV_PATCH_ORDER="global" CT_LIBICONV_V_1_16=y # CT_LIBICONV_V_1_15 is not set CT_LIBICONV_VERSION="1.16" CT_LIBICONV_MIRRORS="$(CT_Mirrors GNU libiconv)" CT_LIBICONV_ARCHIVE_FILENAME="@{pkg_name}-@{version}" CT_LIBICONV_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" CT_LIBICONV_ARCHIVE_FORMATS=".tar.gz" CT_LIBICONV_SIGNATURE_FORMAT="packed/.sig" CT_COMP_LIBS_MPC=y CT_COMP_LIBS_MPC_PKG_KSYM="MPC" CT_MPC_DIR_NAME="mpc" CT_MPC_PKG_NAME="mpc" CT_MPC_SRC_RELEASE=y # CT_MPC_SRC_DEVEL is not set CT_MPC_PATCH_ORDER="global" CT_MPC_V_1_3=y CT_MPC_VERSION="1.3.1" CT_MPC_MIRRORS="https://www.multiprecision.org/downloads $(CT_Mirrors GNU mpc)" CT_MPC_ARCHIVE_FILENAME="@{pkg_name}-@{version}" CT_MPC_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" CT_MPC_ARCHIVE_FORMATS=".tar.gz" CT_MPC_SIGNATURE_FORMAT="packed/.sig" CT_MPC_later_than_1_1_0=y CT_MPC_1_1_0_or_later=y CT_COMP_LIBS_MPFR=y CT_COMP_LIBS_MPFR_PKG_KSYM="MPFR" CT_MPFR_DIR_NAME="mpfr" CT_MPFR_PKG_NAME="mpfr" CT_MPFR_SRC_RELEASE=y # CT_MPFR_SRC_DEVEL is not set CT_MPFR_PATCH_ORDER="global" CT_MPFR_V_4_2=y CT_MPFR_VERSION="4.2.1" CT_MPFR_MIRRORS="https://www.mpfr.org/mpfr-${CT_MPFR_VERSION} $(CT_Mirrors GNU mpfr)" CT_MPFR_ARCHIVE_FILENAME="@{pkg_name}-@{version}" CT_MPFR_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" CT_MPFR_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz .zip" CT_MPFR_SIGNATURE_FORMAT="packed/.asc" CT_MPFR_later_than_4_0_0=y CT_MPFR_4_0_0_or_later=y CT_COMP_LIBS_NCURSES=y CT_COMP_LIBS_NCURSES_PKG_KSYM="NCURSES" CT_NCURSES_DIR_NAME="ncurses" CT_NCURSES_PKG_NAME="ncurses" CT_NCURSES_SRC_RELEASE=y # CT_NCURSES_SRC_DEVEL is not set CT_NCURSES_PATCH_ORDER="global" CT_NCURSES_V_6_4=y # CT_NCURSES_V_6_2 is not set # CT_NCURSES_V_6_1 is not set # CT_NCURSES_V_6_0 is not set CT_NCURSES_VERSION="6.4" CT_NCURSES_MIRRORS="https://invisible-mirror.net/archives/ncurses $(CT_Mirrors GNU ncurses)" CT_NCURSES_ARCHIVE_FILENAME="@{pkg_name}-@{version}" CT_NCURSES_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" CT_NCURSES_ARCHIVE_FORMATS=".tar.gz" CT_NCURSES_SIGNATURE_FORMAT="packed/.sig" CT_NCURSES_NEW_ABI=y CT_NCURSES_HOST_DISABLE_DB=y CT_NCURSES_HOST_FALLBACKS="linux,xterm,xterm-color,xterm-256color,vt100" # CT_NCURSES_TARGET_DISABLE_DB is not set CT_COMP_LIBS_ZLIB=y CT_COMP_LIBS_ZLIB_PKG_KSYM="ZLIB" CT_ZLIB_DIR_NAME="zlib" CT_ZLIB_PKG_NAME="zlib" CT_ZLIB_SRC_RELEASE=y # CT_ZLIB_SRC_DEVEL is not set CT_ZLIB_PATCH_ORDER="global" CT_ZLIB_V_1_3_1=y # CT_ZLIB_V_1_2_13 is not set CT_ZLIB_VERSION="1.3.1" CT_ZLIB_MIRRORS="https://github.com/madler/zlib/releases/download/v${CT_ZLIB_VERSION} https://www.zlib.net/" CT_ZLIB_ARCHIVE_FILENAME="@{pkg_name}-@{version}" CT_ZLIB_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" CT_ZLIB_ARCHIVE_FORMATS=".tar.xz .tar.gz" CT_ZLIB_SIGNATURE_FORMAT="packed/.asc" CT_COMP_LIBS_ZSTD=y CT_COMP_LIBS_ZSTD_PKG_KSYM="ZSTD" CT_ZSTD_DIR_NAME="zstd" CT_ZSTD_PKG_NAME="zstd" CT_ZSTD_SRC_RELEASE=y # CT_ZSTD_SRC_DEVEL is not set CT_ZSTD_PATCH_ORDER="global" CT_ZSTD_V_1_5_6=y # CT_ZSTD_V_1_5_5 is not set # CT_ZSTD_V_1_5_2 is not set CT_ZSTD_VERSION="1.5.6" CT_ZSTD_MIRRORS="https://github.com/facebook/zstd/releases/download/v${CT_ZSTD_VERSION} https://www.zstd.net/" CT_ZSTD_ARCHIVE_FILENAME="@{pkg_name}-@{version}" CT_ZSTD_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" CT_ZSTD_ARCHIVE_FORMATS=".tar.gz" CT_ZSTD_SIGNATURE_FORMAT="packed/.sig" CT_ALL_COMP_LIBS_CHOICES="CLOOG EXPAT GETTEXT GMP GNUPRUMCU ISL LIBELF LIBICONV MPC MPFR NCURSES NEWLIB_NANO PICOLIBC ZLIB ZSTD" CT_LIBICONV_NEEDED=y CT_GETTEXT_NEEDED=y CT_GMP_NEEDED=y CT_MPFR_NEEDED=y CT_ISL_NEEDED=y CT_MPC_NEEDED=y CT_EXPAT_NEEDED=y CT_NCURSES_NEEDED=y CT_ZLIB_NEEDED=y CT_ZSTD_NEEDED=y CT_LIBICONV=y CT_GETTEXT=y CT_GMP=y CT_MPFR=y CT_ISL=y CT_MPC=y CT_EXPAT=y CT_NCURSES=y CT_ZLIB=y CT_ZSTD=y # end of Companion libraries # # Companion tools # # CT_COMP_TOOLS_FOR_HOST is not set # CT_COMP_TOOLS_AUTOCONF is not set # CT_COMP_TOOLS_AUTOMAKE is not set # CT_COMP_TOOLS_BISON is not set # CT_COMP_TOOLS_DTC is not set # CT_COMP_TOOLS_LIBTOOL is not set # CT_COMP_TOOLS_M4 is not set # CT_COMP_TOOLS_MAKE is not set CT_ALL_COMP_TOOLS_CHOICES="AUTOCONF AUTOMAKE BISON DTC LIBTOOL M4 MAKE" # end of Companion tools Once Day
也信美人终作土,不堪幽梦太匆匆......
如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!
(。◕‿◕。)感谢您的阅读与支持~~~