4.6. GCC Toolset 13
GCC Toolset バージョン 13 とこのバージョンに含まれるツールに固有の情報について説明します。
4.6.1. GCC Toolset 13 が提供するツールおよびバージョン
GCC Toolset 13 は、以下のツールおよびバージョンを提供します。
名前 | バージョン | 説明 |
---|---|---|
GCC | 13.1.1 | C、C++、および Fortran に対応するポータブルなコンパイラースイート。 |
GDB | 12.1 | C、C++、および Fortran で記述されたプログラムのコマンドラインデバッガー。 |
binutils | 2.40 | オブジェクトファイルおよびバイナリーを検査および操作するためのバイナリーツールおよびその他のユーティリティーのコレクション。 |
dwz | 0.14 | ELF 共有ライブラリーおよび ELF 実行ファイルに含まれる DWARF デバッグ情報 (サイズ) を最適化するツール。 |
annobin | 12.20 | ビルドセキュリティーチェックツール。 |
4.6.2. GCC Toolset 13 の C++ 互換性
ここで示されている互換性情報は、GCC Toolset 13 の GCC にのみ適用されます。
GCC Toolset の GCC コンパイラーは、以下の C++ 規格を使用できます。
- C++14
この言語の規格は、GCC Toolset 13 で利用できます。
適切なフラグでコンパイルされた C++ オブジェクトがすべて、GCC バージョン 6 以降を使用してビルドされている場合は、C++14 言語バージョンの使用に対応します。
- C++11
この言語の規格は、GCC Toolset 13 で利用できます。
適切なフラグでコンパイルされた C++ オブジェクトがすべて、GCC バージョン 5 以降を使用してビルドされている場合は、C++11 言語バージョンの使用に対応しています。
- C++98
- この言語の規格は、GCC Toolset 13 で利用できます。この規格を使用して構築されたバイナリー、共有ライブラリー、およびオブジェクトは、GCC Toolset、Red Hat Developer Toolset、ならびに RHEL 5、6、7、および 8 の GCC でビルドされているかどうかにかかわらず、自由に組み合わせることができます。
- C++17
この言語の規格は、GCC Toolset 13 で利用できます。
これは、GCC Toolset 13 のデフォルトの言語規格設定で、GNU 拡張機能は、
-std=gnu++17
オプションを明示的に使用するのと同じです。適切なフラグでコンパイルされた C++ オブジェクトがすべて、GCC バージョン 10 以降を使用してビルドされている場合は、C++17 言語バージョンの使用に対応しています。
- C++20 および C++23
このような言語の規格は、GCC Toolset 13 では実験的で、不安定な、サポート対象外の機能としてのみ利用できます。さらに、この規格を使用して構築されたオブジェクト、バイナリーファイル、およびライブラリーの互換性は保証できません。
C++20 規格を有効にするには、コマンドラインオプション
-std=c++20
を g++ コマンドラインに追加します。C++23 規格を有効にするには、コマンドラインオプション
-std=c++23
を g++ コマンドラインに追加します。
すべての言語規格は、規格に準拠したバリアントまたは GNU 拡張機能の両方で利用できます。
GCC Toolset で構築されたオブジェクトを、RHEL ツールチェーン (特に .o
ファイルまたは ..a
ファイル) で構築したオブジェクトと混在する場合、GCC Toolset ツールチェーンはどの連携にも使用する必要があります。これにより、GCC Toolset が提供する新しいライブラリー機能は、リンク時に解決されます。
4.6.3. GCC Toolset 13 の GCC の詳細
ライブラリーの静的リンク
最新のライブラリー機能の一部は、複数のバージョンの Red Hat Enterprise Linux での実行に対応するために、GCC Toolset で構築されたアプリケーションに静的にリンクされています。標準の Red Hat Enterprise Linux エラータではこのコードが変更されないため、これにより、若干のセキュリティーリスクが発生します。Red Hat は、このリスクにより、開発者がアプリケーションを再構築する必要がある場合でも、セキュリティーエラータを使用してこのアプリケーションと通信します。
このようなセキュリティーリスクが発生するため、開発者は同じ理由によりアプリケーション全体を静的にリンクしないことが強く推奨されます。
連結時に、オブジェクトファイルの後にライブラリーを指定
GCC Toolset では、ライブラリーは、静的アーカイブで一部のシンボルを指定できるリンカースクリプトを使用してリンクされます。これは、Red Hat Enterprise Linux の複数のバージョンとの互換性を確保するために必要になります。ただし、リンカーのスクリプトは、対応する共有オブジェクトファイルの名前を使用します。したがって、リンカーは、オブジェクトファイルを指定するオプションの前に、ライブラリーを追加するオプションを指定する際に、想定とは異なるシンボル処理ルールを使用して、オブジェクトファイルが必要とするシンボルを認識しません。
$ scl enable gcc-toolset-13 'gcc -lsomelib objfile.o'
この方法で GCC Toolset のライブラリーを使用すると、リンカーのエラーメッセージで、シンボルの参照が未定義
になります。この問題を回避するには、標準のリンクプラクティスに従い、オブジェクトファイルを指定するオプションの後に、ライブラリーを追加するオプションを指定します。
$ scl enable gcc-toolset-13 'gcc objfile.o -lsomelib'
この推奨事項は、Red Hat Enterprise Linux のベースバージョンの GCC を使用する場合にも適用されることに注意してください。
4.6.4. GCC Toolset 13 の binutils の詳細
ライブラリーの静的リンク
最新のライブラリー機能の一部は、複数のバージョンの Red Hat Enterprise Linux での実行に対応するために、GCC Toolset で構築されたアプリケーションに静的にリンクされています。標準の Red Hat Enterprise Linux エラータではこのコードが変更されないため、これにより、若干のセキュリティーリスクが発生します。Red Hat は、このリスクにより、開発者がアプリケーションを再構築する必要がある場合でも、セキュリティーエラータを使用してこのアプリケーションと通信します。
このようなセキュリティーリスクが発生するため、開発者は同じ理由によりアプリケーション全体を静的にリンクしないことが強く推奨されます。
連結時に、オブジェクトファイルの後にライブラリーを指定
GCC Toolset では、ライブラリーは、静的アーカイブで一部のシンボルを指定できるリンカースクリプトを使用してリンクされます。これは、Red Hat Enterprise Linux の複数のバージョンとの互換性を確保するために必要になります。ただし、リンカーのスクリプトは、対応する共有オブジェクトファイルの名前を使用します。したがって、リンカーは、オブジェクトファイルを指定するオプションの前に、ライブラリーを追加するオプションを指定する際に、想定とは異なるシンボル処理ルールを使用して、オブジェクトファイルが必要とするシンボルを認識しません。
$ scl enable gcc-toolset-13 'ld -lsomelib objfile.o'
この方法で GCC Toolset のライブラリーを使用すると、リンカーのエラーメッセージで、シンボルの参照が未定義
になります。この問題を回避するには、標準のリンクプラクティスに従い、オブジェクトファイルを指定するオプションの後に、ライブラリーを追加するオプションを指定します。
$ scl enable gcc-toolset-13 'ld objfile.o -lsomelib'
また、この推奨事項は、Red Hat Enterprise Linux のベースバージョンの binutils を使用している場合にも適用されることに注意してください。
4.6.5. GCC Toolset 13 の annobin の詳細
状況によっては、GCC Toolset 13 の annobin
と gcc
間の同期の問題が原因で、コンパイルが失敗し、次のようなエラーメッセージが表示されることがあります。
cc1: fatal error: inaccessible plugin file
opt/rh/gcc-toolset-13/root/usr/lib/gcc/architecture-linux-gnu/13/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-13/root/usr/lib/gcc/architecture-linux-gnu/13/plugin
# ln -s annobin.so gcc-annobin.so
architecture はシステムでお使いのアーキテクチャーに置き換えてください。
-
aarch64
-
i686
-
ppc64le
-
s390x
-
x86_64