Red Hat Training

A Red Hat training course is available for RHEL 8

4.4. GCC Toolset 11

了解特定于 GCC Toolset 版本 11 以及此版本中包含的工具的信息。

4.4.1. GCC Toolset 11 提供的工具和版本

GCC Toolset 11 提供以下工具和版本:

表 4.3. GCC Toolset 11 中的工具版本

Name版本描述

GCC

11.2.1

便携式编译器套件,支持 C、C++ 和 Fortran。

GDB

10.2

命令行调试器,适用于使用 C、C++ 和 Fortran 编写的程序。

Valgrind

3.17.0

检测框架和许多工具来对应用进行性能分析,以检测内存错误、识别内存管理问题并报告系统调用中未使用的参数。

SystemTap

4.5

跟踪和探测工具,可监控整个系统的活动,无需检测、重新编译、安装和重新启动。

Dyninst

11.0.0

执行期间检测和使用用户空间可执行文件的库。

binutils

2.36.1

一组二进制工具和其他实用程序,用于检查和操作对象文件和二进制文件。

elfutils

0.185

用于检查和操作 ELF 文件的二进制工具和其他实用程序的集合。

dwz

0.14

用于优化 ELF 共享库和 ELF 可执行文件中包含的 DWARF 调试信息的工具。

make

4.3

依赖项跟踪构建自动化工具。

strace

5.13

用于监控程序使用的系统调用并发出信号的调试工具。

ltrace

0.7.91

用于显示对程序所进行的动态库的调用的调试工具。它还可以监控程序执行的系统调用。

annobin

10.23

构建安全检查工具.

4.4.2. GCC Toolset 11 中的 C++ 兼容性

重要

此处所提供的兼容性信息仅适用于 GCC Toolset 11 中的 GCC。

GCC Toolset 中的 GCC 编译器可以使用以下 C++ 标准:

C++14

此语言标准在 GCC Toolset 11 中提供。

当使用 GCC 版本 6 或更高版本构建了使用相应标记编译的所有 C++ 对象时,支持使用 C++14 语言版本。

C++11

此语言标准在 GCC Toolset 11 中提供。

当使用 GCC 版本 5 或更高版本构建了使用相应标记编译的所有 C++ 对象时,支持使用 C++11 语言版本。

C++98
此语言标准在 GCC Toolset 11 中提供。通过使用 GCC Toolset、Red Hat Developer Toolset 以及 RHEL 5、6、7 和 8 的 GCC 构建二进制文件、共享库和对象,都可以自由混合。
C++17

此语言标准在 GCC Toolset 11 中提供。

这是 GCC Toolset 11 的默认语言标准设置,它使用 GNU 扩展,相当于使用 -std=gnu++17 选项明确设置。

当使用 GCC 版本 10 或更高版本构建了使用相应标记编译的所有 C++ 对象时,支持使用 C++17 语言版本。

c++20 和 C++23

此语言标准在 GCC Toolset 11 中仅作为实验性、不稳定和不受支持的功能提供。此外,还无法保证使用此标准构建的对象、二进制文件和库的兼容性。

要启用 C++20 支持,请将命令行选项 -std=c++20 添加到 g++ 命令行。

要启用 C++23 支持,将命令行选项 -std=c++2b 添加到 g++ 命令行。

所有语言标准均可在符合标准的变体或 GNU 扩展中找到。

将与 GCC Toolset 构建的对象与通过 RHEL 工具链构建的对象(particularly. o 或. a 文件)混合时,应将 GCC Toolset 工具链用于任何链接。这可确保任何仅由 GCC Toolset 提供的更新库功能在链接时得以解决。

4.4.3. GCC Toolset 11 中的具体信息

库的静态链接

某些较新的库功能已静态链接到使用 GCC 工具集构建的应用程序中,以支持在多个版本的 Red Hat Enterprise Linux 中执行。这会产生另外一个小的安全风险,因为标准的 Red Hat Enterprise Linux 勘误表不会改变这个代码。如果开发人员出于此风险而需要重建其应用,红帽将使用安全勘误对此进行沟通。

重要

由于这种额外的安全风险,开发人员强烈建议不要出于相同的原因将整个应用程序静态链接。

在链接时在对象文件后指定库

在 GCC Toolset 中,库使用链接器脚本链接,这些脚本可能通过静态存档指定一些符号。这需要确保与红帽企业 Linux 的多个版本兼容。但是,链接器脚本使用对应共享对象文件的名称。因此,链接器使用与预期不同的符号处理规则,在指定对象文件选项前,在指定对象文件选项前不会识别对象文件所需的符号:

$ scl enable gcc-toolset-11 'gcc -lsomelib objfile.o'

以这种方式使用 GCC Toolset 中的库会导致 未定义引用的 符号链接器错误消息。要防止这个问题,请遵循标准链接实践,并在指定对象文件的选项后指定添加库的选项:

$ scl enable gcc-toolset-11 'gcc objfile.o -lsomelib'

请注意,在使用基本 Red Hat Enterprise Linux 的 GCC 版本时,这个建议也适用。

4.4.4. GCC Toolset 11 中的 binutils 细节

库的静态链接

某些较新的库功能已静态链接到使用 GCC 工具集构建的应用程序中,以支持在多个版本的 Red Hat Enterprise Linux 中执行。这会产生另外一个小的安全风险,因为标准的 Red Hat Enterprise Linux 勘误表不会改变这个代码。如果开发人员出于此风险而需要重建其应用,红帽将使用安全勘误对此进行沟通。

重要

由于这种额外的安全风险,开发人员强烈建议不要出于相同的原因将整个应用程序静态链接。

在链接时在对象文件后指定库

在 GCC Toolset 中,库使用链接器脚本链接,这些脚本可能通过静态存档指定一些符号。这需要确保与红帽企业 Linux 的多个版本兼容。但是,链接器脚本使用对应共享对象文件的名称。因此,链接器使用与预期不同的符号处理规则,在指定对象文件选项前,在指定对象文件选项前不会识别对象文件所需的符号:

$ scl enable gcc-toolset-11 'ld -lsomelib objfile.o'

以这种方式使用 GCC Toolset 中的库会导致 未定义引用的 符号链接器错误消息。要防止这个问题,请遵循标准链接实践,并在指定对象文件的选项后指定添加库的选项:

$ scl enable gcc-toolset-11 'ld objfile.o -lsomelib'

请注意,在使用基本 Red Hat Enterprise Linux 的 binutils 版本时,这个建议也适用。