第 2 章  Red Hat Developer Toolset 12.1 发行版本


2.1. 功能

2.1.1. 组件列表

Red Hat Developer Toolset 12.1 提供以下组件:

开发工具

  • GNU Compiler Collection (GCC)
  • binutils
  • elfutils
  • dwz
  • make
  • annobin

调试工具

  • GNU 调试器(GDB)
  • strace
  • ltrace
  • memstomp

性能监控工具

  • SystemTap
  • Valgrind
  • oProfile
  • Dyninst

2.1.2. Red Hat Developer Toolset 12.1 中的更改

Red Hat Developer Toolset 12.1 中的所有组件都使用 devtoolset-12- 前缀发布,仅适用于 Red Hat Enterprise Linux 7。
与之前的 Red Hat Developer Toolset 版本相比,Red Hat Developer Toolset 12.1 中已升级以下组件:
  • GCC 到版本 12.2.1
  • annobin 到版本 11.08
此外,还可为 binutils 提供安全更新。
有关 Red Hat Developer Toolset 12.1 中更改的详细信息,请参阅 Red Hat Developer Toolset 用户指南

2.1.3. 容器镜像

以下容器镜像已使用 Red Hat Developer Toolset 更新:
  • rhscl/devtoolset-12-perftools-rhel7
  • rhscl/devtoolset-12-toolchain-rhel7
请注意,只支持每个容器镜像的最新版本。

2.2. 已知问题

dyninst component, BZ#1763157
Dyninst 12 仅为 AMD64 和 Intel 64 架构提供。
gcc component, BZ#1731555
使用 Red Hat Developer Toolset 创建的可执行文件以非标准方式动态链接。因此,即使请求此功能,Fortran 代码无法异步处理输入/输出(I/O)操作。要临时解决这个问题,使用 -static- libgfortran 选项静态链接 libgfortran 库,以便在 Fortran 代码中启用异步 I/O 操作。请注意,红帽不建议出于安全原因静态链接。
GCC 组件, BZ39)1570853
在 Red Hat Developer Toolset 中,库通过 linker 脚本链接,这些脚本可通过静态归档指定一些符号。这是为了确保与多个 Red Hat Enterprise Linux 版本兼容所必需的。但是,链接器脚本使用对应的共享对象文件的名称。因此,链接器使用不同于预期的符号处理规则,在指定对象文件的选项前无法识别对象文件所需的符号,例如:
gcc -lsomelib objfile.o
使用 Red Hat Developer Toolset 中的库会导致 linker 错误消息 undefined reference to symbol。要启用成功符号解析和链接,请按照标准链接实践操作,并在指定对象文件的选项后指定添加库的选项:
gcc objfile.o -lsomelib
请注意,这个建议也适用于将 GCC 版本用作 Red Hat Enterprise Linux 的一部分。
GCC 组件, BZ39)1433946
Red Hat Developer Toolset 3.x 中的 GCC 包含 libasan 软件包,该软件包可能与系统版本 libasan 冲突。因此,根据系统中存在 libasan 的 libasan,-fsanitize=address 工具只与系统 GCCGCC 的 Red Hat Developer Toolset 版本一起工作,但不能同时使用。要防止上述冲突,在 Red Hat Developer Toolset 4.x 及更新的版本中,软件包被重命名为 libasanN,其中 N 是一个数字。但是,如果启用了 Red Hat Software Collections 存储库,则在系统更新后可能会出现问题,因为 libasan 的系统版本比 Red Hat Developer Toolset 3.x 版本不同(仍可在存储库中可用)。要临时解决这个问题,在更新时排除这个软件包:
~]$ yum update --exclude=libasan
OProfile 组件
Red Hat Developer Toolset 提供的 OProfile 1.3.0OProfile 1.2.0 适用于所有支持的构架,但 IBM Z 除外,其中只有 ocount 工具可用于以下模型: z196、zEC12 和 z13。operf 和其他工具(如 oparchiveopannotate )无法在 IBM Z 上工作。为了进行性能分析,用户建议使用 Red Hat Enterprise Linux 7 系统 OProfile 0.9.9 版本,它支持 TIMER 软件中断的 opcontrol
请注意,要正确报告 OProfile 0.9.9 收集的数据,需要相应的 opreport 工具。因此,基于 opcontrol的性能分析应该被禁用 Red Hat Developer Toolset,因为来自 Red Hat Developer Toolset 的报告工具无法正确处理在 opcontrol 模式下收集的数据。
Valgrind 组件, BZ945869184
默认的 Valgrind gdbserver 支持(--vgdb=yes)可能会导致某些寄存器和标志值因为 Valgrind 内核所完成的优化而始终处于最新状态。因此 GDB 工具无法显示 Valgrind 下运行的程序的某些参数或变量。要临时解决这个问题,请使用 --vgdb=full 参数。请注意,当使用此参数时,程序在 Valgrind 下可能会运行较慢。
多个组件
devtoolset-version-package_name-debuginfo 软件包可以与基本 Red Hat Enterprise Linux 系统或者其他版本的 Red Hat Developer Toolset 中的相应软件包冲突。这个名称适用于 devtoolset-version-gcc-debuginfo,devtoolset-version-ltrace-debuginfo,devtoolset-version-valgrind-debuginfo,可能也适用于其他 debuginfo 软件包。在多 lib 环境中也可以发生类似的冲突,其中 64 位 debuginfo 软件包与 32 位 debuginfo 软件包冲突。
例如,在 Red Hat Enterprise Linux 7 中,devtoolset-7-gcc-debuginfo 与三个软件包冲突: gcc-base-debuginfogcc-debuginfogcc-libraries-debuginfo。在 Red Hat Enterprise Linux 6 上,devtoolset-7-gcc-debuginfo 与一个软件包冲突: gcc-libraries-debuginfo。因此,如果安装了冲突的 debuginfo 软件包,请尝试安装 Red Hat Developer Toolset 可能会失败,并显示类似以下示例的事务检查错误消息:
file /usr/lib/debug/usr/lib64/libitm.so.1.0.0.debug from install of gcc-base-debuginfo-4.8.5-16.el7.x86_64 conflicts with file from package devtoolset-7-gcc-debuginfo-7.2.1-1.el7.x86_64
file /usr/lib/debug/usr/lib64/libtsan.so.0.0.0.debug from install of gcc-debuginfo-4.8.5-16.el7.x86_64 conflicts with file from package devtoolset-7-gcc-debuginfo-7.2.1-1.el7.x86_64
file /usr/lib/debug/usr/lib64/libitm.so.1.0.0.debug from install of devtoolset-7-gcc-debuginfo-7.2.1-1.el6.x86_64 conflicts with file from package gcc-libraries-debuginfo-7.1.1-2.3.1.el6_9.x86_64
要临时解决这个问题,请在安装 Red Hat Developer Toolset 12.1 前手动卸载冲突 debuginfo 软件包。建议仅在需要时安装相关的 debuginfo 软件包,并期望出现这些问题。

其他备注

  • Red Hat Developer Toolset 主要旨在为在多个 Red Hat Enterprise Linux 版本上部署的用户应用程序提供编译器。操作系统组件、内核模块和设备驱动程序通常与 Red Hat Enterprise Linux 的特定版本对应,建议使用提供的基础操作系统编译器。
  • Red Hat Developer Toolset 12.1 仅支持 C、C++ 和 Fortran 开发。对于其他语言,调用 Red Hat Enterprise Linux 上可用的 GCC 系统版本。
  • 在 Red Hat Enterprise Linux (例如 Red Hat Enterprise Linux 7)上使用 Red Hat Developer Toolset 12.1 构建应用程序,然后在较早的次版本(如 Red Hat Enterprise Linux 6.7.z)上执行该应用程序可能会导致运行时错误,因为 Red Hat Enterprise Linux 版本间的非链组件的不同。建议用户仔细检查兼容性。红帽只支持在相同或之后支持的 Red Hat Enterprise Linux 版本与用于构建该应用程序的版本相比,才执行使用 Red Hat Developer Toolset 构建的应用程序。
  • 在没有安装 Red Hat Developer Toolset 的 GCC 的情况下重建 Valgrind,否则它将优先于 Red Hat Enterprise Linux 系统 GCC。红帽提供的二进制文件使用系统 GCC 构建。对于任何测试,应使用 Red Hat Developer Toolset 的 GDBhttps://bugzilla.redhat.com/show_bug.cgi?id=990931
  • Red Hat Developer Toolset 12.1 中的非共享库 libstdc++_nonshared.a 中的所有代码都根据 GNU General Public License v3 的许可,在第 7 节中授权,如 GCC Runtime Library Exception 版本 3.1 所述。
  • Red Hat Developer Toolset 中包含的编译器会发出比 Red Hat Enterprise Linux 上之前提供的编译器更新的 DWARF 调试记录。这些新的调试记录以各种方法改进调试体验,特别是用于 C++ 和优化的代码。但是,某些工具还无法处理较新的 DWARF 调试记录。 要生成旧的风格的调试记录,请使用 -gdwarf-2 -gstrict-dwarf-gdwarf-3 -gstrict-dwarf 选项。
  • 有些较新的库功能被静态链接到使用 Red Hat Developer Toolset 构建的应用程序,以支持在多个 Red Hat Enterprise Linux 版本上执行。这增加了少量额外的安全风险,因为常规的 Red Hat Enterprise Linux 勘误不会更改这个代码。如果开发人员需要因为此类问题而重建其应用程序,红帽会在安全勘误中给出此问题。强烈建议开发人员静态地将整个应用程序链接在一起。
  • 请注意,在使用 -fgnu-tm 选项时,与缺少 libitm 库相关的错误消息需要安装 libitm 软件包。您可以使用以下命令安装软件包:
    yum install libitm
  • 要将 ccache 工具与 Red Hat Developer Toolset 中包含的 GCC 搭配使用,请正确设置您的环境。例如:
    ~]$ scl enable devtoolset-12 '/usr/lib64/ccache/gcc -c foo.c'
    另外,您可以使用 GCC 的 Red Hat Developer Toolset 版本创建一个 shell 作为默认编译器:
    ~]$ scl enable devtoolset-12 'bash'
    创建 shell 后,运行以下命令:
    ~]$ export PATH=/usr/lib64/ccache${PATH:+:${PATH}}
    ~]$ gcc -c foo.c
  • 因为 Red Hat Developer Toolset 12.1 中包含的 elfutils 库静态链接到客户端应用程序,因此建议在将句柄传递给 libelf libdw libasm 数据结构时谨慎。
    当外部库动态链接为 elfutils 的系统版本时,特别是要小心的,它会被传递一个指针到来自 Red Hat Developer Toolset 12.1 版本 elfutils 的结构(反之亦然)。
    通常,Red Hat Developer Toolset 12.1 版本中使用的数据结构与 Red Hat Enterprise Linux 系统版本不兼容,另一版本不应该受到其他结构。
    在使用 Red Hat Developer Toolset 12.1 库的应用程序中,链接到库系统版本的所有代码都应重新编译到 Red Hat Developer Toolset 12.1 中包含的库。
  • elfutils EBL 库被 libdw 内部使用,没有动态打开后端。相反,在库本身中编译了一个后端: 32 位 AMD 和 Intel 架构、AMD64 和 Intel 64 系统、Intel Ice、IBM Z、32 位 IBM Power Systems、64 位 IBM Power Systems、IBM POWER、big endian 和 64 位 ARM 架构。如果客户端希望使用上述架构中的 ELF 文件,则一些功能可能不可用。
  • scl 工具管理的一些软件包包括需要 sudo 的特权服务。系统 sudo 清除环境变量,因此 Red Hat Developer Toolset 包含自己的 sudo shell 脚本,嵌套 scl enable。此脚本目前不会解析或传递正常的 sudo 选项,只解析或传递 sudo COMMAND ARGS ...。要使用启用了 Red Hat Developer Toolset 的 shell 中的 sudo 系统版本,请使用 /usr/bin/sudo 二进制文件。
  • Intel 发布了勘误 HSW136 涉及 TSX (事务同步扩展)说明。在某些情况下,使用 Intel TSX 指令的软件可能会导致无法预计的行为。在特定情况下,FcoreX 指令可由使用 Red Hat Developer Toolset GCC 构建的应用程序执行。这包括在启用了 TSX 指令的硬件上执行 GCC 的实验性内存支持(使用 -fgnu-tm 选项)。目前,在试验交易内存时,建议 Red Hat Developer Toolset 用户谨慎,或者通过应用适当的硬件或固件更新来禁用 TSX 指令。
  • 要在 GCC 中使用内存保护扩展(MPX)功能,需要 libmpx 库的 Red Hat Developer Toolset 版本,否则应用程序可能无法正确链接。
  • 两个 binutils 链接器( 金级 和授权)有不同的处理隐藏符号的方法,这会导致其行为不兼容。在以前的版本中,与共享库和隐藏符号相关的 金级ld 链接器的行为不一致。有两种场景:
    • 如果共享库引用了在隐藏和非隐藏版本中存在的符号,则 金级 链接器会生成有关隐藏版本的 bogus 警告信息。
    • 如果共享库引用了仅作为隐藏符号在其他位置存在的符号,则 金级 链接器会创建一个可执行文件,即使它无法工作。
    金级 链接器已更新,不再发出有关非隐藏版本中也存在的隐藏符号的警告消息。第二个场景无法在链接器中解决。规定需要确保应用程序运行时有非隐藏的符号版本。
    因此,两个链接器的行为更为接近,但它们在对一个非隐藏版本中无法发现的隐藏符号的引用时,它们仍然有所不同。不幸的是,在这种情况下没有单一正确的行为,因此允许链接器不同。
  • valgrind-openmpi 子软件包不再由 Red Hat Developer Toolset 中的 Valgrind 提供。devtoolset-<version>-valgrind-openmpi 子软件包以前会导致与各种 Red Hat Enterprise Linux 次版本不兼容的问题以及重建的问题。如果需要针对针对针对 openmpi-devel 库构建的程序运行 Valgrind valgrind -openmpi 软件包,则建议使用最新的 Red Hat Enterprise Linux 系统版本 valgrind 和 valgrind-openmpi 软件包。
  • 自 Red Hat Developer Toolset 12 开始,SystemTap 不再提供 stap-server 二进制文件。BZ#2099259
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.