第 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.2.3 的结果:
-
解压缩速度比
zlib快 378%。 -
压缩速度比
zlib快 423%。
Red Hat build of OpenJDK 21 是 RHEL 10 中的默认 Java 实现
默认的 RHEL 10 Java 实现是 OpenJDK 21。使用 java-21-openjdk 软件包,它提供 OpenJDK 21 Java 运行时环境和 OpenJDK 21 Java 软件开发套件。如需更多信息,请参阅 OpenJDK 文档。
32 位 ARM 和 MIPS 后端从 RHEL 10.1 中的 llvm 中删除
RHEL 10.1 中的 llvm 软件包删除了 32 位 ARM 和 MIPS 后端。这个变化减少了工具链的构建时间和维护工作。如果您需要这些后端,您应该使用替代的构建目标或更早的软件包版本。