4.2. GCC Toolset 9
GCC Toolset バージョン 9 とこのバージョンに含まれるツールに固有の情報について説明します。
4.2.1. GCC Toolset 9 が提供するツールおよびバージョン
GCC Toolset 9 は、以下のツールおよびバージョンを提供します。
名前 | バージョン | 説明 |
---|---|---|
GCC | 9.2.1 | C、C++、および Fortran に対応するポータブルなコンパイラースイート。 |
GDB | 8.3 | C、C++、および Fortran で記述されたプログラムのコマンドラインデバッガー。 |
Valgrind | 3.15.0 | メモリーエラーを検出したり、メモリー管理問題を特定したり、システムコールで引数が間違って使用されているのを報告するために、アプリケーションのプロファイルを行うインストルメンテーションフレームワークや多数のツールです。 |
SystemTap | 4.1 | インストルメント化、再コンパイル、インストール、および再起動を行わずにシステム全体のアクティビティーを監視するトレースおよびプローブのツール。 |
Dyninst | 10.1.0 | 実行時にユーザー空間の実行ファイルをインストルメント化し、作業するためのライブラリー。 |
binutils | 2.32 | オブジェクトファイルおよびバイナリーを検査および操作するためのバイナリーツールおよびその他のユーティリティーのコレクション。 |
elfutils | 0.176 | ELF ファイルを検証および操作するためのバイナリーツールおよびその他のユーティリティーのコレクション。 |
dwz | 0.12 | ELF 共有ライブラリーおよび ELF 実行ファイルに含まれる DWARF デバッグ情報 (サイズ) を最適化するツール。 |
make | 4.2.1 | ビルド自動化ツールの依存関係の追跡。 |
strace | 5.1 | プログラムが使用するシステムコールを監視し、受信するシグナルを監視するデバッグツール。 |
ltrace | 0.7.91 | プログラムが作成する動的ライブラリーへの呼び出しを表示するデバッグツール。また、プログラムが実行するシステムコールを監視することもできます。 |
annobin | 9.08 | ビルドセキュリティーチェックツール。 |
4.2.2. GCC Toolset 9 での C++ 互換性
ここで示されている互換性情報は、GCC Toolset 9 の GCC にのみ適用されます。
GCC Toolset の GCC コンパイラーは、以下の C++ 規格を使用できます。
- C++14
これは、GCC Toolset 9 の デフォルト の言語標準設定で、GNU 拡張機能は、
-std=gnu++14
オプションを明示的に使用するのと同じです。適切なフラグでコンパイルされた C++ オブジェクトがすべて、GCC バージョン 6 以降を使用してビルドされている場合は、C++14 言語バージョンの使用に対応します。
- C++11
この言語の規格は、GCC Toolset 9 で利用できます。
適切なフラグでコンパイルされた C++ オブジェクトがすべて、GCC バージョン 5 以降を使用してビルドされている場合は、C++11 言語バージョンの使用に対応しています。
- C++98
- この言語の規格は、GCC Toolset 9 で利用できます。この規格を使用して構築されたバイナリー、共有ライブラリー、およびオブジェクトは、GCC Toolset、Red Hat Developer Toolset、ならびに RHEL 5、6、7、および 8 の GCC でビルドされているかどうかにかかわらず、自由に組み合わせることができます。
- C++17, C++2a
- このような言語の規格は、GCC Toolset 9 では実験的で、不安定な、サポート対象外の機能としてのみ利用できます。さらに、この規格を使用して構築されたオブジェクト、バイナリーファイル、およびライブラリーの互換性は保証できません。
すべての言語規格は、規格に準拠したバリアントまたは GNU 拡張機能の両方で利用できます。
GCC Toolset で構築されたオブジェクトを、RHEL ツールチェーン (特に .o
ファイルまたは ..a
ファイル) で構築したオブジェクトと混在する場合、GCC Toolset ツールチェーンはどの連携にも使用する必要があります。これにより、GCC Toolset が提供する新しいライブラリー機能は、リンク時に解決されます。
4.2.3. GCC Toolset 9 での GCC の詳細
ライブラリーの静的リンク
最新のライブラリー機能の一部は、複数のバージョンの Red Hat Enterprise Linux での実行に対応するために、GCC Toolset で構築されたアプリケーションに静的にリンクされています。標準の Red Hat Enterprise Linux エラータではこのコードが変更されないため、これにより、若干のセキュリティーリスクが発生します。Red Hat は、このリスクにより、開発者がアプリケーションを再構築する必要がある場合でも、セキュリティーエラータを使用してこのアプリケーションと通信します。
このようなセキュリティーリスクが発生するため、開発者は同じ理由によりアプリケーション全体を静的にリンクしないことが強く推奨されます。
連結時に、オブジェクトファイルの後にライブラリーを指定
GCC Toolset では、ライブラリーは、静的アーカイブで一部のシンボルを指定できるリンカースクリプトを使用してリンクされます。これは、Red Hat Enterprise Linux の複数のバージョンとの互換性を確保するために必要になります。ただし、リンカーのスクリプトは、対応する共有オブジェクトファイルの名前を使用します。したがって、リンカーは、オブジェクトファイルを指定するオプションの前に、ライブラリーを追加するオプションを指定する際に、想定とは異なるシンボル処理ルールを使用して、オブジェクトファイルが必要とするシンボルを認識しません。
$ scl enable gcc-toolset-9 'gcc -lsomelib objfile.o'
この方法で GCC Toolset のライブラリーを使用すると、リンカーのエラーメッセージで、シンボルの参照が未定義
になります。この問題を回避するには、標準のリンクプラクティスに従い、オブジェクトファイルを指定するオプションの後に、ライブラリーを追加するオプションを指定します。
$ scl enable gcc-toolset-9 'gcc objfile.o -lsomelib'
この推奨事項は、Red Hat Enterprise Linux のベースバージョンの GCC を使用する場合にも適用されることに注意してください。
4.2.4. GCC Toolset 9 における binutils の詳細
ライブラリーの静的リンク
最新のライブラリー機能の一部は、複数のバージョンの Red Hat Enterprise Linux での実行に対応するために、GCC Toolset で構築されたアプリケーションに静的にリンクされています。標準の Red Hat Enterprise Linux エラータではこのコードが変更されないため、これにより、若干のセキュリティーリスクが発生します。Red Hat は、このリスクにより、開発者がアプリケーションを再構築する必要がある場合でも、セキュリティーエラータを使用してこのアプリケーションと通信します。
このようなセキュリティーリスクが発生するため、開発者は同じ理由によりアプリケーション全体を静的にリンクしないことが強く推奨されます。
連結時に、オブジェクトファイルの後にライブラリーを指定
GCC Toolset では、ライブラリーは、静的アーカイブで一部のシンボルを指定できるリンカースクリプトを使用してリンクされます。これは、Red Hat Enterprise Linux の複数のバージョンとの互換性を確保するために必要になります。ただし、リンカーのスクリプトは、対応する共有オブジェクトファイルの名前を使用します。したがって、リンカーは、オブジェクトファイルを指定するオプションの前に、ライブラリーを追加するオプションを指定する際に、想定とは異なるシンボル処理ルールを使用して、オブジェクトファイルが必要とするシンボルを認識しません。
$ scl enable gcc-toolset-9 'ld -lsomelib objfile.o'
この方法で GCC Toolset のライブラリーを使用すると、リンカーのエラーメッセージで、シンボルの参照が未定義
になります。この問題を回避するには、標準のリンクプラクティスに従い、オブジェクトファイルを指定するオプションの後に、ライブラリーを追加するオプションを指定します。
$ scl enable gcc-toolset-9 'ld objfile.o -lsomelib'
また、この推奨事項は、Red Hat Enterprise Linux のベースバージョンの binutils を使用している場合にも適用されることに注意してください。