4.14. 编译器和开发工具

RHEL 9 支持 IBM POWER10 处理器

从 Linux 内核中,通过系统工具链(GCC、binutils、glibc)Red Hat Enterprise Linux 9 已被更新,使其包含对 IBM 的最新 POWER 处理器( POWER10)的支持。RHEL 9 适用于 POWER10 上的工作负载,在以后的版本中有所改进。

(BZ#2027596)

GCC 11.2.1 可用

RHEL 9 由 GCC 版本 11.2.1 提供。重要的程序错误修复和增强包括:

一般改进

  • GCC 现在默认为 DWARF 版本 5 调试格式。
  • 诊断中显示的列号默认为实际列号并尊重多列字符。
  • 直接线性代码向向量化时,会考虑整个功能。
  • 如果每个条件表达式中包含比较同一变量,则可以将一系列条件表达式转换为 switch 语句。
  • 流程优化改进:

    • 新的 IPA-modref pass 由 -fipa-modref 选项控制,跟踪函数调用的副作用并改进点分析的精度。
    • 通过 -fipa-icf 选项控制相同的代码是明显的,以增加统一功能的数量并减少编译内存使用。
  • 链路优化改进:

    • 链接时间优化(LTO)可让编译器通过在链接时使用其中间表示,在程序的所有转换单元中执行各种优化。如需更多信息,请参阅 链接时间优化
    • 改进了连接过程中的内存分配,以减少峰值内存用量。
  • 在 IDE 中使用新的 GCC_EXTRA_DIAGNOSTIC_OUTPUT 环境变量,您可以在不调整构建标志的情况下请求机器可读的"fix-it hints"。
  • -fanalyzer 选项运行的静态分析器会显著提高,提供很多程序错误修复和增强。

特定于语言的改进

C family

  • C 和 C++ 编译器支持 OpenMP 构造和 OpenMP 5.0 规范的"非恢复循环"例程。
  • 属性:

    • 新的 no_stack_protector 属性标记不应通过堆栈保护来检测的功能(-fstack-protector)。
    • 改进的 malloc 属性可用于识别分配器和放大器 API 对。
  • 新警告:

    • -Wsizeof-array-div 通过 -Wall 选项启用,它会警告两个 sizeof 操作符的不同(当第一个应用到一个数组,而 divisor 与数组的大小不同时)。
    • -Wstringop-overread 默认启用,警告字符串对字符串功能的调用,尝试将以参数形式传递给它们的阵列结束。
  • 增强的警告:

    • -Wfree-nonheap-object 检测到更多调用实例来利用没有从动态内存分配功能返回的指针来取消分配函数。
    • -Wmaybe-uninitialized 诊断将指针和引用未初始化的内存传递给使用 const-qualified参数的功能。
    • -Wuninitialized 检测到从未初始化动态分配的内存中读取。

C

  • 通过 -std=c2x-std=gnu2x 选项支持来自即将发布的 C2X 版本中的几个新功能。例如:

    • 支持 标准属性。
    • 支持 __has_c_attribute preprocessor operator。
    • 标签可能会在 compound 语句的末尾出现。

C++

  • 默认模式改为 -std=gnu++17
  • 现在,C++ 库 libstdc++ 改进了 C++17 支持。
  • 实施了几个新的 C++20 功能。请注意,C++20 支持是实验性的。

    有关功能的更多信息,请参阅 C++20 语言功能

  • C++ 前端对一些即将出现的 C++23 草案功能提供了实验性支持。
  • 新警告:

    • -Wctad-maybe-unsupported(默认禁用),提醒在类型为 deduction 指南中的执行类模板参数。
    • -Wrange-loop-construct (由 -Wall 启用),当基于范围循环时警告是创建不必要的且资源低效的副本。
    • -Wmismatched-new-delete (由 -Wall 启用),警告对 Operator 的调用,并发出从不匹配形式的 Operator 返回的指针,或从其他不匹配分配功能返回。
    • -Wvexing-parse (默认启用)会警告大多数 vexing 解析规则:当声明与变量定义类似时,C++ 语言需要被解释为函数声明。

特定于架构的改进

64 位 ARM 架构

  • Armv8-R 架构通过 -march=armv8-r 选项进行支持。
  • GCC 可自动执行增加、减法、乘法、乘法和减去复杂数字上的操作。

AMD 和 Intel 64 位构架

  • 添加了对 Intel AVX-VNNI 的新 ISA 扩展支持。-mavxvnni 编译器切换控制 AVX-VNNI 内部。
  • 新的 -march=znver3 选项支持基于 znver3 内核的 AMD CPU。
  • the x86-64 psABI supplement 中定义的三个微架构级别通过新的 -march=x86-64-v2-march=x86-64-v3-march=x86-64-v4 选项支持。

IBM Z 架构

  • GCC 11.2.1 默认为 IBM z14 处理器。

IBM Power 系统

  • GCC 11.2.1 默认为 IBM POWER9 处理器。
  • GCC 编译器现在支持使用新的 -mcpu=power10 命令行选项的 POWER10 指令

(BZ#1986836, BZ#1870016, BZ#1870025, BZ#1870028, BZ#2019811, BZ#2047296)

用于捕获 glibc 优化数据的新命令

新的 ld.so --list-diagnostics 命令可以捕获影响 glibc 优化决策的数据,如在一个机器可读的文件中的 IFUNC 选择和 glibc-hwcaps 配置。

(BZ#2023422)

binutils 的显著变化

RHEL 9 对 binutils 包括以下更改:

  • binutils 现在支持 Intel 的 AMX/TMUL 指令集,从而提高了可利用此新功能的应用程序的性能。
  • assembler、linker 和其它二进制工具现在支持 POWER10 指令。

(BZ#2030554, BZ#1870021)

sched_getcpu 实现现在可以(可选)使用 rseq (可重启序列)来在 64 位 ARM 架构和其他架构上提高性能

以前 64 位 ARM 架构上的 sched_getcpu 实现使用 getcpu 系统调用,其在大多数并行算法中的使用效率太慢。其他架构使用 vDSO(虚拟动态共享对象)加速来临时解决这个问题。使用 rseq 实现 sched_getcpu 大幅提高了 64 位 ARM 架构上的性能。其他架构有略微改进。

要将 sched_getcpu 配置为使用 rseq,请设置 GLIBC_TUNABLES=glibc.pthread.rseq=1 环境变量:

# GLIBC_TUNABLES=glibc.pthread.rseq=1
# export GLIBC_TUNABLES

(BZ#2024347)

更新了性能工具和调试器

RHEL 9.0 提供了以下性能工具和调试器:

  • GDB 10.2
  • Valgrind 3.18.1
  • SystemTap 4.6
  • Dyninst 11.0.0
  • elfutils 0.186

(BZ#2019806)

DAWR 功能在 IBM POWER10 上的 GDB 中进行了改进

RHEL 9 提供了 GDB 10.2,它改进了 DAWR 功能。在 IBM POWER10 处理器上为 GDB 启用新的硬件观察点功能。例如,添加了一组新的 DAWR/DAWRX 寄存器。

(BZ#1870029)

GDB 支持 IBM POWER10 的新前缀指令

GDB 10.2 完全支持 POWER10 上的 Power ISA 3.1 前缀的说明,它包括了八个字节的前缀指令。在 RHEL 8.4 中,GDB 只支持四字节说明。

(BZ#1870031)

RHEL 9 提供了 boost 1.75.0

RHEL 9 提供了 boost 软件包版本 1.75.0。与 1.67.0 版本相比,重要的程序错误修复和增强包括:

  • Boost.Signals 库已被删除,并替换为只包括标头的 Boost.Signals2 组件。
  • boost-jam 软件包中的 bjam 工具已被 boost-b2 软件包中的 b2 替代。
  • 新的库:

    • Boost.Contracts
    • Boost.HOF
    • Boost.YAP
    • Boost.Safe Numerics
    • Boost.Outcome
    • Boost.Histogram
    • Boost.Variant2
    • Boost.Nowide
    • Boost.StaticString
    • Boost.STL_Interfaces
    • Boost.JSON
    • Boost.LEAF
    • Boost.PFR

(BZ#1957950)

RHEL 9 提供 LLVM Toolset 13.0.1

RHEL 9 提供 LLVM Toolset 版本 13.0.1 提供。与版本 12.0.1 相比,重要的程序错误修复和增强包括:

  • clang 现在支持带有声明属性 [[clang::musttail]](在 C++ 中)和 __attribute__((musttail))(在 C中)的保证 tial 调用。
  • clang 现在支持 -Wreserved-identifier 警告,它会在代码中使用保留标识符时警告开发人员。
  • clang 的 -Wshadow 标志现在还检查影子结构的绑定。
  • Clang 的 -Wextra 现在也意味着 -Wnull-pointer-subtraction
  • clang 现在支持带有声明属性 [[clang::musttail]](在 C++ 中)和 __attribute__((musttail))(在 C中)的保证 tial 调用。

在 RHEL 9 中,您可以作为 RPM 软件包轻松地安装 llvm-toolset

(BZ#2001107)

CMake 3.20.2 中的显著变化

RHEL 9 提供了 CMake 3.20.2。要在需要版本 3.20.2 或 less 的项目中使用 CMake,请使用命令 cmake_minimum_required(版本 3.20.2)。

主要变更包括:

  • 现在,可以使用目标属性 CXX_STANDARD, CUDA_STANDARD, OBJCXX_STANDARD 或通过使用编译功能中的 cxx_std_23 元功能功能来指定 C++23 的编译器模式。
  • CUDA 语言支持现在允许 NVIDIA CUDA 编译器是符号链接。
  • Intel oneAPI NextGen LLVM 编译器现在支持 IntelLLVM 编译器 ID。
  • cmake 现在通过与 Android NDK 的工具链文件合并来促进 Android 的跨编译。
  • 运行 cmake(1) 以生成项目构建系统时,现在拒绝以连字符开头的未知命令行参数。

有关新功能和已弃用功能的更多信息,请参阅 CMake 发行注记

(BZ#1957948)

RHEL 9 提供 Go 1.17.7

RHEL 9 与 Go Toolset 版本 1.17.7 一同发布。与 1.16.7 版本相比,重要的程序错误修复和增强包括:

  • 添加了将片段转换为数组指针的选项。
  • 添加了对 //go:build 行的支持。
  • 在 amd64 上功能调用性能的改进。
  • 在堆栈追踪中更明确地格式化函数参数。
  • 包括闭包的函数可以是 inline 模式。
  • 对 x509 证书进行解析的过程减少了资源消耗。

在 RHEL 9 中,您可以轻松地安装 go-toolset 作为 RPM 软件包。

(BZ#2014087)

OpenSSL 3 支持 go FIPS 模式

现在,在使用 Go FIPS 模式时,您可以使用 OpenSSL 3 库。

(BZ#1984110)

RHEL 9 提供 Rust Toolset 1.58.1

RHEL 9 提供了 Rust Toolset 版本 1.58.1。与 1.54.0 版本相比,重要的程序错误修复和增强包括:

  • Rust 编译器现在支持语言的 2021 版,其特点是闭包中的分离捕获、用于数组的 IntoIterator 、一个新的 Cargo 功能解析器等等。
  • 添加了对新自定义配置文件的 Cargo 支持。
  • Cargo 去掉了重复的编译器错误。
  • 添加了新的开放范围模式。
  • 以格式字符串形式添加了捕获的标识符。

如需更多信息,请参阅 Rust 1.55Rust 1.56Rust 1.57Rust 1.58

在 RHEL 9 中,您可以轻松地安装 rust-toolset 作为 RPM 软件包。

(BZ#2002885)

RHEL 9 提供 pcp 软件包版本 5.3.5

RHEL 9 带有 Performance Co-Pilot(pcp)软件包 5.3.5 版。自 5.3.1 版本开始,添加了新的 pcp-pmda-bpf 子软件包,从 eBPF 程序提供使用 BPF CO-RE(libbpfBTF)的性能数据。

(BZ#1991764)

用于访问 PCP 中的 SQL 服务器指标的 Active Directory 身份验证

在这个版本中,系统管理员可以配置 pmdamssql(1),以使用 Active Directory(AD)身份验证安全地连接到 SQL Server 指标。

(BZ#1847808)

新的 pcp-ss PCP 工具现在可用

pcp-ss PCP 实用程序报告 pmdasockets(1) PMDA 收集的套接字统计。命令与许多 ss 命令行选项和报告格式兼容。它还在实时模式下提供本地或远程监控的优势,以及之前记录的 PCP 归档重新显示历史。

(BZ#1981223)

RHEL 9 提供 grafana 7.5.11

RHEL 9 带有 grafana 软件包版本 7.5.11。与版本 7.5.9 相比的主要变化包括:

  • 添加了一个新的准备时间序列转换,以向后兼容不支持新数据帧格式的面板。
  • 更新了密码恢复功能,以使用 HMAC-SHA-256 而不是 SHA-1 生成密码重置令牌。

(BZ#1993215)

RHEL 9 提供 grafana-pcp 3.2.0

RHEL 9 提供 grafana-pcp 软件包版本 3.2.0。与版本 3.1.0 相比,重要的程序错误修复和增强包括:

  • 为 PCP Redis 添加了一个新的 MS SQL 服务器仪表盘。
  • 在 PCP Vector eBPF/BCC Overview 仪表盘中添加了空直方存储桶。
  • 修复了 PCP Redis 的 metric() 函数没有返回所有指标名称的错误。

(BZ#1993156)

通过在 grafana-pcp中 Vector 数据源的中央 pmproxy 来访问远程主机

在一些环境中网络策略不允许从仪表板查看器浏览器中直接连接到受监控的主机的连接。在这个版本中,可以自定义 hostspec 以连接到中央 pmproxy,后者将请求转发到单个主机。

(BZ#1845592)

新软件包:ansible-pcp

ansible-pcp 软件包包含 Performance Co-Pilot(PCP)和相关软件的角色,如 Redis 和 Grafana,用于实施 metrics RHEL 系统角色。

(BZ#1957566)

RHEL 9 提供 python-jsonpointer 2.0

RHEL 9 提供 python-jsonpointer 软件包版本 2.0。

与版本 1.9 相比的主要变化包括:

  • Python 版本 2.6 和 3.3 已被弃用。
  • python-jsonpointer 模块现在会自动检查无效转义序列的指针。
  • 现在,您可以在命令行中以参数形式编写指针。
  • 指针不能以 URL 编码的格式提交。

(BZ#1980256)

.NET 6.0 可用

RHEL 9 带有 .NET 版本 6.0。主要改进包括:

  • 支持 64 位 Arm(aarch64)
  • 支持 IBM Z 和 LinuxONE(s390x)

如需更多信息,请参阅 .NET 6.0 RPM 软件包.NET 6.0 容器发行注记

.NET 6.0 是此应用程序流的初始版本,您可以作为一个 RPM 软件包轻松地安装它。.NET 6.0 的生命周期比 RHEL 9 的生命周期短。详情请查看 Red Hat Enterprise Linux 应用程序流生命周期文档

(BZ#1986211)

RHEL 9 中的 Java 实现

RHEL 9 AppStream 软件仓库包括:

  • java-17-openjdk 软件包,提供 OpenJDK 17 Java 运行时环境和 OpenJDK 17 Java 软件开发组件。
  • java-11-openjdk 软件包,提供 OpenJDK 11 Java 运行时环境和 OpenJDK 11 Java 软件开发组件。
  • java-1.8.0-openjdk 软件包,提供 OpenJDK 8 Java 运行时环境和开源 JDK 8 Java 软件开发组件。

如需更多信息,请参阅 OpenJDK 文档

(BZ#2021262)

RHEL 9 中的 Java 工具

RHEL 9 AppStream 存储库包括以下 Java 工具:

  • Maven 3.6.3,一种软件项目管理和理解工具。
  • Ant 1.10.9,一种用于编译、汇编、测试和运行 Java 应用程序的 Java 库和命令行工具。

Maven 3.6Ant 1.10 是这些 Application Streams 的初始版本,您可以作为非模块化 RPM 软件包轻松安装。

(BZ#1951482)

CRB 存储库中提供的 SWIG 4.0

CodeReady Linux Builder(CRB)存储库中提供了 Simplified Wrapper 和 Interface Generator(SWIG)版本 4.0。此发行版本添加了对 PHP 8 的支持。

在 RHEL 9 中,您可以轻松地安装 SWIG 作为 RPM 软件包。

请注意,不支持 CodeReady Linux Builder 存储库中包含的软件包。

(BZ#1943580)