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 源现在可以使用 mesonninja 来构建,而不是根据需要进行配置和制作。
  • 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.sogcc-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 软件包中的所有工具现在支持显示或警告存在多字节字符的选项。
  • readelfobjdump 工具现在默认遵循指向各个 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.confRES_OPTIONS 环境变量中的 no-aaaa stub 解析器选项。当此选项处于活跃状态时,不会通过网络发送 AAAA 查询。系统管理员可以出于诊断目的禁用 AAAA DNS 查询,例如,例如排除仅在 IPv4网络上的多余查询不会导致 DNS 问题。

(BZ#2096189)

添加了对 glibc 中 IBM Z 系列 z16 的支持

现在,对使用 glibc 中的 IBM z16 平台设置的 s390 指令提供支持。IBM z16 提供了两个额外的硬件功能,即 HWCAP_S390_VXRS_PDE2HWCAP_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 搜索路径包含配置目录。顺序是:

    1. $XDG_CONFIG_HOME/gdb/gdbinit
    2. $HOME/.config/gdb/gdbinit
    3. $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-quietlyset startup-quietly :一种在 GDB 脚本中指定 -q-quiet 的方法。仅在早期初始化文件中有效。
  • show print type hexset print type hex :告诉 GDB 以十六进制形式而不是十进制形式打印结构成员的大小或偏移量。
  • show python ignore-environmentset python ignore-environment :如果启用了,GDB 的 Python 解释器回忽略 Python 环境变量,就像将 -E 传给 Python 可执行文件。仅在早期初始化文件中有效。
  • show python dont-write-bytecodeset 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 性能监控硬件。

(BZ#2067218)

papi 现在支持 AMD Zen 2 和 Zen 3 处理器

有了这个增强,用户现在可以使用 papi 来访问 AMD Zen 2 和 Zen 3 性能监控硬件。

(BZ#2071558)

改进了 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 并行解析的并发修复。
  • 更好地支持 CUDACDNA2 GPU 二进制文件。
  • 更好地支持 IBM POWER 系统(little endian)注册访问。
  • 更好地支持 PIE 二进制文件。
  • 更正了对捕获块的解析。
  • 更正了对 64 位 ARM (arch64)浮点寄存器的访问。

(BZ#2057676)

systemtap 软件包 rebase 到版本 4.7

systemtap 软件包已 rebase 到版本 4.7。重要的程序错误修复和增强包括:

  • 使用 MOK 键手动为模块签名的新 --sign-module 选项,用于 SecureBoot 系统。
  • 生成注释源代码的系统范围配置文件的新的 stap-profile-annotate 工具。
  • 用于探测函数入口和返回的新的通用 Python tapset。
  • 对于用户空间中字符串内核空间探测的扩展 $foo$ 处理。
  • 非捕获组的扩展常规表达式语言。
  • 添加了对一些最近添加的内核系统调用的 tapset 支持。

(BZ#2057565)

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 特征。
  • MutexCondVarRwLock 现在使用基于自定义的 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/buildinfonet/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)构架上使用 clangld.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)