Menu Close
Red Hat Training
A Red Hat training course is available for RHEL 8
第 13 章 GCC Toolset 9
本章提供与 GCC Toolset 版本 9 相关的信息,以及本版本中包含的工具。
13.1. GCC Toolset 9 提供的工具和版本
GCC Toolset 9 提供以下工具和版本:
表 13.1. GCC Toolset 9 中的工具版本
名称 | 版本 | 描述 |
---|---|---|
GCC | 9.2.1 | 支持 C、C ++ 和 Fortran 的可移植编译器套件。 |
GDB | 8.3 | 用于使用 C、C ++ 和 Fortran 编写的程序的命令行调试程序。 |
Valgrind | 3.15.0 | 工具框架和多个用来配置集应用程序的工具,以便检测内存错误、识别内存管理问题并报告系统调用中任何不正确参数的使用情况。 |
SystemTap | 4.1 | 一个追踪和模拟工具,用于监控整个系统的活动,而无需工具、重新编译、安装和重启。 |
Dyninst | 10.1.0 | 用于在执行期间检测和使用用户空间可执行文件的库。 |
binutils | 2.32 | 一组二进制工具和其他工具来检查和操作对象文件和二进制文件。 |
elfutils | 0.176 | 一组二进制工具和其他工具来检查和操作 ELF 文件。 |
dwz | 0.12 | 一个用来优化 ELF 共享库和 ELF 执行文件中的 DWARF 调试信息的工具。 |
make | 4.2.1 | 一个依赖项跟踪构建自动化工具。 |
strace | 5.1 | 用于监控程序使用和信号的系统调用的调试工具。 |
ltrace | 0.7.91 | 用于显示对程序动态库调用的调试工具。它还可监控程序执行的系统调用。 |
annobin | 9.08 | 构建安全检查工具。 |
13.2. GCC Toolset 9 中的 C++ 兼容性
这里介绍的兼容性信息只适用于 GCC Toolset 9 中的 GCC。
GCC Toolset 中的 GCC 编译器可使用以下 C++ 标准:
- C++14
这是 GCC Toolset 9 的 默认 语言标准设置,包含 GNU 扩展名,等同于明确使用选项
-std=gnu++14
。当所有使用 GCC 版本 6 或更高版本构建了带有相应标志的 C++ 对象时,支持使用 C++14 语言版本。
- C++11
GCC Toolset 9 提供了这种语言标准。
当所有使用 GCC 版本 5 或更高版本构建了带有相应标志的 C++ 对象时,支持使用 C++11 语言版本。
- C++98
- GCC Toolset 9 提供了这种语言标准。无论是否使用 GCC Toolset、Red Hat Developer Toolset 和 RHEL 5、6、7 和 8 构建,都可以使用这个标准构建二进制文件、共享库和对象。
- C++17, C++2a
- 这些语言标准仅作为实验性、不稳定且不受支持的能力在 GCC Toolset 9 中找到。此外,无法保证使用这些规则构建的对象、二进制文件和库的兼容性。
所有语言标准都可用于标准变体或 GNU 扩展中。
当将使用 GCC Toolset 构建的对象与 RHEL 工具链构建的对象(通常为 .o
或 .a
文件)混合时, GCC Toolset 工具链应该用于任何此项。这样可确保在链接时间解决所有仅由 GCC Toolset 提供的新库功能。
13.3. GCC Toolset 9 中的 GCC 的具体设置
库的静态链接
某些最新的库功能会静态链接到通过 GCC Toolset 构建的应用程序,以支持在多个 Red Hat Enterprise Linux 版本上执行。这会创建额外的安全风险,因为标准 Red Hat Enterprise Linux 勘误不会更改此代码。如果因为这种风险,开发人员需要重建其应用程序,红帽会使用安全勘误来进行通讯。
由于这个额外的安全风险,强烈建议开发人员不要因为同样的原因静态连接其整个应用程序。
链接时在对象文件后指定库
在 GCC Toolset 中,库使用 linker 脚本链接,这些脚本可以通过静态归档指定一些符号。这需要保证与多个 Red Hat Enterprise Linux 版本兼容。但是, linker 脚本使用相应的共享对象文件的名称。因此,链接器使用不同于预期的符号处理规则,且在指定对象文件选项前指定了库添加选项时,无法识别对象文件所需的符号:
$ scl enable gcc-toolset-9 'gcc -lsomelib objfile.o'
使用来自 GCC Toolset 的库会导致 linker 错误消息 undefined reference to symbol
。要防止这个问题,请遵循标准链接实践,并在指定对象文件选项后指定库:
$ scl enable gcc-toolset-9 'gcc objfile.o -lsomelib'
请注意,在使用基本 Red Hat Enterprise Linux 版本 GCC 时,此建议也适用于此建议。
13.4. GCC Toolset 9 中的 binutils 的具体设置
库的静态链接
某些最新的库功能会静态链接到通过 GCC Toolset 构建的应用程序,以支持在多个 Red Hat Enterprise Linux 版本上执行。这会创建额外的安全风险,因为标准 Red Hat Enterprise Linux 勘误不会更改此代码。如果因为这种风险,开发人员需要重建其应用程序,红帽会使用安全勘误来进行通讯。
由于这个额外的安全风险,强烈建议开发人员不要因为同样的原因静态连接其整个应用程序。
链接时在对象文件后指定库
在 GCC Toolset 中,库使用 linker 脚本链接,这些脚本可以通过静态归档指定一些符号。这需要保证与多个 Red Hat Enterprise Linux 版本兼容。但是, linker 脚本使用相应的共享对象文件的名称。因此,链接器使用不同于预期的符号处理规则,且在指定对象文件选项前指定了库添加选项时,无法识别对象文件所需的符号:
$ scl enable gcc-toolset-9 'ld -lsomelib objfile.o'
使用来自 GCC Toolset 的库会导致 linker 错误消息 undefined reference to symbol
。要防止这个问题,请遵循标准链接实践,并在指定对象文件选项后指定库:
$ scl enable gcc-toolset-9 'ld objfile.o -lsomelib'
请注意,在使用基本 Red Hat Enterprise Linux 版本的 binutils 时,建议也适用。