4.3. GCC Toolset 10
了解特定于 GCC Toolset 版本 10 以及此版本中包含的工具的信息。
4.3.1. GCC Toolset 10 提供的工具和版本 复制链接链接已复制到粘贴板!
GCC Toolset 10 提供以下工具和版本:
Name | 版本 | 描述 |
---|---|---|
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 | 构建安全检查工具. |
4.3.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 的 GCC 构建二进制文件、共享库和对象,都可以自由混合。
- C++17
- 此语言标准在 GCC Toolset 10 中可用。
- C++20
- GCC Toolset 10 中仅以实验、不稳定和不受支持的功能提供此语言标准。此外,还无法保证使用此标准构建的对象、二进制文件和库的兼容性。
所有语言标准均可在符合标准的变体或 GNU 扩展中找到。
将与 GCC Toolset 构建的对象与通过 RHEL 工具链构建的对象(particularly. o 或.
a
文件)混合时,应将 GCC Toolset 工具链用于任何链接。这可确保任何仅由 GCC Toolset 提供的更新库功能在链接时得以解决。
4.3.3. GCC Toolset 10 中的 GCC 细节 复制链接链接已复制到粘贴板!
库的静态链接
某些较新的库功能已静态链接到使用 GCC 工具集构建的应用程序中,以支持在多个版本的 Red Hat Enterprise Linux 中执行。这会产生另外一个小的安全风险,因为标准的 Red Hat Enterprise Linux 勘误表不会改变这个代码。如果开发人员出于此风险而需要重建其应用,红帽将使用安全勘误对此进行沟通。
由于这种额外的安全风险,开发人员强烈建议不要出于相同的原因将整个应用程序静态链接。
在链接时在对象文件后指定库
在 GCC Toolset 中,库使用链接器脚本链接,这些脚本可能通过静态存档指定一些符号。这需要确保与红帽企业 Linux 的多个版本兼容。但是,链接器脚本使用对应共享对象文件的名称。因此,链接器使用与预期不同的符号处理规则,在指定对象文件选项前,在指定对象文件选项前不会识别对象文件所需的符号:
scl enable gcc-toolset-10 'gcc -lsomelib objfile.o'
$ scl enable gcc-toolset-10 'gcc -lsomelib objfile.o'
以这种方式使用 GCC Toolset 中的库会导致 未定义引用的 符号链接器错误消息。
要防止这个问题,请遵循标准链接实践,并在指定对象文件的选项后指定添加库的选项:
scl enable gcc-toolset-10 'gcc objfile.o -lsomelib'
$ scl enable gcc-toolset-10 'gcc objfile.o -lsomelib'
请注意,在使用基本 Red Hat Enterprise Linux 的 GCC 版本时,这个建议也适用。
4.3.4. GCC Toolset 10 中的 binutils 细节 复制链接链接已复制到粘贴板!
库的静态链接
某些较新的库功能已静态链接到使用 GCC 工具集构建的应用程序中,以支持在多个版本的 Red Hat Enterprise Linux 中执行。这会产生另外一个小的安全风险,因为标准的 Red Hat Enterprise Linux 勘误表不会改变这个代码。如果开发人员出于此风险而需要重建其应用,红帽将使用安全勘误对此进行沟通。
由于这种额外的安全风险,开发人员强烈建议不要出于相同的原因将整个应用程序静态链接。
在链接时在对象文件后指定库
在 GCC Toolset 中,库使用链接器脚本链接,这些脚本可能通过静态存档指定一些符号。这需要确保与红帽企业 Linux 的多个版本兼容。但是,链接器脚本使用对应共享对象文件的名称。因此,链接器使用与预期不同的符号处理规则,在指定对象文件选项前,在指定对象文件选项前不会识别对象文件所需的符号:
scl enable gcc-toolset-10 'ld -lsomelib objfile.o'
$ scl enable gcc-toolset-10 'ld -lsomelib objfile.o'
以这种方式使用 GCC Toolset 中的库会导致 未定义引用的 符号链接器错误消息。
要防止这个问题,请遵循标准链接实践,并在指定对象文件的选项后指定添加库的选项:
scl enable gcc-toolset-10 'ld objfile.o -lsomelib'
$ scl enable gcc-toolset-10 'ld objfile.o -lsomelib'
请注意,在使用基本 Red Hat Enterprise Linux 的 binutils 版本时,这个建议也适用。