第 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 以来的显著改进包括:

  • 新的 LazyCellLazyLock 类型会延迟初始化,直到第一次使用为止。它们使用每个实例中包含的初始化功能扩展了之前的 OnceCellOnceLock 类型。
  • 标准库中的新排序实现提高了运行时性能和编译时间。它们还会尝试检测比较器没有产生总顺序的情况,从而使其 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::PanicInfostd::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 版本而言太新的符号的引用。
  • cmdcgo 功能支持 -ldflags 选项,来将标记传递给 C 链接器。当您使用非常大的 CGO_LDFLAGS 环境变量时,go 命令会自动使用这个标志来避免 argument list too long 错误。
  • trace 工具容许部分破坏的追踪,并尝试恢复追踪数据。这在崩溃时特别有用,因为您可以获得导致崩溃的追踪。
  • 在未处理的 panic 或其他致命错误后打印的回溯带有缩进,以区分第一个 goroutine 中的 goroutine 的堆栈追踪。
  • 使用 profile-guided 优化的编译器构建时间开销被降低到个位数百分比。
  • 新的 -bindnow 链接器标志在构建动态链接的 ELF 二进制文件时启用立即函数绑定。
  • //go:linkname 链接器指令不再在标准库和在其定义上没有标记 //go:linkname 的运行时中引用内部符号。
  • 如果程序不再引用 TimerTicker,则垃圾收集会立即清理它们,即使它们的 Stop 方法还没有调用。与 TimerTicker 关联的计时器渠道现在未被缓冲,容量为 0。这确保每次调用 ResetStop 方法时,在调用后不会发送或接收过时的值。
  • 新的 unique 软件包为规范化值(如 interninghash-consing)提供工具。
  • 新的 iter 软件包提供基本的定义,来与用户定义的迭代器一起工作。
  • slicesmaps 软件包引入了几个与迭代器一起工作的新功能。
  • 新的 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 操作的硬件指令。

NSCDsystemd-resolvedsssd替代

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 存储数据,而不是 Redisgrafana-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 文档

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat