Red Hat Training

A Red Hat training course is available for RHEL 8

4.3. GCC Toolset 10

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

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

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

表4.2 GCC Toolset 10 のツールバージョン

名前バージョン説明

GCC

10.2.1

C、C++、および Fortran に対応するポータブルなコンパイラースイート。

GDB

9.2

C、C++、および Fortran で記述されたプログラムのコマンドラインデバッガー。

Valgrind

3.16.0

メモリーエラーを検出したり、メモリー管理問題を特定したり、システムコールで引数が間違って使用されているのを報告するために、アプリケーションのプロファイルを行うインストルメンテーションフレームワークや多数のツールです。

SystemTap

4.4

インストルメント化、再コンパイル、インストール、および再起動を行わずにシステム全体のアクティビティーを監視するトレースおよびプローブのツール。

Dyninst

10.2.1

実行時にユーザー空間の実行ファイルをインストルメント化し、作業するためのライブラリー。

binutils

2.35

オブジェクトファイルおよびバイナリーを検査および操作するためのバイナリーツールおよびその他のユーティリティーのコレクション。

elfutils

0.182

ELF ファイルを検証および操作するためのバイナリーツールおよびその他のユーティリティーのコレクション。

dwz

0.12

ELF 共有ライブラリーおよび ELF 実行ファイルに含まれる DWARF デバッグ情報 (サイズ) を最適化するツール。

make

4.2.1

ビルド自動化ツールの依存関係の追跡。

strace

5.7

プログラムが使用するシステムコールを監視し、受信するシグナルを監視するデバッグツール。

ltrace

0.7.91

プログラムが作成する動的ライブラリーへの呼び出しを表示するデバッグツール。また、プログラムが実行するシステムコールを監視することもできます。

annobin

9.29

ビルドセキュリティーチェックツール。

4.3.2. GCC Toolset 10 での C++ 互換性

重要

ここで示されている互換性情報は、GCC Toolset 10 の GCC にのみ適用されます。

GCC Toolset の GCC コンパイラーは、以下の C++ 規格を使用できます。

C++14

これは、GCC Toolset 10 の デフォルト の言語標準設定で、GNU 拡張機能は、-std=gnu++14 オプションを明示的に使用するのと同じです。

適切なフラグでコンパイルされた C++ オブジェクトがすべて、GCC バージョン 6 以降を使用してビルドされている場合は、C++14 言語バージョンの使用に対応します。

C++11

この言語の規格は、GCC Toolset 10 で利用できます。

適切なフラグでコンパイルされた C++ オブジェクトがすべて、GCC バージョン 5 以降を使用してビルドされている場合は、C++11 言語バージョンの使用に対応しています。

C++98
この言語の規格は、GCC Toolset 10 で利用できます。この規格を使用して構築されたバイナリー、共有ライブラリー、およびオブジェクトは、GCC Toolset、Red Hat Developer Toolset、ならびに RHEL 5、6、7、および 8 の GCC でビルドされているかどうかにかかわらず、自由に組み合わせることができます。
C++17
この言語の規格は、GCC Toolset 10 で利用できます。
C++20
このような言語の規格は、GCC Toolset 10 では実験的で、不安定な、サポート対象外の機能としてのみ利用できます。さらに、この規格を使用して構築されたオブジェクト、バイナリーファイル、およびライブラリーの互換性は保証できません。

すべての言語規格は、規格に準拠したバリアントまたは GNU 拡張機能の両方で利用できます。

GCC Toolset で構築されたオブジェクトを、RHEL ツールチェーン (特に .o ファイルまたは ..a ファイル) で構築したオブジェクトと混在する場合、GCC Toolset ツールチェーンはどの連携にも使用する必要があります。これにより、GCC Toolset が提供する新しいライブラリー機能は、リンク時に解決されます。

4.3.3. GCC Toolset 10 での GCC の詳細

ライブラリーの静的リンク

最新のライブラリー機能の一部は、複数のバージョンの Red Hat Enterprise Linux での実行に対応するために、GCC Toolset で構築されたアプリケーションに静的にリンクされています。標準の Red Hat Enterprise Linux エラータではこのコードが変更されないため、これにより、若干のセキュリティーリスクが発生します。Red Hat は、このリスクにより、開発者がアプリケーションを再構築する必要がある場合でも、セキュリティーエラータを使用してこのアプリケーションと通信します。

重要

このようなセキュリティーリスクが発生するため、開発者は同じ理由によりアプリケーション全体を静的にリンクしないことが強く推奨されます。

連結時に、オブジェクトファイルの後にライブラリーを指定

GCC Toolset では、ライブラリーは、静的アーカイブで一部のシンボルを指定できるリンカースクリプトを使用してリンクされます。これは、Red Hat Enterprise Linux の複数のバージョンとの互換性を確保するために必要になります。ただし、リンカーのスクリプトは、対応する共有オブジェクトファイルの名前を使用します。したがって、リンカーは、オブジェクトファイルを指定するオプションの前に、ライブラリーを追加するオプションを指定する際に、想定とは異なるシンボル処理ルールを使用して、オブジェクトファイルが必要とするシンボルを認識しません。

$ scl enable gcc-toolset-10 'gcc -lsomelib objfile.o'

この方法で GCC Toolset のライブラリーを使用すると、リンカーのエラーメッセージで、シンボルの参照が未定義 になります。この問題を回避するには、標準のリンクプラクティスに従い、オブジェクトファイルを指定するオプションの後に、ライブラリーを追加するオプションを指定します。

$ scl enable gcc-toolset-10 'gcc objfile.o -lsomelib'

この推奨事項は、Red Hat Enterprise Linux のベースバージョンの GCC を使用する場合にも適用されることに注意してください。

4.3.4. GCC Toolset 10 における binutils の詳細

ライブラリーの静的リンク

最新のライブラリー機能の一部は、複数のバージョンの Red Hat Enterprise Linux での実行に対応するために、GCC Toolset で構築されたアプリケーションに静的にリンクされています。標準の Red Hat Enterprise Linux エラータではこのコードが変更されないため、これにより、若干のセキュリティーリスクが発生します。Red Hat は、このリスクにより、開発者がアプリケーションを再構築する必要がある場合でも、セキュリティーエラータを使用してこのアプリケーションと通信します。

重要

このようなセキュリティーリスクが発生するため、開発者は同じ理由によりアプリケーション全体を静的にリンクしないことが強く推奨されます。

連結時に、オブジェクトファイルの後にライブラリーを指定

GCC Toolset では、ライブラリーは、静的アーカイブで一部のシンボルを指定できるリンカースクリプトを使用してリンクされます。これは、Red Hat Enterprise Linux の複数のバージョンとの互換性を確保するために必要になります。ただし、リンカーのスクリプトは、対応する共有オブジェクトファイルの名前を使用します。したがって、リンカーは、オブジェクトファイルを指定するオプションの前に、ライブラリーを追加するオプションを指定する際に、想定とは異なるシンボル処理ルールを使用して、オブジェクトファイルが必要とするシンボルを認識しません。

$ scl enable gcc-toolset-10 'ld -lsomelib objfile.o'

この方法で GCC Toolset のライブラリーを使用すると、リンカーのエラーメッセージで、シンボルの参照が未定義 になります。この問題を回避するには、標準のリンクプラクティスに従い、オブジェクトファイルを指定するオプションの後に、ライブラリーを追加するオプションを指定します。

$ scl enable gcc-toolset-10 'ld objfile.o -lsomelib'

また、この推奨事項は、Red Hat Enterprise Linux のベースバージョンの binutils を使用している場合にも適用されることに注意してください。