Red Hat Training

A Red Hat training course is available for RHEL 8

4.2. GCC Toolset 9

GCC Toolset バージョン 9 とこのバージョンに含まれるツールに固有の情報について説明します。

4.2.1. GCC Toolset 9 が提供するツールおよびバージョン

GCC Toolset 9 は、以下のツールおよびバージョンを提供します。

表4.1 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 を使用している場合にも適用されることに注意してください。