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