4.12. 编译器和开发工具
Go Toolset rebase 到版本 1.16.7
Go Toolset 已升级至版本 1.16.7。主要变更包括:
-
现在,
GO111MODULE
环境变量默认被设为on
。要恢复此设置,请将GO111MODULE
更改为auto
。 - Go linker 现在使用较少的资源,并提高了代码的稳健性和可维护性。这适用于所有支持的架构和操作系统。
-
使用新的
embed
软件包,您可以在编译程序的同时访问嵌入的文件。 -
io/ioutil
软件包的所有功能都已移到io
和os
软件包中。虽然您仍然可以使用io/ioutil
,但io
和os
软件包提供更好的定义。 - 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_STANDARD
、CUDA_STANDARD
、OBJCXX_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 容器的发行注记 。
GCC Toolset 11:GCC rebase 到版本 11.2
在 GCC Toolset 11 中,GCC 软件包已更新至版本 11.2。重要的程序错误修复和增强包括:
常规改进
- GCC 现在默认为 DWARF 版本 5 调试格式。
- 诊断中显示的列号默认代表实际列号,并尊重多列字符。
- 直线代码矢量器会在矢量化时考虑整个功能。
- 如果每个条件表达式都包含一个比较表达式,则可以将比较同一变量的一系列条件表达式转换为 switch 语句。
过程间优化改进:
-
新的 IPA-modref 传递,由
-fipa-modref
选项控制,跟踪函数调用的副作用,并提高点分析的准确性。 -
相同的代码折叠传递,由
-fipa-icf
选项控制,得到了极大改进,以增加统一功能的数量并减少编译时内存使用。
-
新的 IPA-modref 传递,由
链接时间优化改进:
- 改进了链接期间的内存分配,以减低内存使用的峰值。
-
在 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 发行注记。
elfutils
rebase 到版本 0.185
elfutils
软件包已更新至版本 0.185。重要的程序错误修复和增强包括:
-
eu-elflint
和eu-readelf
工具现在识别并显示 ELF 部分上的SHF_GNU_RETAIN
和SHT_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
库会在缓存中存储负结果,客户端对象可以重复使用现有连接。
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
),并默认忽略标准的文件描述符stdin
、stdout
和stderr
。要跟踪标准的文件描述符,请使用--track-fds=all
选项。 -
DHAT 工具有两种新的操作模式:
--mode=copy
和--mode=ad-hoc
。
Dyninst rebase 到版本 11.0.0
Dyninst 软件包已更新至版本 11.0.0。重要的程序错误修复和增强包括:
-
支持
debuginfod
服务器以及获取单独的debuginfo
文件。 - 改进了对过程链接表(PLT)存根的间接调用的检测。
- 改进了 C++ 名称解译。
- 修复了代码发送过程中的内存泄漏。
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-mismatch
和show exec-file-mismatch
命令集,并显示新的exec-file-mismatch
选项。当 GDB 附加到正在运行的进程时,此选项控制 GDB 在检测到当前由 GDB 加载的可执行文件和用来启动进程的可执行文件不匹配时如何做出反应。
Python API
-
gdb.register_window_type
函数在 Python 中实现新的 TUI 窗口。 -
现在,您可以查询动态类型。
gdb.Type
类的实例可以有新的布尔属性dynamic
,gdb.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 发行注记。
GCC Toolset 11: elfutils
rebase 到版本 0.185
在 GCC Toolset 11 中,elfutils
软件包已更新至版本 0.185。重要的程序错误修复和增强包括:
-
eu-elflint
和eu-readelf
工具现在识别并显示 ELF 部分上的SHF_GNU_RETAIN
和SHT_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
库现在在缓存中存储负结果,客户端对象可以重复使用现有的连接。这样,在使用库时不必要的网络流量会被阻止。
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
),并默认忽略标准文件描述符stdin
、stdout
和stderr
。要跟踪标准的文件描述符,请使用--track-fds=all
选项。 -
DHAT 工具现在有两种新的操作模式:
--mode=copy
和--mode=ad-hoc
。
GCC Toolset 11:Dyninst rebase 到版本 11.0.0
在 GCC Toolset 11 中,Dyninst 软件包已更新至版本 11.0.0。重要的程序错误修复和增强包括:
-
支持
debuginfod
服务器以及获取单独的debuginfo
文件。 - 改进了对过程链接表(PLT)存根的间接调用的检测。
- 改进了 C++ 名称解译。
- 修复了代码发送过程中的内存泄漏。
添加了对 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 协议,现在支持更高的分辨率时间戳。
grafana
软件包已 rebase 到版本 7.5.9
The grafana
软件包已 rebase 到版本 7.5.9。主要变更包括:
- 新时间序列面板(beta)
- 新饼形图面板(beta)
- 对 Loki 的警报支持
- 多个新的查询转换
如需更多信息,请参阅 Grafana v7.4 中的新功能,Grafana v7.5 中的新功能。
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 的兼容性。
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
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
新的 pcp-ss
PCP 工具现在可用
pcp-ss
PCP 工具报告由 pmdasockets(1)
PMDA 收集的套接字统计信息。命令与许多 ss
命令行选项和报告格式兼容。它还提供了实时模式下本地或远程监控的优势,以及之前记录的 PCP 存档的历史回放。
PCP 中现在提供了功耗指标
与功耗相关的新的 pmda-denki
性能指标域代理(PMDA)报告指标。具体来说,它报告:
- 基于运行平均功率限制(RAPL)读数的消耗指标,在最近的Intel CPU 上提供
- 基于电池放电的消耗指标,在配备电池的系统上提供
(BZ#1629455)