搜索

4.14. 编译器和开发工具

download PDF

RHEL 9.1 提供了更新的 GCC 编译器。

系统 GCC 编译器版本 11.2.1 已更新,在上游 GCC 中包括大量程序错误修复和增强。

GNU Compiler Collection (GCC) 提供用于使用 C、C++ 和 Fortran 编程语言开发应用程序的工具。

有关使用信息,请参阅 RHEL 9 中开发 C 和 C++ 应用程序

(BZ#2063255)

新的 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 源现在可以使用 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#2077438)

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#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 内置。

(BZ#2033683)

DNS stub 解析器选项现在支持 no-aaaa 选项

有了这个增强,glibc 现在识别 /etc/resolv.confRES_OPTIONS 环境变量中的 no-aaaa stub 解析器选项。当此选项处于活跃状态时,不会通过网络发送 AAAA 查询。系统管理员可以出于诊断目的禁用 AAAA DNS 查询,例如,例如排除仅在 IPv4网络上的多余查询不会导致 DNS 问题。

(BZ#2096191)

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

现在,对使用 IBM z16 平台设置的 s390 指令提供支持。IBM z16glibc 中提供两个额外的硬件功能,即 HWCAP_S390_VXRS_PDE2HWCAP_S390_NNPA。现在,应用程序可以使用这些功能提供优化的库和功能。

(BZ#2077838)

应用程序可以通过新的 glibc 接口使用可重启序列功能

要加快 sched_getcpu 功能(特别是在 aarch64 中),需要在 glibc 中使用可重启的序列 (rseq) 内核功能。为了允许应用程序持续使用共享的 rseq 区域,glibc 现在提供 __rseq_offset__rseq_size__rseq_flags 符号,这些符号在 glibc 2.35 上游版本中被第一次添加。在这个版本中,sched_getcpu 功能的性能会增加,应用程序现在可以通过新的 glibc 接口使用可重启的序列功能。

(BZ#2085529)

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 搜索路径包含配置目录。顺序是:

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

(BZ#2057675)

新文件集 /etc/profile.d/debuginfod.*

添加了用于激活机构调试信息服务的新文件集。要获得系统范围的 debuginfod 客户端激活,您必须将 URL 添加到 /etc/debuginfod/FOO.urls 文件中。

(BZ#2088774)

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。
  • MutexCondVarRwLock 现在使用基于自定义的 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/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#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)

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.