第 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 文档。