第 6 章 编译器和开发工具
下面的章节包含 RHEL 9 和 RHEL 10 之间的编译器和开发工具的最显著更改。
RHEL 10.0 中提供的初始版本
RHEL 10.0 提供以下系统工具链组件:
- GCC 14.2
- glibc 2.39
- annobin 12.92
- binutils 2.41
RHEL 10.0 提供以下性能工具和调试器:
- GDB 14.2
- Valgrind 3.24.0
- SystemTap 5.2
- Dyninst 12.3.0
- elfutils 0.192
- libabigail 2.6
RHEL 10.0 提供以下性能监控工具:
- PCP 6.3.7
- Grafana 10.2.6
RHEL 10.0 提供以下编译器工具集:
- LLVM Toolset 19.1.7
- Rust Toolset 1.84.1
- Go Toolset 1.23.2
RHEL 10 在版本 3.30.5 中提供 cmake
				RHEL 10 提供 cmake 版本 3.30.5。有关显著变化,请参阅 上游发行注记。
			
RHEL 10 在 1.84.0 版本中提供 Rust Toolset
RHEL 10 提供了 1.84.0 版中的 Rust Toolset。自之前可用的版本 1.79.0 以来的显著改进包括:
- 
					新的 LazyCell和LazyLock类型会延迟初始化,直到第一次使用为止。它们使用每个实例中包含的初始化功能扩展了之前的OnceCell和OnceLock类型。
- 标准库中的新排序实现提高了运行时性能和编译时间。它们还会尝试检测比较器没有产生总顺序的情况,从而使其 panic 而不是返回未排序的数据。
- 
					添加了对不透明返回类型的精确捕获。新的 use<..>语法指定了impl Trait返回类型中使用的通用参数和生命周期。
- 添加了 - const代码的许多新功能,例如:- 浮点支持
- 
							直接用于内联汇编的 const
- 对静态的引用
- 可变引用和指针
 
- 添加了 - 不安全代码的许多新功能,例如:- 严格的来源 API
- 
							&raw指针语法
- 安全寻址静态
- 
							在不安全的 extern块中声明安全项
 
- 
					Cargo 依赖项解析器现在是版本感知的。如果依赖项 crate 指定了其最低支持的 Rust 版本,则 Cargo 会在解析依赖关系图时使用此信息,而不是使用最新的兼容 semver的 crate 版本。
兼容性备注:
- 
					WebAssembly System Interface(WASI)目标从 rust-std-static-wasm32-wasi变为rust-std-static-wasm32-wasip1。您还可以通过在命令行上使用--target wasm32-wasip1参数来选择 WASI 目标。如需更多信息,请参阅 对 Rust 的 WASI 目标的更改 上游博客文章。
- 
					分割的 panic 钩子和 panic 处理程序参数 core::panic::PanicInfo和std::panic::PanicInfo现在是不同的类型。
- 
					现在,在 uncaught panics 上中止需要使用 extern "C-unwind"指令而不是extern "C"以允许跨 ABI 边界拔掉。
Rust Toolset 是滚动应用程序流,红帽只支持最新版本。如需更多信息,请参阅 Red Hat Enterprise Linux 应用程序流生命周期 文档。
LLVM Toolset 提供给 19.1.7
LLVM Toolset 提供版本 19.1.7。
LLVM 编译器的显著变化:
- LLVM 现在使用 debug 记录,一种更有效的调试信息的表示方法。
Clang 的显著变化:
- C++14 大小的释放现在被默认启用。
- C++17 支持已完成。
- 已添加了对 C++20 支持的改进,尤其是围绕模块、概念和 Class Template Argument Deduction(CTAD)。
- 添加了对 C23、C2c、C23 和 C2y 支持的改进。
如需更多信息,请参阅 LLVM 发行注记 和 Clang 发行注记。
Go Toolset 版本 1.23 中提供
RHEL 10.0 在版本 1.23 中提供 Go Toolset。主要改进包括:
- for-range循环接受以下类型的迭代函数:- 
							func(func() bool)
- 
							func(func(K) bool)
- func(func(K, V) bool)- 调用迭代参数函数会为 - for-range循环创建迭代值。有关参考链接,请参阅 上游发行注记。
 
- 
							
- Go Toolchain 可以收集使用情况和中断统计信息,以帮助 Go 团队了解 Go Toolchain 是如何使用和工作的。默认情况下,Go Telemetry 不会上传遥测数据,仅保存在本地。如需更多信息,请参阅 上游 Go Telemetry 文档。
- 
					go vet子命令包含stdversion分析器,它标记对引用文件中使用的 Go 版本而言太新的符号的引用。
- 
					cmd和cgo功能支持-ldflags选项,来将标记传递给 C 链接器。当您使用非常大的CGO_LDFLAGS环境变量时,go命令会自动使用这个标志来避免argument list too long错误。
- 
					trace工具容许部分破坏的追踪,并尝试恢复追踪数据。这在崩溃时特别有用,因为您可以获得导致崩溃的追踪。
- 
					在未处理的 panic 或其他致命错误后打印的回溯带有缩进,以区分第一个 goroutine中的goroutine的堆栈追踪。
- 使用 profile-guided 优化的编译器构建时间开销被降低到个位数百分比。
- 
					新的 -bindnow链接器标志在构建动态链接的 ELF 二进制文件时启用立即函数绑定。
- 
					//go:linkname链接器指令不再在标准库和在其定义上没有标记//go:linkname的运行时中引用内部符号。
- 
					如果程序不再引用 Timer或Ticker,则垃圾收集会立即清理它们,即使它们的Stop方法还没有调用。与Timer或Ticker关联的计时器渠道现在未被缓冲,容量为 0。这确保每次调用Reset或Stop方法时,在调用后不会发送或接收过时的值。
- 
					新的 unique软件包为规范化值(如interning或hash-consing)提供工具。
- 
					新的 iter软件包提供基本的定义,来与用户定义的迭代器一起工作。
- 
					slices和maps软件包引入了几个与迭代器一起工作的新功能。
- 
					新的 structs软件包为 struct 字段提供了类型,其修改包含 struct 类型的属性,如内存布局。
- 以下软件包中进行了细微更改: - 
							archive/tar
- 
							crypto/tls
- 
							crypto/x509
- 
							database/sql
- 
							debug/elf
- 
							encoding/binary
- 
							go/ast
- 
							go/types
- 
							math/rand/v2
- 
							net
- 
							net/http
- 
							net/http/httptest
- 
							net/netips
- 
							path/filepath
- 
							reflect
- 
							runtime/debug
- 
							runtime/pprof
- 
							runtime/trace
- 
							slices
- 
							sync
- 
							sync/atomic
- 
							syscall
- 
							testing/fstest
- 
							text/template
- 
							time
- 
							unicode/utf16
 
- 
							
如需更多信息,请参阅 上游发行注记。
Go Toolset 是一个滚动应用程序流,红帽只支持最新版本。如需更多信息,请参阅 Red Hat Enterprise Linux 应用程序流生命周期 文档。LLVM Toolset 是一个滚动应用程序流,只支持最新版本。如需更多信息,请参阅 Red Hat Enterprise Linux 应用程序流生命周期 文档。
GCC 14 默认为 x86-64-v3
RHEL 10 中的 GCC 14 默认为 x86-64-v3 微架构级别。这个级别默认启用某些功能,如 AVX 和 AVX2 指令集,以及 fused multiply-add (FMA)指令集。详情请查看 相关文章。
更改了对 GCC 14 中 C 代码编译的错误进行警告
				从 GCC 14 开始,一些 C 警告已提升到错误,如隐式 int 类型、隐式函数声明,以及使用指针作为整数。在这个版本中,当开发人员忽略这些警告时,可能会破坏应用程序构建。开发人员现在必须解决这些问题才能成功编译。如需更多信息,请参阅 移植到 GCC 14。
			
GCC 默认为在 IBM Power 系统上使用 IEEE128 浮点格式
				在 RHEL10 中,GCC 默认使用 IEEE128 浮点格式,用于 IBM Power 系统上所有长时间双重浮动点号,而不是更早版本的 IBM-DOUBLE-DOUBLE 代码。因此,您可以使用较长的浮点数来注意到 C 或 C++ 代码的性能改进。
			
			请注意,这个 128 位较长的浮点 ABI 与 RHEL 8 及更早的版本中使用的浮点 ABI 不兼容。从 IBM POWER9 开始,支持执行 IEEE128 操作的硬件指令。
		
NSCD 被 systemd-resolved 和 sssd替代
				nscd 缓存守护进程已从 RHEL 10 中删除。GNU C 库(glibc)继续使用可用的替换:
			
- 
					如果您需要 DNS 缓存,请安装并启用 systemd-resolved服务。
- 
					如果您需要对任何其他名称服务的缓存,请安装和配置 sssd服务。
grafana、PCP 和 grafana-pcp 现在使用 Valkey 存储数据
				在 RHEL 10 中,Valkey key-value 存储取代了 Redis。因此,Grafana、PCP 和 grafana-pcp 插件现在使用 Valkey 存储数据,而不是 Redis。grafana-pcp 插件中的 PCP Redis 数据源现在命名为 PCP Valkey。
			
新版本的 TBB 不兼容
RHEL 10 包括线程构建块(TBB)库版本 2021.11.0,它与之前发布的 RHEL 版本不兼容。您必须重建使用 TBB 的应用程序以便在 RHEL 10 中运行。
zlib-ng中的显著性能改进
				zlib-ng 库提供了大量性能改进,因此 RHEL 10 将传统的 zlib 实现替换为 zlib-ng。
			
			使用 zlib-ng 2.0.0 的基准测试结果:
		
- 
					解压缩比 zlib快 57%。
- 
					压缩速度比 zlib快 400%。
			RHEL 10.0 提供较新的 zlib-ng 2.2.3 版本,其中包含进一步显著的性能改进和优化。
		
Red Hat build of OpenJDK 21 是 RHEL 10 中的默认 Java 实现
				默认的 RHEL 10 Java 实现是 OpenJDK 21。使用 java-21-openjdk 软件包,它提供 OpenJDK 21 Java 运行时环境和 OpenJDK 21 Java 软件开发套件。如需更多信息,请参阅 OpenJDK 文档。