第2章 Red Hat Developer Toolset 12.1 リリース
2.1. 機能
2.1.1. コンポーネントのリスト
Red Hat Developer Toolset 12.1 は、以下のコンポーネントを提供します。
開発ツール
- GNU コンパイラーコレクション (GCC)
- binutils
- elfutils
- dwz
- make
- annobin
デバッグツール
- GNU デバッガー (GDB)
- strace
- ltrace
- memstomp
パフォーマンス監視ツール
- SystemTap
- Valgrind
- OProfile
- Dyninst
詳細は、『Red Hat Developer Toolset ユーザーガイド』 の Red Hat Developer Toolset コンポーネント の表を参照してください。
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
詳細は、『Using Red Hat Software Collections Container Images』のRed Hat Developer Toolset Imagesの章を参照してください。
各コンテナーイメージの最新バージョンのみがサポートされます。
2.2. 既知の問題
dyninst
コンポーネント、BZ#1763157- Dyninst 12 は、AMD64 および Intel 64 のアーキテクチャーにのみ提供されます。
gcc
コンポーネント、BZ#1731555- Red Hat Developer Toolset で作成された実行可能ファイルは、標準以外の方法で動的にリンクされます。そのため、Fortran コードは、この機能が要求されていても入出力 (I/O ) 操作を非同期に処理できません。この問題を回避するには、
libgfortran
ライブラリーを-static-libgfortran
オプションと静的にリンクして、Fortran コードで非同期 I/O 操作を有効にします。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- Red Hat Developer Toolset 3.x の GCC には、libasan パッケージが含まれていました。これは、libasan のシステムバージョンと競合している可能性があります。したがって、システムに存在した libasan に応じて、
-fsanitize=address
ツールは、システム GCC または Red Hat Developer Toolset バージョンの GCC のいずれかでのみ機能し、同時に両方で機能することはありませんでした。この競合を防ぐために、Red Hat Developer Toolset 4.x 以降のバージョンでは、パッケージの名前が libasanN に変更されました。この N は数値になります。ただし、Red Hat Software Collections リポジトリーを有効にすると、リポジトリーで引き続き利用できる Red Hat Developer Toolset 3.x バージョンよりも前のバージョンで、libasan のシステムバージョンが利用可能であるため、システムの更新後に問題が発生する可能性があります。この問題を回避するには、更新時にこのパッケージを除外します。~]$ yum update --exclude=libasan
oprofile
コンポーネント- Red Hat Developer Toolset に同梱される OProfile 1.3.0 および OProfile 1.2.0 は、IBM Z を除くすべての対応アーキテクチャーで動作します。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 レガシーモード内で収集されるデータを適切に処理できないため、cannot process data collected within 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-debuginfo、devtoolset-version-ltrace-debuginfo、devtoolset-version-valgrind-debuginfo に適用され、他の debuginfo パッケージにも適用される可能性があります。同様の競合は、64 ビットの debuginfo パッケージが 32 ビットの debuginfo パッケージと競合する multilib 環境でも発生する可能性があります。たとえば、Red Hat Enterprise Linux 7 では、devtoolset-7-gcc-debuginfo が、gcc-base-debuginfo、gcc-debuginfo、および gcc-libraries-debuginfo の 3 つのパッケージと競合します。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 12.1 をインストールする前に、競合する debuginfo パッケージを手動でアンインストールします。必要な場合に関連する debuginfo パッケージのみをインストールし、そのような問題の発生を想定することを推奨します。
その他の注意事項
- Red Hat Developer Toolset は、主に複数のバージョンの Red Hat Enterprise Linux にデプロイするユーザーアプリケーションの開発用のコンパイラーを提供することを目的としています。オペレーティングシステムのコンポーネント、カーネルモジュール、およびデバイスドライバーは、通常、提供されるベース OS コンパイラーが推奨されている特定バージョンの Red Hat Enterprise Linux に対応します。
- Red Hat Developer Toolset 12.1 は、C、C++、および Fortran の開発のみをサポートします。その他の言語の場合は、Red Hat Enterprise Linux で利用可能な GCC のシステムバージョンを呼び出します。
- Red Hat Enterprise Linux で Red Hat Developer Toolset 12.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 を使用してください。
- Red Hat Developer Toolset 12.1 の非共有ライブラリー
libstdc++_nonshared.a
にあるすべてのコードは、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-12 '/usr/lib64/ccache/gcc -c foo.c'
または、デフォルトのコンパイラーとして GCC の Red Hat Developer Toolset バージョンでシェルを作成できます。~]$ scl enable devtoolset-12 'bash'
シェルを作成したら、以下の 2 つのコマンドを実行します。~]$ export PATH=/usr/lib64/ccache${PATH:+:${PATH}}
~]$ gcc -c foo.c
- Red Hat Developer Toolset 12.1 に含まれる elfutils ライブラリーは、クライアントアプリケーションに静的にリンクされているため、
libelf
、libdw
、およびlibasm
データ構造体のハンドルを外部コードに渡す場合、また、外部コードから受信したハンドルをlibelf
、libdw
、およびlibasm
に渡す場合は注意が必要です。elfutils のシステムバージョンに対して動的にリンクされている外部ライブラリーに、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 に含まれるライブラリーに対して再コンパイルする必要があります。 libdw
によって内部で使用される elfutilsEBL
ライブラリーは、バックエンドを動的に開かないように修正されました。代わりに、バックエンドの選択がライブラリー自体でコンパイルされます。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) 命令に関するエラータ HSW136 を発行しました。特定の状況では、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 リンカー、
gold
およびld
は、非表示のシンボルを処理する方法が複数あります。これにより、動作の非互換性が発生します。以前は、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 を実行する必要がある場合は、valgrind および valgrind-openmpi パッケージの最新の Red Hat Enterprise Linux システムバージョンを使用することが推奨されます。