4.11. コンパイラーおよび開発ツール

新しい GCC Toolset 12

GCC Toolset 12 は最新バージョンの開発ツールを提供するコンパイラーツールセットです。このツールセットは、AppStream リポジトリーにおいて、Software Collection の形式で、Application Streams として利用できます。

GCC コンパイラーがバージョン 12.1.1 に更新され、アップストリームの GCC で利用可能なバグ修正および機能拡張が数多く追加されました。

以下のツールおよびバージョンは、GCC Toolset 12 で利用できます。

ツールバージョン

GCC

12.1.1

GDB

11.2

binutils

2.35

dwz

0.14

annobin

10.76

GCC Toolset 12 をインストールするには、root で以下のコマンドを実行します。

# yum install gcc-toolset-12

GCC Toolset 12 のツールを実行するには、以下のコマンドを実行します。

$ scl enable gcc-toolset-12 tool

GCC Toolset バージョン 12 のツールバージョンが、このようなツールのシステムバージョンをオーバーライドするシェルセッションを実行するには、次のコマンドを実行します。

$ scl enable gcc-toolset-12 bash

詳細は、GCC ツールセット を参照してください。

(BZ#2077276)

GCC Toolset 12: Annobin がバージョン 10.76 にリベースされました。

GCC Toolset 12 では、Annobin パッケージがバージョン 10.76 に更新されました。

主なバグ修正と機能拡張は、以下のとおりです。

  • annocheck の新しいコマンドラインオプションは、別の方法でデバッグ情報を見つけることができない場合、debuginfod サービスの使用を避けるように指示します。debuginfod を使用すると annocheck で多くの情報が提供されますが、debuginfod サーバーが使用できない場合、annocheck のパフォーマンスが大幅に低下する可能性もあります。
  • Annobin ソースは、必要に応じて設定および作成するのではなく、meson および ninja を使用してビルドできるようになりました。
  • Annocheck は、Rust 1.18 コンパイラーによってビルドされたバイナリーをサポートするようになりました。

さらに、GCC Toolset 12 バージョンの Annobin で次の既知の問題が報告されています。

状況によっては、次のようなエラーメッセージでコンパイルが失敗する可能性があります。

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

(BZ#2077447)

GCC Toolset 12: binutils がバージョン 2.38 にリベースされました

GCC Toolset 12 では、elfutils パッケージがバージョン 2.38 に更新されました。

主なバグ修正と機能拡張は、以下のとおりです。

  • binutils パッケージのすべてのツールで、マルチバイト文字の存在を表示または警告するオプションがサポートされるようになりました。
  • readelf および objdump ツールは、デフォルトで debuginfo ファイルへのリンクを自動的にたどるようになりました。この動作は、readelf--debug-dump=no-follow-links オプションまたは objdump--dwarf=no-follow-links オプションを使用して無効にすることができます。

(BZ#2077448)

GCC 12 以降は _FORTIFY_SOURCE レベル 3 をサポートします

この機能拡張により、ユーザーは、GCC バージョン 12 以降でビルドする場合に、コンパイラーコマンドラインで -D_FORTIFY_SOURCE=3 を使用してアプリケーションをビルドできます。_FORTIFY_SOURCE レベル 3 では、ソースコード強化の範囲が改善されるため、コンパイラーコマンドラインで -D_FORTIFY_SOURCE=3 を指定してビルドされたアプリケーションのセキュリティーが向上します。これは、GCC バージョン 12 以降および Clang バージョン 9.0 以降でサポートされており、__builtin_dynamic_object_size ビルトインが含まれています。

(BZ#2033684)

DNS スタブリゾルバーオプションが no-aaaa オプションをサポートするようになりました

今回の機能拡張により、glibc/etc/resolv.confno-aaaa スタブリゾルバーオプションと RES_OPTIONS 環境変数を認識するようになりました。このオプションが有効な場合、AAAA クエリーはネットワーク経由で送信されません。システム管理者は、診断目的で AAAA DNS ルックアップを無効にすることができます。たとえば、IPv4 のみのネットワークでの余分なルックアップが DNS の問題に影響しないように除外できます。

(BZ#2096189)

glibc で IBM Z シリーズ z16 のサポートを追加

glibcIBM z16 プラットフォームで s390 命令セットがサポートされるようになりました。IBM z16 は、HWCAP_S390_VXRS_PDE2HWCAP_S390_NNPA という 2 つの追加のハードウェア機能を提供します。その結果、アプリケーションはこれらの機能を使用して、最適化されたライブラリーと機能を提供できるようになりました。

(BZ#2077835)

新しい make-latest パッケージ

今回の機能拡張により、make ユーティリティーの最新バージョンを含む make-latest パッケージが導入されました。以前は、GCC Toolset を通じて最新の make バージョンを提供していました。これで、make-latest パッケージを個別にインストールし、scl enable make43/bin/bash で最新バージョンを実行できます (make43 バージョンが最新の場合)。

(BZ#2083419)

GCC Toolset 12: GDB がバージョン 11.2 にリベースされました。

GCC Toolset 12 では、GDB パッケージがバージョン 11.2 に更新されました。

主なバグ修正と機能拡張は、以下のとおりです。

  • Aarch64 MTE の新しいサポート。memory-tag プレフィックスが付いた新しいコマンドを参照してください。
  • -break-insert および -dprintf-insert--qualified オプション。このオプションは、全スコープで検索するのではなく、ユーザーのイベントの場所と完全に一致するものを探します。

    たとえば、break --qualified foo は、グローバルスコープで foo という名前のシンボルを探します。--qualified を指定しないと、GDB はすべてのスコープでその名前のシンボルを検索します。

  • --force-condition: 現在無効になっていても、指定された条件が定義されます。
  • -break-condition --force: MI コマンドと同様。
  • -file-list-exec-source-files は、出力を制限するオプションの REGEXP を受け入れます。
  • .gdbinit 検索パスには config ディレクトリーが含まれます。順序は次のとおりです。

    1. $XDG_CONFIG_HOME/gdb/gdbinit
    2. $HOME/.config/gdb/gdbinit
    3. $HOME/.gdbinit
  • ~/.config/gdb/gdbearlyinit または ~/.gdbearlyinit のサポート。
  • -eix および -eiex 早期初期化ファイルオプション。

ターミナルユーザーインターフェイス (TUI):

  • ターミナルユーザーインターフェイス (TUI) ウィンドウ内でのマウス操作がサポートされます。
  • フォーカスされたウィンドウで機能しないキーの組み合わせが GDB に渡されるようになりました。

新しいコマンド:

  • show print memory-tag-violations
  • set print memory-tag-violations
  • memory-tag show-logical-tag
  • memory-tag with-logical-tag
  • memory-tag show-allocation-tag
  • memory-tag check
  • show startup-quietly および set startup-quietly: GDB スクリプトで -q または -quiet を指定する方法。早期初期化ファイルでのみ有効です。
  • show print type hex および set print type hex: ストラクチャーメンバーのサイズまたはオフセットを 10 進法ではなく 16 進法で出力するように GDB に指示します。
  • show python ignore-environment および set python ignore-environment: 有効にすると、GDB の Python インタープリターは、Python 実行可能ファイルに -E を渡すのと同じように、Python 環境変数を無視します。早期初期化ファイルでのみ有効です。
  • show python dont-write-bytecode および set python dont-write-bytecode: off の場合、これらのコマンドは、Python 実行可能ファイルに -B を渡すのと同様に、GDB の Python インタープリターがインポートされたモジュールのバイトコードコンパイル済みオブジェクトを書き込むことを抑制します。早期初期化ファイルでのみ有効です。

変更したコマンド:

  • break LOCATION if CONDITION: CONDITION が無効な場合、GDB はブレークポイントの設定を拒否します。-force-condition オプションはこれをオーバーライドします。
  • CONDITION -force N COND: 前のコマンドと同じ。
  • Inferior ID: ID が省略されている場合、このコマンドは現在の下位関連情報を出力します。それ以外の場合は、変更されません。
  • ptype[/FLAGS] TYPE | EXPRESSION: /x フラグを使用して、struct メンバーのサイズとオフセットを出力するときに 16 進法での表記を使用します。/d フラグを使用して同じことを行いますが、10 進法を使用します。
  • info sources: 出力が再構築されました。

Python API:

  • 下位オブジェクトには、読み取り専用の connection_num 属性が含まれています。
  • 新しい gdb.Frame.level() メソッド。
  • 新しい gdb.PendingFrame.level() メソッド。
  • gdb.Stop の代わりに gdb.BreakpoiontEvent が出力されます。

(BZ#2077492)

libpfm が AMD Zen 2 および Zen 3 プロセッサーをサポートするようになりました

この機能強化により、ユーザーは libpfm を使用して AMD Zen 2 および Zen 3 パフォーマンス監視ハードウェアにアクセスできるようになりました。

(BZ#2067218)

papi が AMD Zen 2 および Zen 3 プロセッサーをサポートするようになりました

この機能強化により、ユーザーは papi を使用して AMD Zen 2 および Zen 3 パフォーマンス監視ハードウェアにアクセスできるようになりました。

(BZ#2071558)

ARM プロセッサーのハードウェア識別の改善

この機能強化により、papi_avail ユーティリティーは、さまざまな ARM ベンダーのベンダー文字列とコード情報を正しく報告するようになりました。このユーティリティーを使用すると、PAPI_get_hardware_info() 関数を使用して、aarch64 アーキテクチャーで、ARM 以外のメーカーが製造したプロセッサーを識別できます。その結果、開発者は必要なアーキテクチャーに合わせてコードを調整できます。

(BZ#2037427)

富士通 A64FX イベントマッピングの更新

PAPI ライブラリーは、Fujitsu A64FX プロセッサー用に更新されました。ユーザーは、プログラムのパフォーマンスを分析するために使用できる papi_avail の出力で追加のプリセットを使用できるようになりました。

これらには、IDL イベントプリセットが含まれます。

PAPI_BRU_IDL
ブランチユニットのアイドル
PAPI_FXU_IDL
整数ユニットのアイドル
PAPI_FPU_IDL
浮動小数点ユニットのアイドル
PAPI_LSU_IDL
ロードストアユニットアイドル

(BZ#2037417)

dyninst パッケージ化がバージョン 12.1 にリベースされました

dyninst パッケージがバージョン 12.1 にリベースされました。主なバグ修正と機能拡張は、以下のとおりです。

  • glibc-2.35 の複数名前空間に対する初期サポート
  • DWARF 並列解析の並列処理性を修正
  • CUDA および CDNA2 GPU バイナリーのサポートを改善
  • IBM POWER Systems (リトルエンディアン) レジスターアクセスのサポートを改善
  • PIE バイナリーのサポートを改善
  • キャッチブロックの解析を修正
  • 64 ビット Arm (aarch64) 浮動小数点レジスターへのアクセスを修正

(BZ#2057676)

systemtap パッケージがバージョン 4.7 にリベース

systemtap パッケージがバージョン 4.7 にリベースされました。主なバグ修正と機能拡張は、以下のとおりです。

  • xMOK キーを使用してモジュールに手動で署名するための新しい --sign-module オプション。SecureBoot で使用します。
  • アノテーション付きソースコードのシステム全体のプロファイルを作成するための新しい stap-profile-annotate ツール。
  • 関数のエントリーとリターンをプローブするための新しい一般的な Python タップセット。
  • ユーザー空間にある可能性がある文字列のカーネル空間プローブの $ foo $ の拡張処理。
  • 非キャプチャグループの正規表現言語の拡張。
  • 最近追加されたいくつかのカーネルシステムコールのタップセットサポートの追加。

(BZ#2057565)

Rust Toolset がバージョン 1.62.1にリベースされました

Rust Toolset が、バージョン 1.62.1 に更新されました。主な変更点は、以下のとおりです。

  • 分割代入では、代入の左側にある既存の変数にパターンを代入できます。たとえば、タプル代入は変数にスワップできます: (a、b) = (b、a);
  • core::arch::asm マクロを使用して、インラインアセンブリーが 64 ビット x86 および 64 ビット ARM でサポートされるようになりました。詳細については、リファレンスのインラインアセンブリー の章 /usr/share/doc/rust/html/reference/inline-assembly.html (オンライン: https://doc.rust-lang.org/reference/inline-assembly.html) を参照してください。
  • 列挙は、明示的にアノテーションが付けられた #[default] バリアントを使用して Default トレイトを派生できるようになりました。
  • MutexCondVar、および RwLock は、pthreads ではなくカスタム futex ベースの実装を使用するようになり、Rust 言語保証によって新たな最適化が可能になりました。
  • Rust は、新しく安定化された Termination トレイトを実装するユーザー定義型を含む、main からのカスタム終了コードをサポートするようになりました。
  • Cargo は、依存関係機能のより詳細な制御をサポートしています。dep: プレフィックスは、それを機能として公開することなく、オプションの依存関係を参照できます。また、? は、package-name?/feature-name のように、その依存関係が他の場所で有効になっている場合にのみ依存関係の機能を有効にします。
  • Cargo には、依存関係を Cargo.toml に追加するための新しい cargo add サブコマンドがあります。
  • 詳細については、一連のアップストリームリリース発表を参照してください。

(BZ#2075344)

LLVM Toolset がバージョン 14.0.6 にリベース

LLVM Toolset はバージョン 14.0.6 にリベースされました。主な変更点は、以下のとおりです。

  • 64 ビット x86 では、AVX512-FP16 命令のサポートが追加されました。
  • Armv9-A、Armv9.1-A、および Armv9.2-A アーキテクチャーのサポートが追加されました。
  • PowerPC では、IBM double-double 形式を表す __ibm128 型が追加されました。これは __attribute__((mode (IF))) としても使用できます。

clang の変更:

  • C++2bif consteval が実装されました。
  • 64 ビット x86 では、AVX512-FP16 命令のサポートが追加されました。
  • 実験段階の OpenCL C 3.0 および OpenCL 2021 の C++ サポートが完了しました。
  • -E -P プリプロセッサーの出力は、必ず空白行を省略します。これは、GCC の動作に一致します。以前は、最大 8 つの連続する空白行が出力に表示される可能性がありました。
  • C89 だけでなく、C99 以降の標準で -Wdeclaration-after-statement をサポートします。これは、GCC の動作に一致します。注目すべきユースケースは、宣言とコードの混在を禁止するスタイルガイドのサポートですが、さらに新しい C 標準に移行したいと考えています。

詳細については、LLVM Toolset および Clang アップストリームのリリースノートを参照してください。

(BZ#2061042)

Go Toolset がバージョン 1.18.2 にリベース

Go Toolset はバージョン 1.18.2 にリベースされました。

主な変更点は、以下のとおりです。

  • 以前のバージョンの Go との下位互換性を維持しながら generics を導入。
  • 新しいファジングライブラリー。
  • 新しい debug/buildinfo および net/netip パッケージ。
  • go get ツールがパッケージをビルドまたはインストールしなくなりました。現在は、go.mod の依存関係のみを処理します。
  • メインモジュールの go.mod ファイルで go 1.17 以降が指定されている場合、追加の引数なしで go mod download コマンドを使用すると、メインモジュールの go.mod ファイルで明示的に必要なモジュールのソースコードのみがダウンロードされます。推移的な依存関係のソースコードもダウンロードするには、go mod download all コマンドを使用します。
  • go mod vendor サブコマンドが、出力ディレクトリーを設定する -o オプションをサポートするようになりました。
  • go mod tidy コマンドが、インポートされた各パッケージを提供しているビルドリスト内のモジュールが 1 つだけであることを確認するためにソースコードが必要なモジュールの追加のチェックサムを go.sum ファイルに保持するようになりました。この変更は、メインモジュールの go.mod ファイルの Go バージョンを条件に含まれません。

(BZ#2075162)

LLVM ゴールドプラグイン が IBM Z アーキテクチャーで利用可能になりました

この機能拡張により、ユーザーは IBM Z (s390x) アーキテクチャーで clang および ld.bfd を使用して LTO ビルドを作成できます。s390x アーキテクチャーは、ld.bfd および LTO とのリンクをサポートするようになりました。

(BZ#2088315)

新しいモジュールストリーム: maven:3.8

RHEL 8.7 では、新しいモジュールストリームとして Maven 3.8 が導入されています。

maven:3.8 モジュールストリームをインストールするには、次を使用します。

# yum module install maven:3.8

maven:3.6 ストリームからアップグレードする場合は、後続のストリームへの切り替え を参照してください。

(BZ#2083114, BZ#2064785, BZ#2088473)

.NET バージョン 7.0 が利用可能

Red Hat Enterprise Linux 8.7 には .NET バージョン 7.0 が同梱されています。以下は、主な改善点です。

  • IBM Power のサポート (ppc64le)

詳細は、.NET 7.0 RPM パッケージリリースノート および .NET 7.0 コンテナーリリースノート を参照してください。

(BZ#2112096)