4.12. 编译器和开发工具

Go Toolset rebase 到版本 1.16.7

Go Toolset 已升级至版本 1.16.7。主要变更包括:

  • 现在,GO111MODULE 环境变量默认被设为 on。要恢复此设置,请将 GO111MODULE 更改为 auto
  • Go linker 现在使用较少的资源,并提高了代码的稳健性和可维护性。这适用于所有支持的架构和操作系统。
  • 使用新的 embed 软件包,您可以在编译程序的同时访问嵌入的文件。
  • io/ioutil 软件包的所有功能都已移到 ioos 软件包中。虽然您仍然可以使用 io/ioutil,但 ioos 软件包提供更好的定义。
  • Delve 调试器已被 rebase 到 1.6.0,现在支持 Go 1.16.7 Toolset。

如需更多信息,请参阅 使用 Go Toolset

(BZ#1938071)

Rust Toolset rebase 到版本 1.54.0

Rust Toolset 已更新至版本 1.54.0。主要变更包括:

  • Rust 标准库现在可用于 wasm32-unknown-unknown 目标。有了这个更新,您可以生成 WebAssembly 二进制文件,包括新稳定的内部函数。
  • Rust 现在包括数组的 IntoIterator 实现。有了这个增强,您可以使用 IntoIterator 特征来按值迭代数组,并将数组传递给方法。但是,array.into_iter() 仍会通过引用来迭代值,直到 Rust 的 2021 版。
  • or 模式的语法现在允许在模式中的任何位置嵌套。例如:Pattern(1|2) 而不是 Pattern(1)|Pattern(2)
  • Unicode 标识符现在可以包含 Unicode 标准 #31 中定义的所有有效的标识符字符。
  • 方法和特征实现已经稳定。
  • 默认重新启用增量编译。

如需更多信息,请参阅 使用 Rust Toolset

(BZ#1945805)

LLVM Toolset rebase 到版本 12.0.1

LLVM Toolset 已升级到版本 12.0.1。主要变更包括:

  • 添加了新编译器标志 -march=x86-64-v[234]
  • Clang 编译器的编译器标志 -fasynchronous-unwind-tables 现在是 Linux AArch64/PowerPC 上的默认设置。
  • Clang 编译器现在支持 C++20 likelihood 属性 [[likely]] 和 [[unlikely]]。
  • 添加了新函数属性 tune-cpu。它允许独立于 target-cpu 属性或 TargetMachine CPU 来应用微架构优化。
  • 新的 sanitizer -fsanitize=unsigned-shift-base 已添加到整数 sanitizer -fsanitize=integer 以提高安全性。
  • PowerPC 目标上的代码生成已被优化。
  • WebAssembly 后端现在在 LLVM 中启用。有了这个增强,您可以使用 LLVM 和 Clang 生成 WebAsembly 二进制文件。

如需更多信息,请参阅使用 LLVM Toolset

(BZ#1927937)

CMake rebase 到版本 3.20.2

CMake 从 3.18.2 rebase 到 3.20.2。要在需要 3.20.2 或更低版本的项目上使用 CMake,请使用命令 cmake_minimum_required(版本 3.20.2)。

主要变更包括:

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

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

(BZ#1957947)

新的 GCC Toolset 11

GCC Toolset 11 是一个提供开发工具最新版本的编译器工具集。它以 AppStream 存储库中的 Software Collection 的形式作为 Application Stream 提供。

从 GCC Toolset 10 开始,以下组件已被 rebase:

  • GCC 到版本 11.2
  • GDB 到版本 10.2
  • Valgrind 到版本 3.17.0
  • SystemTap 到版本 4.5
  • binutils 到版本 2.36
  • elfutils 到版本 0.185
  • dwz 到版本 0.14
  • Annobin 到版本 9.85

有关组件的完整列表,请参阅 GCC Toolset 11

要安装 GCC Toolset 11,请以 root 用户身份运行以下命令:

# yum install gcc-toolset-11

要从 GCC Toolset 11 运行工具:

$ scl enable gcc-toolset-11 tool

要运行 shell 会话,其中 GCC Toolset 11 的工具版本会覆盖这些工具的系统版本:

$ scl enable gcc-toolset-11 bash

如需更多信息,请参阅 使用 GCC Toolset

GCC Toolset 11 组件也可以在两个容器镜像中找到:

  • rhel8/gcc-toolset-11-toolchain,其包括 GCC 编译器、GDB 调试器和 make 自动化工具。
  • rhel8/gcc-toolset-11-perftools,其包括性能监控工具,如 SystemTap 和 Valgrind。

要拉取容器镜像,以 root 身份运行以下命令:

# podman pull registry.redhat.io/<image_name>

请注意,现在只支持 GCC Toolset 11 容器镜像。之前 GCC Toolset 版本的容器镜像已弃用。

(BZ#1953094)

.NET 更新至版本 6.0

Red Hat Enterprise Linux 8.5 与 .NET 版本 6.0 一起发布。主要改进包括:

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

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

(BZ#2022794)

GCC Toolset 11:GCC rebase 到版本 11.2

在 GCC Toolset 11 中,GCC 软件包已更新至版本 11.2。重要的程序错误修复和增强包括:

常规改进

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

    • 新的 IPA-modref 传递,由 -fipa-modref 选项控制,跟踪函数调用的副作用,并提高点分析的准确性。
    • 相同的代码折叠传递,由 -fipa-icf 选项控制,得到了极大改进,以增加统一功能的数量并减少编译时内存使用。
  • 链接时间优化改进:

    • 改进了链接期间的内存分配,以减低内存使用的峰值。
  • 在 IDE 中使用新的 GCC_EXTRA_DIAGNOSTIC_OUTPUT 环境变量,您可以请求机器可读的"fix-it hints",而不调整构建标志。
  • 通过 -fanalyzer 选项运行的静态分析器得到了显著改进,提供的很多 bug 修复和增强。

特定于语言的改进

C 系列

  • C 和 C++ 编译器支持 OpenMP 结构中的非矩形循环嵌套以及 OpenMP 5.0 规范的分配器例程。
  • 属性:

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

    • -Wsizeof-array-div-Wall 选项启用,当第一个运算符应用到数组,且除数不等于数组元素的大小时,会警告两个 sizeof 运算符的除法。
    • -Wstringop-overread(默认启用)会警告对字符串函数的调用,这些函数试图读取作为参数传递给它们的数组的末尾。
  • 增强的警告:

    • -Wfree-nonheap-object 使用不是从动态内存分配函数返回的指针检测更多调用取消分配函数的实例。
    • -Wmaybe-uninitialized 诊断将未初始化内存的指针和引用传给接受 const 限定参数的函数。
    • -Wuninitialized 检测来自未初始化动态分配的内存的读。

C

  • 通过 -std=c2x-std=gnu2x 选项支持来自 ISO C 标准的即将推出的 C2X 修订版的几个新功能。例如:

    • 支持 标准属性。
    • 支持 __has_c_attribute 预处理器运算符。
    • 标签可能会在声明之前和复合语句的末尾出现。

C++

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

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

  • C++ 前端对即将到来的 C++23 草案功能具有实验性支持。
  • 新警告:

    • -Wctad-maybe-unsupported, 默认禁用,警告在没有推导指南的类型上执行类模板参数推理。
    • 当基于范围的 for 循环创建不必要的和资源低效的副本时,由 -Wall 启用的 -Wrange-loop-construct 将发出警告。
    • -Wmismatched-new-delete-Wall 启用,警告有关使用从不匹配的运算符形式或从其他不匹配的分配函数返回的指针对操作符删除的调用。
    • -Wvexing-parse 默认启用,警告大多数 vexing 解析规则:当声明看起来像变量定义时,但 C++ 语言要求它被解释为函数声明。

特定于架构的改进

64 位 ARM 架构

  • Armv8-R 架构通过 -march=armv8-r 选项支持。
  • GCC 可自动矢量化对复杂数字执行加法、减法、乘法和累加和减法变体的操作。

AMD 和 Intel 64 位构架

  • 支持以下 Intel CPU:Sapphire Rapids、Alder Lake 和 Rocket Lake.
  • 添加了对 Intel AVX-VNNI 的新 ISA 扩展支持。-mavxvnni 编译器交换机控制 AVX-VNNI 内部函数。
  • 新的 -march=znver3 选项支持基于 znver3 核的 AMD CPU。
  • 新的 -march=x86-64-v2-march=x86-64-v3-march=x86-64-v4 选项支持 x86-64 psABI 补充 中定义的三个微架构级别。

(BZ#1946782)

GCC Toolset 11: dwz 现在支持 DWARF 5

在 GCC Toolset 11 中,sdwz 工具现在支持 DWARF 版本 5 调试格式。

(BZ#1948709)

GCC Toolset 11:GCC 现在支持 AIA 用户中断

在 GCC Toolset 11 中,GCC 现在支持 Accelerator Interfacing Architecture (AIA) 用户中断。

(BZ#1927516)

GCC Toolset 11:改进了通用 SVE 调优默认值

在 GCC Toolset 11 中,通用 SVE 调优默认值已在 64 位 ARM 架构得到了改进。

(BZ#1979715)

SystemTap rebase 到版本 4.5

SystemTap 软件包已更新至版本 4.5。重要的程序错误修复和增强包括:

  • 32 位浮点变量自动扩大到双变量,因此可作为 $context 变量直接访问。
  • enum 值可以作为 $context 变量访问。
  • BPF uconversions tapset 已扩展,并包含更多 tapset 函数,以访问用户空间中的值,如 user_long_error()
  • 并发控制得到了显著改进,以对大型服务器提供稳定的操作。

如需更多信息,请参阅上游 SystemTap 4.5 发行注记

(BZ#1933889)

elfutils rebase 到版本 0.185

elfutils 软件包已更新至版本 0.185。重要的程序错误修复和增强包括:

  • eu-elflinteu-readelf 工具现在识别并显示 ELF 部分上的 SHF_GNU_RETAINSHT_X86_64_UNWIND 标志。
  • DEBUGINFOD_SONAME 宏已添加到 debuginfod.h。此宏可与 dlopen 函数一起使用,以从应用程序动态加载 libdebuginfod.so 库。
  • 新的函数 debuginfod_set_verbose_fd 已添加到 debuginfod-client 库。此函数通过将详细输出重定向到单独的文件来增强 debuginfod_find_* 查询功能。
  • 设置 DEBUGINFOD_VERBOSE 环境变量现在显示有关 debuginfod 客户端连接到哪些服务器以及这些服务器的 HTTP 响应的更多信息。
  • debuginfod 服务器提供了一个新的线程繁忙指标和更详细的错误指标,以便更轻松地检查运行在 debuginfod 服务器上的进程。
  • libdw 库现在透明地处理 DW_FORM_indirect 位置值,以便 dwarf_whatform 函数返回属性的实际 FORM。
  • 为减少网络流量,debuginfod-client 库会在缓存中存储负结果,客户端对象可以重复使用现有连接。

(BZ#1933890)

Valgrind rebase 到版本 3.17.0

Valgrind 软件包已更新至版本 3.17.0。重要的程序错误修复和增强包括:

  • Valgrind 可以读取 DWARF 版本 5 调试格式。
  • Valgrind 支持对 debuginfod 服务器的调试查询。
  • ARMv8.2 处理器指令被部分支持。
  • POWER10 处理器上的 Power ISA v.3.1 指令被部分支持。
  • 支持 IBM z14 处理器指令。
  • 大多数 IBM z15 指令都受到支持。Valgrind 工具套件支持 IBM z15 处理器的杂项指令扩展功能 3 和向量增强功能 2。因此,Valgrind 运行使用 GCC -march=z15 编译的程序,并提供改进的性能和调试体验。
  • --track-fds=yes option 尊重-q (--quiet),并默认忽略标准的文件描述符 stdinstdoutstderr。要跟踪标准的文件描述符,请使用 --track-fds=all 选项。
  • DHAT 工具有两种新的操作模式:--mode=copy--mode=ad-hoc

(BZ#1933891)

Dyninst rebase 到版本 11.0.0

Dyninst 软件包已更新至版本 11.0.0。重要的程序错误修复和增强包括:

  • 支持 debuginfod 服务器以及获取单独的 debuginfo 文件。
  • 改进了对过程链接表(PLT)存根的间接调用的检测。
  • 改进了 C++ 名称解译。
  • 修复了代码发送过程中的内存泄漏。

(BZ#1933893)

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

有了这个增强,为 IBM POWER10 处理器上的 GDB 启用了新的硬件监视器功能。例如,添加了一组新的 DAWR/DAWRX 寄存器。

(BZ#1854784)

GCC Toolset 11:GDB rebase 到版本 10.2

在 GCC Toolset 11 中,GDB 软件包已更新至版本 10.2。重要的程序错误修复和增强包括:

新特性

  • 在支持此功能的架构上默认启用了多线程符号加载。这个更改为带有许多符号的程序提供了更好的性能。
  • 文本用户界面(TUI)窗口可以水平排列。
  • GDB 支持同时调试多个目标连接,但这种支持是实验性的且有限的。例如,您可以将每个低端连接到运行在另一台计算机上的不同的远程服务器,或者您可以使用一个低端来调试本地原生进程或一个 core dump 或某些其他进程。

新的和改进的命令

  • 新的 tui new-layout name window weight [window weight…] 命令创建一个新的文本用户界面(TUI)布局,您也可以指定布局名称和显示的窗口。
  • 改进的 alias [-a] [--] alias = command [default-args] 命令可以在创建新别名时指定默认参数。
  • set exec-file-mismatchshow exec-file-mismatch 命令集,并显示新的 exec-file-mismatch 选项。当 GDB 附加到正在运行的进程时,此选项控制 GDB 在检测到当前由 GDB 加载的可执行文件和用来启动进程的可执行文件不匹配时如何做出反应。

Python API

  • gdb.register_window_type 函数在 Python 中实现新的 TUI 窗口。
  • 现在,您可以查询动态类型。gdb.Type 类的实例可以有新的布尔属性 dynamicgdb.Type.sizeof 属性对动态类型可以有值 None。如果 Type.fields() 返回动态类型字段,则其 bitpos 属性的值可以是 None
  • 新的 gdb.COMMAND_TUI 常量将 Python 命令注册为 TUI 帮助类命令的成员。
  • 新的 gdb.PendingFrame.architecture() 方法检索待处理帧的架构。
  • 新的 gdb.Architecture.registers 方法返回 gdb.RegisterDescriptorIterator 对象,后者是返回 gdb.RegisterDescriptor 对象的迭代器。此类对象不提供寄存器的值,但帮助了解哪些寄存器可用于某一架构。
  • 新的 gdb.Architecture.register_groups 方法返回 gdb.RegisterGroupIterator 对象,后者是返回 gdb.RegisterGroup 对象的迭代器。此类对象帮助了解哪些寄存器组用于某一架构。

(BZ#1954332)

GCC Toolset 11:SystemTap rebase 到版本 4.5

在 GCC Toolset 11 中,SystemTap 软件包已更新至版本 4.5。重要的程序错误修复和增强包括:

  • 32 位浮点变量现在自动扩大为双精度变量,因此可以作为 $context 变量直接访问。
  • 现在 enum 值可作为 $context 变量访问。
  • BPF uconversions tapset 已扩展,现在包括更多 tapset 功能来访问用户空间中的值,如 user_long_error()
  • 并发控制得到了显著改进,以对大型服务器提供稳定的操作。

如需更多信息,请参阅上游 SystemTap 4.5 发行注记

(BZ#1957944)

GCC Toolset 11: elfutils rebase 到版本 0.185

在 GCC Toolset 11 中,elfutils 软件包已更新至版本 0.185。重要的程序错误修复和增强包括:

  • eu-elflinteu-readelf 工具现在识别并显示 ELF 部分上的 SHF_GNU_RETAINSHT_X86_64_UNWIND 标志。
  • DEBUGINFOD_SONAME 宏已添加到 debuginfod.h。此宏可与 dlopen 函数一起使用,以从应用程序动态加载 libdebuginfod.so 库。
  • 新的函数 debuginfod_set_verbose_fd 已添加到 debuginfod-client 库。此函数通过将详细输出重定向到单独的文件来增强 debuginfod_find_* 查询功能。
  • 设置 DEBUGINFOD_VERBOSE 环境变量现在显示有关 debuginfod 客户端连接到哪些服务器以及这些服务器的 HTTP 响应的更多信息。
  • debuginfod 服务器提供了一个新的线程繁忙指标和更详细的错误指标,以便更轻松地检查运行在 debuginfod 服务器上的进程。
  • libdw 库现在透明地处理 DW_FORM_indirect 位置值,以便 dwarf_whatform 函数返回属性的实际 FORM。
  • debuginfod-client 库现在在缓存中存储负结果,客户端对象可以重复使用现有的连接。这样,在使用库时不必要的网络流量会被阻止。

(BZ#1957225)

GCC Toolset 11:Valgrind rebase 到版本 3.17.0

在 GCC Toolset 11 中,Valgrind 软件包已更新至版本 3.17.0。重要的程序错误修复和增强包括:

  • Valgrind 现在可读取 DWARF Version 5 调试格式。
  • Valgrind 现在支持对 debuginfod 服务器的调试查询。
  • Valgrind 现在部分支持 ARMv8.2 处理器指令。
  • Valgrind 现在支持 IBM z14 处理器指令。
  • Valgrind 现在部分支持 POWER10 处理器上的 Power ISA v.3.1 指令。
  • --track-fds=yes option 现在遵重 -q (--quiet),并默认忽略标准文件描述符 stdinstdoutstderr。要跟踪标准的文件描述符,请使用 --track-fds=all 选项。
  • DHAT 工具现在有两种新的操作模式:--mode=copy--mode=ad-hoc

(BZ#1957226)

GCC Toolset 11:Dyninst rebase 到版本 11.0.0

在 GCC Toolset 11 中,Dyninst 软件包已更新至版本 11.0.0。重要的程序错误修复和增强包括:

  • 支持 debuginfod 服务器以及获取单独的 debuginfo 文件。
  • 改进了对过程链接表(PLT)存根的间接调用的检测。
  • 改进了 C++ 名称解译。
  • 修复了代码发送过程中的内存泄漏。

(BZ#1957942)

添加了对 Fujitsu A64FX 的 PAPI 库支持

已添加了对 Fujitsu A64FX 的 PAPI 库支持。通过此功能,开发人员可以收集硬件统计信息。

(BZ#1908126)

PCP 软件包已 rebase 到 5.3.1

Performance Co-Pilot(PCP)软件包已 rebase 到版本 5.3.1。此发行版本包括 bug修复,增强和新功能。主要变更包括:

  • 可扩展性改进,现在支持数百台主机(pmlogger 农场)的集中记录性能指标,以及使用性能规则(pmie 农场)的自动监控。
  • 解决了 pmproxy 服务和 libpcp_web API 库中的内存泄漏,并向 pmproxy 添加了工具和新指标。
  • 新的 pcp-ss 工具,用于历史套接字统计信息。
  • pcp-htop 工具的改进.
  • 扩展到 over-wire PCP 协议,现在支持更高的分辨率时间戳。

(BZ#1922040)

grafana 软件包已 rebase 到版本 7.5.9

The grafana 软件包已 rebase 到版本 7.5.9。主要变更包括:

  • 新时间序列面板(beta)
  • 新饼形图面板(beta)
  • 对 Loki 的警报支持
  • 多个新的查询转换

如需更多信息,请参阅 Grafana v7.4 中的新功能Grafana v7.5 中的新功能

(BZ#1921191)

The grafana-pcp 软件包已 rebase 到 3.1.0

The grafana-pcp 软件包已 rebase 到版本 3.1.0。主要变更包括:

  • Performance Co-Pilot(PCP)Vector Checklist 仪表盘使用新的时间序列面板,以图形方式显示单元,并包含更新的帮助文本。
  • pmproxy URL 和 hostspec 变量添加到 PCP Vector Host Overview 和 PCP Checklist 仪表盘。
  • 所有控制面板都显示数据源选择。
  • 将所有包含的仪表盘标记为只读。
  • 添加与 Grafana 8 的兼容性。

(BZ#1921190)

grafana-container rebase 到版本 7.5.9

rhel8/grafana 容器镜像提供 Grafana。主要变更包括:

  • The grafana 软件包现在更新至版本 7.5.9。
  • The grafana-pcp 软件包现在更新至 版本 3.1.0。
  • 容器现在支持 GF_INSTALL_PLUGINS 环境变量,以在容器启动时安装自定义 Grafana 插件

rebase 更新 Red Hat Container Registry 中的 rhel8/grafana 镜像。

要拉取此容器镜像,请执行以下命令:

# podman pull registry.redhat.io/rhel8/grafana

(BZ#1971557)

pcp-container rebase 到版本 5.3.1

rhel8/pcp 容器镜像提供 Performance Co-Pilot。pcp-container 软件包已升级到版本 5.3.1。主要变更包括:

  • pcp 软件包现在更新至版本 5.3.1。

rebase 更新 Red Hat Container Registry 中的 rhel8/pcp 镜像。

要拉取此容器镜像,请执行以下命令:

# podman pull registry.redhat.io/rhel8/pcp

(BZ#1974912)

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

pcp-ss PCP 工具报告由 pmdasockets(1) PMDA 收集的套接字统计信息。命令与许多 ss 命令行选项和报告格式兼容。它还提供了实时模式下本地或远程监控的优势,以及之前记录的 PCP 存档的历史回放。

(BZ#1879350)

PCP 中现在提供了功耗指标

与功耗相关的新的 pmda-denki 性能指标域代理(PMDA)报告指标。具体来说,它报告:

  • 基于运行平均功率限制(RAPL)读数的消耗指标,在最近的Intel CPU 上提供
  • 基于电池放电的消耗指标,在配备电池的系统上提供

(BZ#1629455)