4.4. GCC Toolset 14
了解特定于 GCC Toolset 版本 14 以及此版本中包含的工具的信息。
4.4.1. GCC Toolset 14 提供的工具和版本
GCC Toolset 14 提供以下工具和版本:
| Name | 版本 | 描述 | 
|---|---|---|
| GCC | 14.2.1 | 可移植编译器套件,支持 C、C++ 和 Fortran。 | 
| binutils | 2.41 | 用于检查和操作对象文件和二进制文件的二进制工具集合。 | 
| dwz | 0.14 | 可优化 ELF 共享库和 ELF 可执行文件中包含的 DWARF 调试信息的工具,以获得大小。 | 
| annobin | 12.70 | 构建安全检查工具。 | 
在 RHEL 9.5 中,系统 GDB 被 rebase 到版本 14.2,GDB 不再包含在 GCC Toolset 中。
4.4.2. GCC Toolset 14 中的 C++ 兼容性
这里给出的兼容性信息只适用于 GCC Toolset 14 中的 GCC。
GCC Toolset 中的 GCC 编译器可使用以下 C++ 标准:
- C++14
- 这个语言标准在 GCC Toolset 14 中提供。 - 当使用相应标志编译的所有 C++ 对象使用 GCC 版本 6 或更高版本构建时,支持使用 C++14 语言版本。 
- C++11
- 这个语言标准在 GCC Toolset 14 中提供。 - 当使用相应标志编译的所有 C++ 对象使用 GCC 版本 5 或更高版本构建时,支持使用 C++11 语言版本。 
- C++98
- 这个语言标准在 GCC Toolset 14 中提供。无论使用 GCC Toolset、Red Hat Developer Toolset 和 RHEL 5、6、7 和 8 的 GCC 都可以自由混合使用这个标准构建的二进制文件、共享库和对象。
- C++17
- 这个语言标准在 GCC Toolset 14 中提供。 - 这是 GCC Toolset 14 的默认语言标准设置,带有 GNU 扩展,相当于明确使用选项 - -std=gnu++17。- 当使用相应标志编译的所有 C++ 对象使用 GCC 版本 10 或更高版本构建时,支持使用 C++17 语言版本。 
- c++20 和 C++23
- 这些语言标准在 GCC Toolset 14 中仅作为实验性的、不稳定的和不受支持的功能提供。另外,无法保证使用此标准构建的对象、二进制文件和库的兼容性。 - 要启用 C++20 标准,请在 g++ 命令行中添加命令行选项 - -std=c++20。- 要启用 C++23 标准,请在 g++ 命令行中添加命令行选项 - -std=c++23。
所有语言标准均有标准兼容变体和 GNU 扩展。
					当使用 GCC Toolset 和这些 RHEL 工具链(特别是 .o 或 .a 文件)混合对象构建时,GCC Toolset 工具链应该用于所有链接。这样可确保仅由 GCC Toolset 提供的较新的库功能在链接时得以解决。
				
4.4.3. GCC Toolset 14 中 GCC 的具体信息
库的静态链接
某些最新的库功能被静态链接到使用 GCC Toolset 构建的应用程序,以支持在多个 Red Hat Enterprise Linux 版本上执行。这会产生一个小的安全风险,因为标准的 Red Hat Enterprise Linux 勘误没有改变这个代码。如果因这个风险开发人员需要重建其应用程序,红帽将使用一个安全勘表进行沟通。
由于这个额外的安全风险,强烈建议开发人员不要静态地将整个应用程序链接在一起。
在进行链接时,在对象文件后指定库
在 GCC Toolset 中,库使用 linker 脚本链接,这些脚本可通过静态归档指定某些符号。这是为了确保与多个 Red Hat Enterprise Linux 版本兼容所必需的。但是,链接器脚本使用对应的共享对象文件的名称。因此,linker 使用不同于预期的符号处理规则,在指定程序库选项前不识别对象文件所需的符号:
scl enable gcc-toolset-14 'gcc -lsomelib objfile.o'
$ scl enable gcc-toolset-14 'gcc -lsomelib objfile.o'
					以这种方式使用 GCC Toolset 的库会导致 linker 错误消息 undefined reference to symbol。要防止这个问题,请按照标准链接实践操作,并在指定对象文件的选项后添加库:
				
scl enable gcc-toolset-14 'gcc objfile.o -lsomelib'
$ scl enable gcc-toolset-14 'gcc objfile.o -lsomelib'请注意,这个建议也适用于使用 GCC 的基本 Red Hat Enterprise Linux 版本。
4.4.4. GCC Toolset 14 中 binutils 的具体信息
库的静态链接
某些最新的库功能被静态链接到使用 GCC Toolset 构建的应用程序,以支持在多个 Red Hat Enterprise Linux 版本上执行。这会产生一个小的安全风险,因为标准的 Red Hat Enterprise Linux 勘误没有改变这个代码。如果因这个风险开发人员需要重建其应用程序,红帽将使用一个安全勘表进行沟通。
由于这个额外的安全风险,强烈建议开发人员不要静态地将整个应用程序链接在一起。
在进行链接时,在对象文件后指定库
在 GCC Toolset 中,库使用 linker 脚本链接,这些脚本可通过静态归档指定某些符号。这是为了确保与多个 Red Hat Enterprise Linux 版本兼容所必需的。但是,链接器脚本使用对应的共享对象文件的名称。因此,linker 使用不同于预期的符号处理规则,在指定程序库选项前不识别对象文件所需的符号:
scl enable gcc-toolset-14 'ld -lsomelib objfile.o'
$ scl enable gcc-toolset-14 'ld -lsomelib objfile.o'
					以这种方式使用 GCC Toolset 的库会导致 linker 错误消息 undefined reference to symbol。要防止这个问题,请按照标准链接实践操作,并在指定对象文件的选项后添加库:
				
scl enable gcc-toolset-14 'ld objfile.o -lsomelib'
$ scl enable gcc-toolset-14 'ld objfile.o -lsomelib'请注意,这个建议也适用于使用 binutils 的基本 Red Hat Enterprise Linux 版本。
4.4.5. GCC Toolset 14 中 annobin 的具体信息
					在某些情况下,由于 GCC Toolset 14 中 annobin 和 gcc 之间的同步问题,您的编译可能会失败,并显示类似如下的错误消息:
				
cc1: fatal error: inaccessible plugin file opt/rh/gcc-toolset-14/root/usr/lib/gcc/architecture-linux-gnu/14/plugin/gcc-annobin.so expanded from short plugin name gcc-annobin: No such file or directory
cc1: fatal error: inaccessible plugin file
opt/rh/gcc-toolset-14/root/usr/lib/gcc/architecture-linux-gnu/14/plugin/gcc-annobin.so
expanded from short plugin name gcc-annobin: No such file or directory
					要临时解决这个问题,请从 annobin.so 文件中创建一个符号链接到 gcc-annobin.so 文件中:
				
cd /opt/rh/gcc-toolset-14/root/usr/lib/gcc/architecture-linux-gnu/14/plugin ln -s annobin.so gcc-annobin.so
# cd /opt/rh/gcc-toolset-14/root/usr/lib/gcc/architecture-linux-gnu/14/plugin
# ln -s annobin.so gcc-annobin.so使用您系统中使用的构架替换 architecture :
- 
							aarch64
- 
							i686
- 
							ppc64le
- 
							s390x
- 
							x86_64