Menu Close

Red Hat Training

A Red Hat training course is available for RHEL 8

第 14 章 GCC Toolset 10

本章提供与 GCC Toolset 版本 10 相关的信息,以及此版本中包含的工具。

14.1. GCC Toolset 10 提供的工具和版本

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

表 14.1. GCC Toolset 10 中的工具版本

名称版本描述

GCC

10.2.1

支持 C、C ++ 和 Fortran 的可移植编译器套件。

GDB

9.2

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

Valgrind

3.16.0

工具框架和多个用来配置集应用程序的工具,以便检测内存错误、识别内存管理问题并报告系统调用中任何不正确参数的使用情况。

SystemTap

4.4

一个追踪和模拟工具,用于监控整个系统的活动,而无需工具、重新编译、安装和重启。

Dyninst

10.2.1

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

binutils

2.35

一组二进制工具和其他工具来检查和操作对象文件和二进制文件。

elfutils

0.182

一组二进制工具和其他工具来检查和操作 ELF 文件。

dwz

0.12

一个用来优化 ELF 共享库和 ELF 执行文件中的 DWARF 调试信息的工具。

make

4.2.1

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

strace

5.7

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

ltrace

0.7.91

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

annobin

9.29

构建安全检查工具。

14.2. GCC Toolset 10 中的 C++ 兼容性

重要

这里介绍的兼容性信息只适用于 GCC Toolset 10 中的 GCC。

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

C++14

这是 GCC Toolset 10 的 默认 语言标准设置,带有 GNU 扩展名,等同于明确使用选项 -std=gnu++14

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

C++11

这个语言标准可在 GCC Toolset 10 中找到。

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

C++98
这个语言标准可在 GCC Toolset 10 中找到。无论是否使用 GCC Toolset、Red Hat Developer Toolset 和 RHEL 5、6、7 和 8 构建,都可以使用这个标准构建二进制文件、共享库和对象。
C++17
这个语言标准可在 GCC Toolset 10 中找到。
C++20
这个语言标准只在 GCC Toolset 10 中作为实验性、不稳定且不受支持的能力提供。另外,无法保证使用这个标准构建的对象、二进制文件和库的兼容性。

所有语言标准都可用于标准变体或 GNU 扩展中。

当将使用 GCC Toolset 构建的对象与 RHEL 工具链构建的对象(通常为 .o.a 文件)混合时, GCC Toolset 工具链应该用于任何此项。这样可确保在链接时间解决所有仅由 GCC Toolset 提供的新库功能。

14.3. GCC Toolset 10 中的 GCC 的具体设置

库的静态链接

某些最新的库功能会静态链接到通过 GCC Toolset 构建的应用程序,以支持在多个 Red Hat Enterprise Linux 版本上执行。这会创建额外的安全风险,因为标准 Red Hat Enterprise Linux 勘误不会更改此代码。如果因为这种风险,开发人员需要重建其应用程序,红帽会使用安全勘误来进行通讯。

重要

由于这个额外的安全风险,强烈建议开发人员不要因为同样的原因静态连接其整个应用程序。

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

在 GCC Toolset 中,库使用 linker 脚本链接,这些脚本可以通过静态归档指定一些符号。这需要保证与多个 Red Hat Enterprise Linux 版本兼容。但是, linker 脚本使用相应的共享对象文件的名称。因此,链接器使用不同于预期的符号处理规则,且在指定对象文件选项前指定了库添加选项时,无法识别对象文件所需的符号:

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

使用来自 GCC Toolset 的库会导致 linker 错误消息 undefined reference to symbol。要防止这个问题,请遵循标准链接实践,并在指定对象文件选项后指定库:

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

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

14.4. GCC Toolset 10 中的 binutils 的具体设置

库的静态链接

某些最新的库功能会静态链接到通过 GCC Toolset 构建的应用程序,以支持在多个 Red Hat Enterprise Linux 版本上执行。这会创建额外的安全风险,因为标准 Red Hat Enterprise Linux 勘误不会更改此代码。如果因为这种风险,开发人员需要重建其应用程序,红帽会使用安全勘误来进行通讯。

重要

由于这个额外的安全风险,强烈建议开发人员不要因为同样的原因静态连接其整个应用程序。

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

在 GCC Toolset 中,库使用 linker 脚本链接,这些脚本可以通过静态归档指定一些符号。这需要保证与多个 Red Hat Enterprise Linux 版本兼容。但是, linker 脚本使用相应的共享对象文件的名称。因此,链接器使用不同于预期的符号处理规则,且在指定对象文件选项前指定了库添加选项时,无法识别对象文件所需的符号:

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

使用来自 GCC Toolset 的库会导致 linker 错误消息 undefined reference to symbol。要防止这个问题,请遵循标准链接实践,并在指定对象文件选项后指定库:

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

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