4.14. 编译器和开发工具
RHEL 9.1 提供了更新的 GCC 编译器。
系统 GCC 编译器版本 11.2.1 已更新,在上游 GCC 中包括大量程序错误修复和增强。
GNU Compiler Collection (GCC) 提供用于使用 C、C++ 和 Fortran 编程语言开发应用程序的工具。
有关使用信息,请参阅 RHEL 9 中开发 C 和 C++ 应用程序。
新的 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 用户身份运行以下命令:
# dnf install gcc-toolset-12
要从 GCC Toolset 12 运行工具:
$ scl enable gcc-toolset-12 tool
要运行一个 shell 会话,其中 GCC Toolset 12 中的工具版本会覆盖这些工具的系统版本:
$ scl enable gcc-toolset-12 bash
如需更多信息,请参阅 GCC Toolset 12。
(BZ#2077465)
GCC Toolset 12:Anobin 更新到版本 10.76
在 GCC Toolset 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#2077438)
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#2077445)
GCC 12 和更高版本支持 _FORTIFY_SOURCE
级别 3
有了此增强,用户在使用 GCC 版本 12 或更高版本构建时,可以在编译器命令行中使用 -D_FORTIFY_SOURCE=3
来构建应用程序。_FORTIFY_SOURCE
级别 3 提高了源代码强化的覆盖率,从而提高了在编译器命令行中使用 -D_FORTIFY_SOURCE=3
构建的应用的安全性。这在 GCC 版本 12 及更高版本中支持,RHEL 9 的所有 Clang 都带有 __builtin_dynamic_object_size
内置。
DNS stub 解析器选项现在支持 no-aaaa
选项
有了这个增强,glibc
现在识别 /etc/resolv.conf
和 RES_OPTIONS
环境变量中的 no-aaaa
stub 解析器选项。当此选项处于活跃状态时,不会通过网络发送 AAAA 查询。系统管理员可以出于诊断目的禁用 AAAA DNS 查询,例如,例如排除仅在 IPv4网络上的多余查询不会导致 DNS 问题。
添加了对 IBM Z 系列 z16 的支持
现在,对使用 IBM z16
平台设置的 s390
指令提供支持。IBM z16
在 glibc
中提供两个额外的硬件功能,即 HWCAP_S390_VXRS_PDE2
和 HWCAP_S390_NNPA
。现在,应用程序可以使用这些功能提供优化的库和功能。
(BZ#2077838)
应用程序可以通过新的 glibc
接口使用可重启序列功能
要加快 sched_getcpu
功能(特别是在 aarch64 中),需要在 glibc
中使用可重启的序列 (rseq) 内核功能。为了允许应用程序持续使用共享的 rseq 区域,glibc
现在提供 __rseq_offset
、__rseq_size
和 __rseq_flags
符号,这些符号在 glibc
2.35 上游版本中被第一次添加。在这个版本中,sched_getcpu
功能的性能会增加,应用程序现在可以通过新的 glibc
接口使用可重启的序列功能。
GCC 工具集 12:GDB 已 rebase 到版本 11.2
在 GCC 工具集 12 中,GDB 软件包已更新至版本 11.2。
重要的程序错误修复和增强包括:
-
对 64 位 ARM 架构内存标记 (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#2077494)
GDB 支持 Power 10 PLT 指令
GDB 现在支持 Power 10 PLT 指令。在这个版本中,用户可以步骤到共享库功能,并使用 GDB 版本 10.2-10 及之后的版本检查堆栈后端。
(BZ#1870017)
dyninst
更新到版本 12.1
dyninst
软件包已更新至 12.1 版本。重要的程序错误修复和增强包括:
-
glibc-2.35
多个命名空间的初始支持 - DWARF 并行解析的并发修复
-
更好地支持
CUDA
和CDNA2
GPU 二进制文件 - 更好地支持 IBM POWER 系统 (little endian) 注册访问
- 更好地支持 PIE 二进制文件
- 更正了捕获块的解析
-
更正了对 64 位 Arm (
arch64
) 浮动点注册的访问
新文件集 /etc/profile.d/debuginfod.*
添加了用于激活机构调试信息服务的新文件集。要获得系统范围的 debuginfod
客户端激活,您必须将 URL 添加到 /etc/debuginfod/FOO.urls
文件中。
Rust Toolset rebase 到版本 1.62.1
Rust Toolset 已更新到版本 1.62.1。主要变更包括:
-
解构赋值允许模式在赋值的左侧赋值现有的变量。例如,元组赋值可以交换变量:
(a、b) =(b、a)
-
现在,使用
core::arch::asm!
宏在 64 位 x86 和 64 位 ARM 上支持内联 assembly。请参阅参考文档中的 "Inline assembly" 章节,/usr/share/doc/rust/html/reference/inline-assembly.html
(https://doc.rust-lang.org/reference/inline-assembly.html) -
Enums 现在可以使用显式注解
#[default]
变体生成Default
trait。 -
Mutex
、CondVar
和RwLock
现在使用基于自定义的futex
实现,而非 pthreads,Rust 语言保证提供了新的优化。 -
Rust 现在支持
main
中的自定义退出代码,包括实现新稳定的Termination
特征的用户定义的类型。 -
cargo 支持更多对依赖项功能的控制。
dep:
前缀可以在不公开为功能的情况下指向可选的依赖项,如果依赖项在其它地方启用了(如package-name?/feature-name
),?
才启用依赖项功能。 -
cargo 有一个新的
cargo add
子命令,用于向Cargo.toml
添加依赖项。 详情请查看上游发布公告系列:
(BZ#2075337)
LLVM Toolset 更新到版本 14.0.6
LLVM Toolset 更新到版本 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#2061041)
Go Toolset 更新到版本 1.18.2
Go Toolset 已更新到版本 1.18.2。
主要变更包括:
- 在保持与之前版本的 Go 的向后兼容性的同时引入一般性。
- 新的 fuzzing 库。
-
新的
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#2075169)
新模块流:maven:3.8
RHEL 9.1 引进了 Maven 3.8
作为新模块流。
要安装 maven:3.8
模块流,请使用:
# dnf module install maven:3.8
(BZ#2083112)
.NET 版本 7.0 可用
Red Hat Enterprise Linux 9.1 带有 .NET 版本 7.0。主要改进包括:
-
支持 IBM Power (
ppc64le
)
如需更多信息,请参阅 .NET 7.0 RPM 软件包和 .NET 7.0 容器发行注记。
(BZ#2112027)