4.11. 编译器和开发工具
新的 GCC 工具集 12
GCC Toolset 12 是一个编译器工具集,提供了开发工具的最新版本。它在 AppStream
存储库中以软件集合的形式作为应用程序流提供。
GCC 编译器已更新至版本 12.1.1,它提供了上游 GCC 中提供的很多程序错误修复和增强。
GCC Toolset 12 提供了以下工具和版本:
工具 | 版本 |
---|---|
GCC | 12.1.1 |
GDB | 11.2 |
binutils | 2.35 |
dwz | 0.14 |
annobin | 10.76 |
要安装 GCC Toolset 12,以 root 用户身份运行以下命令:
# yum install gcc-toolset-12
要从 GCC Toolset 12 运行工具:
$ scl enable gcc-toolset-12 tool
要运行一个 shell 会话,其中 GCC Toolset 12 中的工具版本会覆盖这些工具的系统版本:
$ scl enable gcc-toolset-12 bash
如需更多信息,请参阅 使用 GCC 工具集。
(BZ#2077276)
GCC 工具集 12:Anobin rebase 到版本 10.76
在 GCC 工具集 12 中,Anobin 软件包已更新至版本 10.76。
重要的程序错误修复和增强包括:
-
anocheck 的新命令行选项告诉它避免使用
debuginfod
服务(如果它无法用其他方式查找调试信息)。使用debuginfod
为 anocheck 提供了更多信息,但如果debuginfod
服务器不可用,它也会导致 annocheck 的性能下降。 -
Annobin 源现在可以使用
meson
和ninja
来构建,而不是根据需要进行配置和制作。 - Annocheck 现在支持 Rust 1.18 编译器构建的二进制文件。
另外,已在 Annobin 的 GCC 工具集 12 版本中报告了以下已知问题:
在某些情况下,编译可能会失败,并显示类似以下内容的错误消息:
cc1: fatal error: inaccessible plugin file
opt/rh/gcc-toolset-12/root/usr/lib/gcc/architecture-linux-gnu/12/plugin/gcc-annobin.so
expanded from short plugin name gcc-annobin: No such file or directory
要临时解决这个问题,请在 plugins 目录中创建一个从 annobin.so
到 gcc-annobin.so
的符号链接:
# cd /opt/rh/gcc-toolset-12/root/usr/lib/gcc/architecture-linux-gnu/12/plugin
# ln -s annobin.so gcc-annobin.so
其中 architecture 被正在使用的构架替换:
-
aarch64
-
i686
-
ppc64le
-
s390x
-
x86_64
(BZ#2077447)
GCC 工具集 12:binutils
rebase 到版本 2.38
在 GCC 工具集 12 中,binutils
软件包已更新至版本 2.38。
重要的程序错误修复和增强包括:
-
binutils
软件包中的所有工具现在支持显示或警告存在多字节字符的选项。 -
readelf
和objdump
工具现在默认遵循指向各个debuginfo
文件的任何链接。可以使用readelf
的--debug-dump=no-follow-links
选项或objdump
的--dwarf=no-follow-links
选项来禁用此行为。
(BZ#2077448)
GCC 12 和更高版本支持 _FORTIFY_SOURCE
级别 3
有了此增强,用户在使用 GCC 版本 12 或更高版本构建时,可以在编译器命令行中使用 -D_FORTIFY_SOURCE=3
来构建应用程序。_FORTIFY_SOURCE
级别 3 提高了源代码强化的覆盖率,从而提高了在编译器命令行中使用 -D_FORTIFY_SOURCE=3
构建的应用的安全性。这在 GCC 版本 12 及更高版本,以及 Clang 版本 9.0 和之后带有 __builtin_dynamic_object_size
内置的版本中支持。
(BZ#2033684)
DNS stub 解析器选项现在支持 no-aaaa
选项
有了这个增强,glibc
现在识别 /etc/resolv.conf
和 RES_OPTIONS
环境变量中的 no-aaaa
stub 解析器选项。当此选项处于活跃状态时,不会通过网络发送 AAAA 查询。系统管理员可以出于诊断目的禁用 AAAA DNS 查询,例如,例如排除仅在 IPv4网络上的多余查询不会导致 DNS 问题。
添加了对 glibc
中 IBM Z 系列 z16 的支持
现在,对使用 glibc
中的 IBM z16
平台设置的 s390
指令提供支持。IBM z16
提供了两个额外的硬件功能,即 HWCAP_S390_VXRS_PDE2
和 HWCAP_S390_NNPA
。因此,应用程序现在可以使用这些功能来交付优化的库和功能。
(BZ#2077835)
新的 make-latest
软件包
这个增强引进了 make-latest
软件包,其包括 make
工具的最新版本。在以前的版本中,我们通过 GCC 工具集提供最新的 make
版本。现在,您可以单独安装 make-latest
软件包,并使用 scl enable make43 /bin/bash
运行最新版本(如果 make43
版本是最新的)。
(BZ#2083419)
GCC 工具集 12:GDB 已 rebase 到版本 11.2
在 GCC 工具集 12 中,GDB 软件包已更新至版本 11.2。
重要的程序错误修复和增强包括:
-
对 Aarch64 MTE 的新支持。请参阅带有
memory-tag
前缀的新命令。 -break-insert
和-dprintf-insert
的--qualified
选项。这个选项查找用户事件位置的确切匹配,而不是在所有范围内搜索。例如,
break --qualified foo
将在全局范围内查找名为 foo 的符号。没有--qualified
,GDB 将在所有范围内搜索具有该名称的符号。-
--force-condition
: 任何提供的条件都会被定义,即使当前无效也是如此。 -
-break-condition --force
: 与 MI 命令类似。 -
-file-list-exec-source-files
接受可选REGEXP
来限制输出。 .gdbinit
搜索路径包含配置目录。顺序是:-
$XDG_CONFIG_HOME/gdb/gdbinit
-
$HOME/.config/gdb/gdbinit
-
$HOME/.gdbinit
-
-
支持
~/.config/gdb/gdbearlyinit
或~/.gdbearlyinit
。 -
-eix
和-eiex
早期初始化文件选项.
终端用户界面(TUI):
- 支持终端用户界面(TUI)窗口中的鼠标操作。
- 不在聚焦窗口上操作的组合键现在传给 GDB。
新命令:
-
show print memory-tag-violations
-
set print memory-tag-violations
-
memory-tag show-logical-tag
-
memory-tag with-logical-tag
-
memory-tag show-allocation-tag
-
memory-tag check
-
show startup-quietly
和set startup-quietly
:一种在 GDB 脚本中指定-q
或-quiet
的方法。仅在早期初始化文件中有效。 -
show print type hex
和set print type hex
:告诉 GDB 以十六进制形式而不是十进制形式打印结构成员的大小或偏移量。 -
show python ignore-environment
和set python ignore-environment
:如果启用了,GDB 的 Python 解释器回忽略 Python 环境变量,就像将-E
传给 Python 可执行文件。仅在早期初始化文件中有效。 -
show python dont-write-bytecode
和set python dont-write-bytecode
: 如果为off
,则这些命令会阻止 GDB 的 Python 解释器编写导入模块的字节代码编译的对象,就像将-B
传给 Python 可执行文件一样。仅在早期初始化文件中有效。
更改的命令:
-
break LOCATION if CONDITION
:如果 CONDITION 无效,则 GDB 会拒绝设置断点。-force-condition
选项会覆盖它。 -
CONDITION -force N COND
:与前面的命令相同。 -
inferior [ID]
: 当 ID 被省略时,这个命令会打印有关当前 inferior 的信息。否则,没有变化。 -
ptype[/FLAGS] TYPE | EXPRESSION
: 在打印 struct 成员的大小和偏移时使用/x
标记来使用十六进制表示法。使用/d
标志来做同样的事情,但使用十进制。 -
info sources
:输出已重构。
Python API:
-
inferior 对象包含一个只读
connection_num
属性。 -
新的
gdb.Frame.level()
方法。 -
新的
gdb.PendingFrame.level()
方法。 -
忽略了
gdb.BreakpoiontEvent
而不是gdb.Stop
。
(BZ#2077492)
libpfm
现在支持 AMD Zen 2 和 Zen 3 处理器
有了这个增强,用户现在可以使用 libpfm
来访问 AMD Zen 2 和 Zen 3 性能监控硬件。
papi
现在支持 AMD Zen 2 和 Zen 3 处理器
有了这个增强,用户现在可以使用 papi
来访问 AMD Zen 2 和 Zen 3 性能监控硬件。
改进了 ARM 处理器的硬件标识
有了这个增强,papi_avail
工具可以正确地报告各种 ARM 供应商的供应商字符串和代码信息。这个工具允许 PAPI_get_hardware_info ()
函数识别由 ARM
以外的公司生产的处理器,这些公司仅限于 arch64
架构。因此,开发人员可以调优所需架构的代码。
(BZ#2037427)
更新了 Fujitsu A64FX 事件映射
为 Fujitsu A64FX 处理器更新了 PAPI
库。用户现在可以在可用于分析程序性能的 papi_avail
输出中使用额外的预设置。
这包括 IDL
事件预设置:
PAPI_BRU_IDL
- 分支机构闲置
PAPI_FXU_IDL
- 整数单位闲置
PAPI_FPU_IDL
- 浮点单位闲置
PAPI_LSU_IDL
- 载入存储单元闲置
(BZ#2037417)
dyninst
更新到版本 12.1
dyninst
软件包已更新至 12.1 版本。重要的程序错误修复和增强包括:
-
对
glibc-2.35
多个命名空间的初始支持。 - 对 DWARF 并行解析的并发修复。
-
更好地支持
CUDA
和CDNA2
GPU 二进制文件。 - 更好地支持 IBM POWER 系统(little endian)注册访问。
- 更好地支持 PIE 二进制文件。
- 更正了对捕获块的解析。
-
更正了对 64 位 ARM (
arch64
)浮点寄存器的访问。
systemtap
软件包 rebase 到版本 4.7
systemtap
软件包已 rebase 到版本 4.7。重要的程序错误修复和增强包括:
-
使用 MOK 键手动为模块签名的新
--sign-module
选项,用于 SecureBoot 系统。 -
生成注释源代码的系统范围配置文件的新的
stap-profile-annotate
工具。 - 用于探测函数入口和返回的新的通用 Python tapset。
-
对于用户空间中字符串内核空间探测的扩展
$foo$
处理。 - 非捕获组的扩展常规表达式语言。
- 添加了对一些最近添加的内核系统调用的 tapset 支持。
Rust Toolset rebase 到版本 1.62.1
Rust Toolset 已更新到版本 1.62.1。主要变更包括:
-
解构赋值允许模式在赋值的左侧赋值现有的变量。例如,元组赋值可以交换变量:
(a、b) =(b、a)
-
现在,使用
core::arch::asm!
宏在 64 位 x86 和 64 位 ARM 上支持内联汇编。有关更多详细信息,请参阅参考资料中的Inline assembly
章节/usr/share/doc/rust/html/reference/inline-assembly.html
(线上为 https://doc.rust-lang.org/reference/inline-assembly.html)。 -
枚举现在可以使用显式注解的
#[default]
变体派生Default
特征。 -
Mutex
、CondVar
和RwLock
现在使用基于自定义的futex
实现,而非 pthreads,Rust 语言保证提供了新的优化。 -
Rust 现在支持
main
中的自定义退出代码,包括实现新稳定的Termination
特征的用户定义的类型。 -
cargo 支持更多对依赖项功能的控制。
dep:
前缀可以在不公开为功能的情况下指向可选的依赖项,如果依赖项在其它地方启用了(如package-name?/feature-name
),?
才启用依赖项功能。 -
cargo 有一个新的
cargo add
子命令,用于向Cargo.toml
添加依赖项。 详情请查看上游发布公告系列:
(BZ#2075344)
LLVM 工具集 rebase 到版本 14.0.6
LLVM 工具集已 rebase 到版本 14.0.6。主要变更包括:
-
在 64 位 x86 上,添加了对
AVX512-FP16
指令的支持。 - 添加了对 Armv9-A、Armv9.1-A 和 Armv9.2-A 架构的支持。
-
在 PowerPC 上,添加了
__ibm128
类型来代表 IBM double-double 格式,也称为__attribute__(mode (IF))
。
clang
更改了:
-
现在为
C++2b
实现了if consteval
。 -
在 64 位 x86 上,添加了对
AVX512-FP16
指令的支持。 -
对处于实验状态的 OpenCL 2021 的 OpenCL C 3.0 和
C++
的支持。 -
现在
-E -P
预处理器输出始终省略空白行,匹配 GCC 行为。以前,输出中可能会出现高达 8 个空行。 -
不仅仅支持 C89 ,还支持
C99
和更高标准的-Wdeclaration-after-statement
,匹配 GCC 的行为。值得注意的用例是支持禁止混合声明和代码的风格指南,但希望迁移到新的 C 标准。
如需更多信息,请参阅 LLVM 工具集 和 Clang 上游发行注记。
(BZ#2061042)
Go 工具集 rebase 到版本 1.18.2
Go 工具集已 rebase 到版本 1.18.2。
主要变更包括:
- 在保持与之前版本的 Go 向后兼容性的同时引入泛型。
- 一个新的模糊库。
-
新的
debug
/buildinfo
和net
/netip
软件包。 -
go get
工具不再构建或安装软件包。现在,它只处理go.mod
中的依赖项。 -
如果主模块的
go.mod
文件指定了go 1.17
或更高版本,则使用没有任何其他参数的go mod download
命令来下载主模块的go.mod
文件中明确需要的模块的源代码。要下载传输依赖项的源代码,请使用go mod download all
命令。 -
go mod vendor
子命令现在支持-o
选项来设置输出目录。 -
go mod tidy
命令现在为需要其源代码来验证构建列表中只有一个模块提供每个导入软件包的模块在go.sum
文件中保留额外的校验和。这个更改不受主模块的go.mod
文件中 Go 版本的影响。
(BZ#2075162)
LLVM 黄金插件
现在在 IBM Z 构架上提供
有了这个增强,用户可以在 IBM Z (s390x
)构架上使用 clang
和 ld.bfd
创建 LTO 构建。s390x
架构现在支持与 ld.bfd
和 LTO 的链接。
(BZ#2088315)
新模块流:maven:3.8
RHEL 8.7 引入了 Maven 3.8
来作为新模块流。
要安装 maven:3.8
模块流,请使用:
# yum module install maven:3.8
如果要从 maven:3.6
流升级,请参阅 切换到更新的流。
(BZ#2083114, BZ#2064785, BZ#2088473)
.NET 版本 7.0 可用
Red Hat Enterprise Linux 8.7 与 .NET 版本 7.0 一起发布。主要改进包括:
-
支持 IBM Power (
ppc64le
)
如需更多信息,请参阅 .NET 7.0 RPM 软件包的发行注记 和 .NET 7.0 容器的发行注记。
(BZ#2112096)