第2章 Red Hat Developer Toolset 9.1 リリース

2.1. 特長

2.1.1. コンポーネントの一覧

Red Hat Developer Toolset 9.1 は、以下のコンポーネントを提供します。

開発ツール

  • GNU コンパイラーコレクション (GCC)
  • binutils
  • elfutils
  • dwz
  • make
  • annobin

デバッグツール

  • GNU デバッガー (GDB)
  • strace
  • ltrace
  • memstomp

Performance Monitoring Tools

  • SystemTap
  • Valgrind
  • oprofile
  • Dyninst
詳細は、『Red Hat Developer Toolset User Guide』 の Red Hat Developer Toolset Components 表を参照してください。

2.1.2. Red Hat Developer Toolset 9.1 の変更点

2.1.2.1. 更新されたコンポーネント

Red Hat Developer Toolset 9.1 のすべてのコンポーネントは devtoolset-9- プレフィックスで配布され、Red Hat Enterprise Linux 7 専用です。
Red Hat Developer Toolset の以前のリリースと比較すると、以下のコンポーネントが Red Hat Developer Toolset 9.1 でアップグレードされました。
  • GCC バージョン 9.3.1
さらに、以下のコンポーネントに対するバグ修正の更新を利用できます。
  • binutils
  • elfutils
  • ltrace
  • make
  • strace
  • SystemTap
Red Hat Developer Toolset 9.1 の変更に関する詳細は、Red Hat Developer Toolset User Guide を参照してください。

2.1.2.2. コンテナーイメージ

Red Hat Developer Toolset 9.1 には、以前にビルドされたコンテナーイメージが 2 つ含まれています。
  • 以下の Red Hat Developer Toolset コンポーネントが含まれる rhscl/devtoolset-9-toolchain-rhel7 イメージ。
    • devtoolset-9-gcc
    • devtoolset-9-gcc-c++
    • devtoolset-9-gcc-fortran
    • devtoolset-9-gdb
    また、devtoolset-9-binutils コンポーネントは rhscl/devtoolset-9-toolchain-rhel7 イメージで devtoolset-9-gcc によってプルされます。
  • 以下のコンポーネントが含まれる rhscl/devtoolset-9-perftools-rhel7 イメージ。
    • devtoolset-9-dwz
    • devtoolset-9-dyninst
    • devtoolset-9-elfutils
    • devtoolset-9-ltrace
    • devtoolset-9-make
    • devtoolset-9-memstomp
    • devtoolset-9-oprofile
    • devtoolset-9-strace
    • devtoolset-9-systemtap
    • devtoolset-9-valgrind
コンテナーイメージは、Red Hat Container Registry から入手できます。イメージの取得方法およびこれらのイメージを使用して Red Hat Developer Toolset コンポーネントを実行する方法は、Using Red Hat Software Collections Container Images を参照してください。

2.2. 既知の問題

dyninst コンポーネント、BZ#1763157
Dyninst 10 は、AMD64 および Intel 64 のアーキテクチャーでのみ提供されます。
gcc コンポーネント、BZ#1731555
Red Hat Developer Toolset で作成された実行可能ファイルは、標準以外の方法で動的にリンクされます。そのため、Fortran コードは、この機能が要求されていても入出力 (I/O )操作を非同期に処理できません。この問題を回避するには、libgfortran ライブラリーを、Fortran コードで非同期 I/O 操作を有効にするために -static-libgfortran オプションと静的にリンクします。Red Hat では、セキュリティー上の理由から、静的リンクの使用は推奨していません。
gcc コンポーネント、BZ#1570853
Red Hat Developer Toolset では、ライブラリーは、静的アーカイブで一部のシンボルを指定できるリンカースクリプトを使用してリンクされます。これは、Red Hat Enterprise Linux の複数のバージョンとの互換性を確保するために必要になります。ただし、リンカーのスクリプトは、対応する共有オブジェクトファイルの名前を使用します。したがって、リンカーは、オブジェクトファイルを指定するオプションの前に、ライブラリーを追加するオプションを指定する際に、想定とは異なるシンボル処理ルールを使用して、以下のようなオブジェクトファイルが必要とするシンボルを認識しません。
gcc -lsomelib objfile.o
このような Red Hat Developer Toolset のライブラリーを使用すると、リンカーのエラーメッセージ undefined reference to symbol が表示されます。シンボル解決とリンクを正常に有効にするには、標準のリンクプラクティスに従い、オブジェクトファイルを指定するオプションの後に、ライブラリーを追加するオプションを指定します。
gcc objfile.o -lsomelib
この推奨事項は、Red Hat Enterprise Linux の一部として利用可能な GCC のバージョンを使用する場合にも適用されることに注意してください。
gcc コンポーネント、BZ#1433946
GCC Red Hat Developer Toolset 3.x には libasan パッケージが含まれ、これが libasan のシステムバージョンと競合している可能性があります。したがって、システムに存在していた libasan、この -fsanitize=address ツールがシステムの GCC または GCC の Red Hat Developer Toolset バージョンで動作していたか (ただし同時ではない) によって決まります。この競合を防ぐために、Red Hat Developer Toolset 4.x 以降のバージョンでは、パッケージの名前が変更されました。この libasanNN は数値です。ただし、Red Hat Software Collections リポジトリーを有効にすると、リポジトリーで利用できる Red Hat Developer Toolset 3.x バージョンよりも前のバージョンで、libasan のシステムバージョン (依然としてリポジトリーで取得可能) が利用可能であるためシステムの更新後に問題が発生する可能性があります。この問題を回避するには、更新時にこのパッケージを除外します。
~]$ yum update --exclude=libasan
systemtap コンポーネント
ユーザーが devtoolset-9-stap-server サービスの起動を試行すると、IBM POWER (リトルエンディアン) アーキテクチャーで SELinux AVC 拒否が発生します。この問題を回避するには、SELinux を無効にし、サービスを起動して、SELinux を有効にします。
oprofile コンポーネント
Red Hat Developer Toolset に同梱される OProfile 1.3.0 および OProfile 1.2.0 は、対応しているすべてのアーキテクチャーで動作します (IBM Z を除く)。なお、ocount ツールは、z196、zEC12、z13 などの以下のモデルでのみ動作します。また、operf や、oparchive または opannotate などのその他ツールは、IBM Z では動作しません。プロファイリング目的のためにも、ユーザーは Red Hat Enterprise Linux 7 システム OProfile 0.9.9 バージョンを使用することが推奨されます。これは、TIMERソフトウェアを含む opcontrol が割り込むためです。
OProfile 0.9.9 によって収集されるデータの正しいレポートを行うには、対応する opreport ユーティリティーが必要になることに注意してください。そのため、Red Hat Developer Toolset のレポートツールが opcontrol レガシーモードで収集されるデータを適切に処理できないため、opcontrol ベースのプロファイリングは Red Hat Developer Toolset を無効にして実行する必要があります。
valgrind コンポーネント、BZ#869184
デフォルトの 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-debuginfodevtoolset-version-ltrace-debuginfodevtoolset-version-valgrind-debuginfo に適用され、debuginfo パッケージにも適用される可能性があります。64 debuginfo ビットパッケージが 32 ビット debuginfo パッケージと競合する multilib 環境でも同様な競合が発生する可能性があります。
たとえば、Red Hat Enterprise Linux 7 では、devtoolset-7-gcc-debuginfo は、およびの 3 つのパッケージ gcc-base-debuginfogcc-debuginfogcc-libraries-debuginfo と競合します。Red Hat Enterprise Linux 6 では、devtoolset-7-gcc-debuginfo は 1 つのパッケージ 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 9.1 をインストールする前に、競合する debuginfo パッケージを手動でアンインストールします。必要な場合に関連 debuginfo パッケージのみをインストールし、そのような問題が発生することを期待することを推奨します。

その他の注意事項

  • Red Hat Developer Toolset は、主に複数のバージョンの Red Hat Enterprise Linux にデプロイするユーザーアプリケーションの開発用のコンパイラーを提供することを目的としています。オペレーティングシステムのコンポーネント、カーネルモジュール、およびデバイスドライバーは、通常、提供されるベース OS コンパイラーが推奨されている特定バージョンの Red Hat Enterprise Linux に対応します。
  • Red Hat Developer Toolset 9.1 は、C、C++、および Fortran の開発のみをサポートします。その他の言語の場合は、Red Hat Enterprise Linux で GCC 利用可能なシステムバージョンを呼び出します。
  • Red Hat Enterprise Linux で Red Hat Developer Toolset 9.1 を使用してアプリケーションをビルド (Red Hat Enterprise Linux 7 など)、そのアプリケーションを以前のマイナーバージョンで実行すると (Red Hat Enterprise Linux 6.7.z など)、Red Hat Enterprise Linux リリース間でのツールチェーン以外のコンポーネントの違いによりランタイムエラーが発生する可能性があります。互換性を慎重に確認することが推奨されます。Red Hat は、Red Hat Developer Toolset でビルドされたアプリケーションの実行をサポートします。Red Hat Developer Toolset は、そのアプリケーションのビルドに使用するバージョンよりも、Red Hat Enterprise Linux のサポートされるリリースと同じです。
  • Valgrind Red Hat Developer Toolset が GCC インストールされずに再構築する必要があります。そうでない場合は、Red Hat Enterprise Linux システム GCC の代わりに使用されます。Red Hat が提供するバイナリーファイルは、システム GCC を使用して構築されています。テストでは、Red Hat Developer Toolset の GDB を使用してください。
  • libstdc++_nonshared.a Red Hat Developer Toolset 9.1 の共有ライブラリーにあるすべてのコードは、GNU General Public License v3 でライセンスが適用され、Free Software Foundation により公開されているように、GCC Runtime Library Exception バージョン 3.1 で説明されている、セクション 7 に記載の追加の権限で付与されます。
  • Red Hat Developer Toolset に含まれるコンパイラーは、Red Hat Enterprise Linux で利用可能な以前のコンパイラーよりも新しい DWARF デバッグレコードを生成します。これらの新しいデバッグレコードにより、特に C++ や最適化されたコードなど、さまざまな方法でデバッグ作業が改善されます。ただし、一部のツールはまだ新しい DWARF デバッグレコードを処理できません。 古いスタイルのデバッグレコードを生成するには、-gdwarf-2 -gstrict-dwarf または -gdwarf-3 -gstrict-dwarf オプションを使用します。
  • 最新のライブラリー機能の一部は、複数のバージョンの Red Hat Enterprise Linux での実行に対応するために、Red Hat Developer Toolset で構築されたアプリケーションに静的にリンクされています。これにより、通常の Red Hat Enterprise Linux エラータはこのコードを変更しないため、セキュリティーリスクが若干追加されます。このような問題により開発者がアプリケーションを再構築する必要がある場合、Red Hat はセキュリティーエラータでこれを通知します。開発者は、同じ理由でアプリケーション全体を静的にリンクしないことが強く推奨されます。
  • -fgnu-tm オプションを使用する際の欠落した libitm ライブラリーに関連するエラーメッセージでは、libitm パッケージをインストールする必要があることに注意してください。以下のコマンドでパッケージをインストールできます。
    yum install libitm
  • Red Hat Developer Toolset に含まれている含まれる GCC とともに ccache ユーティリティーを使用するには、環境を正しく設定します。以下に例を示します。
    ~]$ scl enable devtoolset-9 '/usr/lib64/ccache/gcc -c foo.c'
    デフォルトのコンパイラーとして GCC の Red Hat Developer Toolset バージョンのシェルを作成できます。
    ~]$ scl enable devtoolset-9 'bash'
    シェルを作成したら、以下の 2 つのコマンドを実行します。
    ~]$ export PATH=/usr/lib64/ccache${PATH:+:${PATH}}
    ~]$ gcc -c foo.c
  • Red Hat Developer Toolset 9.1 に含まれる elfutils ライブラリーはクライアントアプリケーションに静的にリンクされているため、libelflibdw に渡して、libasm デー構造を外部コードに渡すとき、外部コードから受信したハンドルを libelflibdwlibasm に渡すときに、注意が促されます。
    elfutils のシステムバージョンに対して動的にリンクされている外部ライブラリーには、elfutils の Red Hat Developer Toolset 9.1 バージョンの構造にポインターが渡されます。
    通常、elfutils の Red Hat Developer Toolset 9.1 バージョンで使用されるデータ構造は、Red Hat Enterprise Linux のシステムバージョンと互換性がありません。また、ある構造を他方で使用しても構いません。
    Red Hat Developer Toolset 9.1 ライブラリーを使用するアプリケーションでは、ライブラリーのシステムバージョンにリンクされていたすべてのコードは、Red Hat Developer Toolset 9.1 に含まれるライブラリーに対して再コンパイルする必要があります。
  • libdw で内部的に使用されている elfutils EBL ライブラリーは、バックエンドを動的に開くように修正されました。代わりに、バックエンドの選択がライブラリー自体でコンパイルされます。32 ビット AMD および Intel アーキテクチャー、AMD64 および Intel 64 システム、Intel Itanium、IBM Z、32 ビット IBM Power Systems、64 ビット IBM Power Systems、IBM POWER、ビッグエンディアン、および 64 ビット ARM アーキテクチャー。クライアントが上記のもの以外のアーキテクチャーの ELF ファイルと連携する必要がある場合には、一部の機能が利用できない場合があります。
  • scl ユーティリティーが管理する一部のパッケージには、sudo を必要とする特権付きサービスが含まれます。システムは環境変数を sudo クリアするため、Red Hat Developer Toolset には、scl enable をラッピングした 独自の sudo シェルスクリプトが含まれます。現在、このスクリプトは正常な sudo オプションを解析または渡しません。sudo COMMAND ARGS ... だけが解析されて渡されます。Red Hat Developer Toolset 対応シェル内で sudo のシステムバージョンを使用するには、/usr/bin/sudo バイナリーを使用します。
  • Intel 社が TSX (Transactional Synchronization Extensions) 命令に関するエラータ HSW 136 を発行しました。特定の状況では、Intel TSX 命令を使用するソフトウェアにより、予期しない動作が発生する可能性があります。TSX 命令は、特定の条件下で Red Hat Developer Toolset GCC で構築されたアプリケーションによって実行できます。これらには、TSX 命令が有効なハードウェアで実行される場合に GCC の実験的な Transactional Memory サポート (-fgnu-tm オプションを使用) が含まれます。Red Hat Developer Toolset のユーザーは、現時点でトランザクションメモリーを試す場合や、適切なハードウェアまたはファームウェアの更新を適用して TSX 命令を無効にする場合は、注意が必要です。
  • GCC の Memory Protection Extensions (MPX) 機能を使用するには、Red Hat Developer Toolset バージョンの libmpx ライブラリーが必要となり、アプリケーションが適切にリンクされない可能性があります。
  • 2 つの binutils リンカー goldld には、非表示のシンボルを処理する方法が複数あります。これにより、動作の非互換性が発生します。以前では、gold および ld リンカーには、共有ライブラリーと非表示のシンボルに関して、およびリンカーの動作に一貫性がなく、誤った動作がありました。以下の 2 つのシナリオがあります。
    • 共有ライブラリーが、非表示バージョンと非非表示バージョンの両方に存在するシンボルを参照する場合、gold リンカーにより、非表示バージョンに関する偽の警告メッセージが生成されました。
    • 共有ライブラリーが非表示のシンボルとしてしか存在しないシンボルを参照すると、gold リンカーが機能しなくても実行ファイルを作成しました。
    gold リンカーが更新され、非表示でないバージョンにも存在する非表示のシンボルに関する警告メッセージが発行されなくなりました。2 つ目のシナリオは、リンカーで解決できません。アプリケーションの実行時に非表示以外のバージョンのシンボルを利用できるのは、プログラマー次第です。
    したがって、この 2 つのリンカーの動作はより密接になりますが、非表示でないバージョンで見つけられない非表示シンボルへの参照の場合とは異なります。ただし、この状況には正しい動作が 1 つないため、リンカーは異なります。
  • valgrind-openmpi サブパッケージは、Red Hat Developer Toolset Valgrind では提供されなくなりました。以前、devtoolset-<version>-valgrind-openmpi サブパッケージは、さまざまな Red Hat Enterprise Linux マイナーリリースおよび再ビルドの問題に非互換性の問題が生じていました。openmpi-devel ライブラリーに対して構築されたプログラム Valgrind に対して実行する必要がある場合は、最新の Red Hat Enterprise Linux システムバージョン valgrind および valgrind-openmpi パッケージを使用することが推奨されます。