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

RHEL 9 は、IBM POWER10 プロセッサーへの対応を提供します。

Linux カーネルからシステムツールチェーン (GCC、binutils、glibc) を介して、IBM の最新の POWER プロセッサーである POWER10 のサポートが含まれるように Red Hat Enterprise Linux 9 が更新されました。RHEL 9 は、POWER10 でワークロードに対応するため、今後のリリースで機能拡張が提供されています。

(BZ#2027596)

GCC 11.2.1 が利用できる。

RHEL 9 には、GCC バージョン 11.2.1 が同梱されています。主なバグ修正と機能拡張は、以下のとおりです。

一般的な改善

  • GCC は、DWARF バージョン 5 のデバッグフォーマットをデフォルトで使用するようになりました。
  • 診断で表示される列番号は、デフォルトでは実際の列番号を表し、複数列の文字を尊重します。
  • 直線コードベクターライザは、機能全体を考慮してベクターリングを行います。
  • 同じ変数を比較する一連の条件式は、それぞれに比較式が含まれていれば、switch ステートメントに変換することができます。
  • プロシージャー間の最適化の改善:

    • fipa-modref オプションで制御される新しい IPA-modref パスは、関数呼び出しの副作用を追跡し、ポイントツー分析の精度を向上させます。
    • fipa-icf オプションで制御される同一コードのフォールディングパスが大幅に改善され、統一された関数の数が増え、コンパイル時のメモリー使用量が削減されました。
  • リンクタイム最適化の改善:

    • Link-time optimization (LTO) を使用すると、コンパイラーは、リンク時に中間表現を使用して、プログラムのすべての変換ユニットでさまざまな最適化を実行できます。詳しくは Link time optimization をご覧ください。
    • リンク時のメモリー割り当てを改善し、ピークのメモリー使用量を削減しました。
  • IDE で新しい GCC_EXTRA_DIAGNOSTIC_OUTPUT 環境変数を使用すると、ビルドフラグを調整することなく、機械的に読める修正のヒントを要求することができます。
  • -fanalyzer オプションで実行されるスタティックアナライザーが大幅に改善され、多数のバグフィックスと機能強化が行われました。

言語固有の改善

C ファミリー

  • C および C++ コンパイラーは、OpenMP 5.0 仕様の OpenMP コンストラクトおよびアロケータルーチンにおいて、非矩形のループネストをサポートしています。
  • 属性:

    • 新しい no_stack_protector 属性は、スタック保護 (-fstack-protector) をかけてはいけない関数を示します。
    • 改良された malloc 属性は、アロケータとデアロケータの API ペアを識別するために使用することができます。
  • 新しい警告:

    • -Wsizeof-array-div(-Wall オプションで有効) は、2 つの sizeof 演算子の除算について、最初の演算子が配列に適用され、除算値が配列要素のサイズと一致しない場合に警告を発します。
    • -Wstringop-overread は、デフォルトで有効になっており、引数として渡された配列の最後を超えて読み取ろうとする文字列関数の呼び出しについて警告します。
  • 警告の強化:

    • -Wfree-nonheap-object は、動的メモリー割り当て関数から返されていないポインターを使用した割り当て解除関数の呼び出しのインスタンスをより多く検出します。
    • -Wmaybe-uninitialized は、初期化されていないメモリーへのポインターや参照が、const-qualified 引数を取る関数に渡すことを診断します。
    • -Wuninitialized は、初期化されていない動的に割り当てられたメモリーからの読み取りを検出します。

C

  • -std=c2x および -std=gnu2x オプションにより、ISO C 規格の次期 C2X 改訂版の新機能がサポートされています。以下に例を示します。

    • 標準属性がサポートされています。
    • __has_c_attribute プリプロセッサー演算子がサポートされています。
    • ラベルは、宣言の前や複合ステートメントの最後に表示されることがあります。

C++

  • デフォルトのモードは -std=gnu++17 に変更されます。
  • C++ライブラリーの libstdc++ では、C++17 のサポートが改善されました。
  • C++20 の新機能がいくつか実装されています。なお、C++20 のサポートは実験的なものです。

    各機能の詳細については、C++20 Language Features を参照してください。

  • C++フロントエンドは、今後予定されている C++23 ドラフト機能の一部を実験的にサポートしています。
  • 新しい警告:

    • -Wctad-maybe-unsupported はデフォルトでは無効で、控除ガイドのない型でクラステンプレート引数の控除を行うことについて警告します。
    • -Wrange-loop-construct は、-Wall で有効になり、範囲ベースの for ループが不必要でリソース効率の悪いコピーを作成している場合に警告を発します。
    • -Wmismatched-new-delete-Wall で有効になり、不一致な形式の new 演算子や他の不一致な割り当て関数から返されたポインターを持つ delete 演算子の呼び出しについて警告します。
    • -Wvexing-parse はデフォルトで有効になっており、最も厄介な構文解析ルールを警告します。つまり、宣言が変数定義のように見えても、C++言語では関数宣言として解釈される必要がある場合です。

アーキテクチャー固有の改善

64 ビット ARM アーキテクチャー

  • Armv8-R アーキテクチャーは、-march=armv8-r オプションでサポートされています。
  • GCC は、加算、減算、乗算、および複素数の累積と減算を行う演算を自動ベクトル化することができます。

AMD アーキテクチャーおよび Intel 64 ビットアーキテクチャー

  • Intel AVX-VNNI の新しい ISA 拡張サポートが追加されました。-mavxvnni コンパイラースイッチは、AVX-VNNI の組込みを制御します。
  • znver3 コアを搭載した AMD CPU は、新たな -march=znver3 オプションによりサポートされます。
  • x86-64 psABI サプリメントで定義されている 3 つのマイクロアーキテクチャーレベルは、新しい -march=x86-64-v2-march=x86-64-v3、および -march=x86-64-v4 オプションでサポートされています。

IBM Z アーキテクチャー

  • GCC 11.2.1 はデフォルトで IBM z14 プロセッサーに設定されます。

IBM Power Systems

  • GCC 11.2.1 はデフォルトで IBM POWER9 プロセッサーに設定されます。
  • GCC コンパイラーが、新しい -mcpu=power10 コマンドラインオプションを使用して POWER10 命令をサポートするようになりました。

(BZ#1986836, BZ#1870016, BZ#1870025, BZ#1870028, BZ#2019811, BZ#2047296)

glibc 最適化データをキャプチャーするための新しいコマンド

新しい ld.so --list-diagnostics コマンドは、IFUNC の選択や glibc-hwcaps の設定など、glibc の最適化の決定に影響を与えるデータを単一の機械可読ファイルにキャプチャーします。

(BZ#2023422)

binutils への主な変更点

RHEL 9 では、binutils に以下の変更が加えられています。

  • binutils は Intel の AMX/TMUL 命令セットに対応するようになり、この新機能を活用できるアプリケーションのパフォーマンスが向上しました。
  • アセンブラー、リンカー、およびその他のバイナリーユーティリティーが、POWER10 命令をサポートするようになりました。

(BZ#2030554, BZ#1870021)

sched_getcpu の実装では、オプションで rseq (再起動可能なシーケンス) を使用して、64 ビット ARM アーキテクチャーおよびその他のアーキテクチャーでのパフォーマンスを向上できるようになりました。

64 ビット ARM アーキテクチャーでの sched_getcpu の以前の実装では、getcpu システムコールを使用しますが、これはほとんどの並列アルゴリズムで効率的に使用するには遅すぎます。他のアーキテクチャーでは、vDSO (仮想動的共有オブジェクト) アクセラレーションを使用してこれを回避します。rseq を使用して sched_getcpu を実装すると、64 ビット ARM アーキテクチャーのパフォーマンスが大幅に改善されます。他のアーキテクチャーではわずかな改善が見られます。

sched_getcpurseq を使用するように設定するには、GLIBC_TUNABLES=glibc.pthread.rseq=1 環境変数を設定します。

# GLIBC_TUNABLES=glibc.pthread.rseq=1
# export GLIBC_TUNABLES

(BZ#2024347)

パフォーマンスツールとデバッガーの更新

RHEL 9.0 では、以下のパフォーマンスツールおよびデバッガーが利用できます。

  • GDB 10.2
  • Valgrind 3.18.1
  • SystemTap 4.6
  • Dyninst 11.0.0
  • elfutils 0.186

(BZ#2019806)

IBM POWER10 の GDB で DAWR 機能が改善

RHEL 9 には、改善された DAWR 機能を提供する GDB 10.2 が同梱されています。IBM POWER10 プロセッサーでは、新しいハードウェアウォッチポイント機能が GDB で有効になりました。たとえば、DAWR/DAWRX レジスターの新しいセットが追加されました。

(BZ#1870029)

GDB が、IBM POWER10 で接頭辞が付けられた新しい命令に対応

GDB 10.2 は、POWER10 で Power ISA 3.1 の接頭辞が付いた命令に完全に対応しています。これには、8 バイトの接頭辞が付いた命令が含まれます。RHEL 8.4 では、GDB は 4 バイトの命令のみに対応していました。

(BZ#1870031)

RHEL 9 は ブースト 1.75.0 を提供します

RHEL 9 には、boost パッケージのバージョン 1.75.0 が同梱されています。バージョン 1.67.0 への主なバグ修正および機能強化は、以下のとおりです。

  • Boost.Signals ライブラリーが削除され、header-only Boost.Signals2 コンポーネントに置き換えられました。
  • boost-jam パッケージの bjam ツールは、boost-b2 パッケージの b2 に置き換えられました。
  • 新しいライブラリー:

    • Boost.Contracts
    • Boost.HOF
    • Boost.YAP
    • boost.Safe Numerics
    • Boost.Outcome
    • Boost.Histogram
    • Boost.Variant2
    • Boost.Nowide
    • Boost.StaticString
    • Boost.STL_Interfaces
    • boost.JSON
    • Boost.LEAF
    • Boost.PFR

(BZ#1957950)

RHEL 9 は LLVM Toolset 13.0.1 を提供します。

RHEL 9 には、LLVM Toolset バージョン 13.0.1 が同梱されています。バージョン 12.0.1 への主なバグ修正および機能強化は、以下のとおりです。

  • Clang は、C++ のステートメント属性 [[clang::musttail]] および C の __attribute__((musttail)) をサポートするようになりました。
  • Clang は、-Wreserved-identifier 警告をサポートするようになりました。これは、コードで予約済み識別子を使用するときに開発者に警告します。
  • Clang の -Wshadow フラグは、シャドウされた構造化バインディングもチェックするようになりました。
  • Clang の -Wextra は、-Wnull-pointer-subtraction も意味するようになりました。
  • Clang は、C++ のステートメント属性 [[clang::musttail]] および C の __attribute__((musttail)) をサポートするようになりました。

RHEL 9 では、llvm-toolset を RPM パッケージとして簡単にインストールできます。

(BZ#2001107)

CMake 3.20.2 における主な変更点

RHEL 9 には CMake 3.20.2 が同梱されています。バージョン 3.20.2 以前を必要とするプロジェクトで CMake を使用するには、cmake_minimum_required(バージョン 3.20.2) コマンドを使用します。

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

  • C++23 コンパイラーモードは、ターゲットプロパティー CXX_STANDARDCUDA_STANDARDOBJCXX_STANDARD、またはコンパイル機能の cxx_std_23 メタ機能を使用して指定できるようになりました。
  • CUDA 言語サポートにより、NVIDIA CUDA コンパイラーをシンボリックリンクにすることができるようになりました。
  • Intel oneAPI NextGen LLVM コンパイラー ID が、IntelLLVM コンパイラー ID で対応されるようになりました。
  • Cmake は、Android NDK のツールチェーンファイルとマージすることで、Android のクロスコンパイルを容易にします。
  • cmake(1) を実行してプロジェクトビルドシステムを生成すると、ハイフンで始まる不明なコマンドライン引数が拒否されるようになりました。

新機能および非推奨になった機能の詳細は、CMake Release Notes を参照してください。

(BZ#1957948)

RHEL 9 では Go 1.17.7 が提供されます。

RHEL 9 には、Go Toolset バージョン 1.17.7 が同梱されています。バージョン 1.16.7 への主なバグ修正および機能強化は、以下のとおりです。

  • スライスを配列ポインターに変換するオプションを追加しました。
  • //go:build 行のサポートを追加しました。
  • amd64 での関数呼び出しのパフォーマンスを改善しました。
  • 関数引数を、スタックトレースでより明確にフォーマットしました。
  • クロージャーを含む関数をインライン化できるようにしました。
  • x509 証明書の解析におけるリソース消費を削減しました。

RHEL 9 では、go-toolset を RPM パッケージとして簡単にインストールできます。

(BZ#2014087)

Go FIPS モードは OpenSSL 3 でサポートされています。

Go FIPS モードの場合に OpenSSL 3 ライブラリーを使用できるようになりました。

(BZ#1984110)

RHEL 9 は Rust Toolset 1.58.1 を提供

RHEL 9 には、Rust Toolset バージョン 1.58.1 が同梱されています。バージョン 1.54.0 への主なバグ修正および機能強化は、以下のとおりです。

  • Rust コンパイラーは、クロージャーの disjoint キャプチャー、配列の IntoIterator、新しい Cargo 機能リゾルバーなどを備えた 2021 年版の言語をサポートするようになりました。
  • 新しいカスタムプロファイルの Cargo サポートが追加されました。
  • Cargo はコンパイラーエラーを重複排除します。
  • 新しいオープンレンジパターンが追加されました。
  • フォーマット文字列にキャプチャーされた識別子を追加しました。

詳細は、Rust 1.55 Rust 1.56 Rust 1.57 Rust 1.58 を参照してください。

RHEL 9 では、RPM パッケージとして rust-toolset を簡単にインストールできます。

(BZ#2002885)

RHEL 9 は、pcp パッケージのバージョン 5.3.5 を提供します。

RHEL 9 には、Performance Co-Pilot (pcp) パッケージバージョン 5.3.5 が同梱されています。バージョン 5.3.1 以降、新しい pcp-pmda-bpf サブパッケージが追加され、BPF CO-RE (libbpf および BTF) を利用する eBPF プログラムからのパフォーマンスデータを提供します。

(BZ#1991764)

PCP の SQL Server メトリックにアクセスするための Active Directory 認証

今回の更新で、システム管理者は、Active Directory AD) 認証を使用して SQL Server メトリックに安全に接続するように pmdamssql(1) を設定できるようになりました。

(BZ#1847808)

新しい pcp-ss PCP ユーティリティーが利用可能に

pcp-ss PCP ユーティリティーは、pmdasockets(1) PMDA が収集したソケット統計を報告します。このコマンドは、多くの ss コマンドラインオプションとレポート形式と互換性があります。また、ライブモードのローカルまたはリモート監視と、以前に記録された PCP アーカイブからの過去の再生の利点も提供します。

(BZ#1981223)

RHEL 9 は grafana 7.5.11 を提供します。

RHEL 9 には、grafana パッケージバージョン 7.5.11 が同梱されています。バージョン 7.5.9 への主な変更点は、以下のとおりです。

  • 新しいデータフレーム形式をサポートしないパネルの下位互換性のために、新しい prepare time series 変換が追加されました。
  • パスワードリセットトークンを生成するために、SHA-1 の代わりに HMAC-SHA-256 を使用するようにパスワードリカバリー機能を更新。

(BZ#1993215)

RHEL 9 は grafana-pcp 3.2.0 を提供します。

RHEL 9 には、grafana-pcp パッケージバージョン 3.2.0 が同梱されています。バージョン 3.1.0 への主なバグ修正および機能強化は、以下のとおりです。

  • PCP Redis 用の新しい MS SQL サーバーダッシュボードに追加
  • PCP Vector eBPF/BCC 概要ダッシュボードに空のヒストグラムバケットの可視性を追加しました。
  • PCP Redis の metric() 関数がすべてのメトリック名を返さないバグを修正しました。

(BZ#1993156)

grafana-pcp の Vector データソース用に中央 pmproxy 経由でリモートホストにアクセスする

一部の環境では、ネットワークポリシーでは、Dashboard ビューアーのブラウザーから監視するホストに直接接続が許可されません。今回の更新で、中央 pmproxy に接続するために hostspec をカスタマイズできるようになりました。これにより、個々のホストにリクエストを転送できるようになりました。

(BZ#1845592)

新規パッケージ: ansible-pcp

ansible-pcp パッケージには、PCP (Performance Co-Pilot) および metrics RHEL システムロールの実装に使用される Redis や Grafana などの関連ソフトウェアロールが含まれます。

(BZ#1957566)

RHEL 9 は python-jsonpointer 2.0 を提供します。

RHEL 9 には、python-jsonpointer パッケージバージョン 2.0 が同梱されています。

バージョン 1.9 への主な変更点は、以下のとおりです。

  • Python バージョン 2.6 および 3.3 は非推奨になりました。
  • python-jsonpointer モジュールは、無効なエスケープシーケンスのポインターを自動的に確認するようになりました。
  • コマンドラインでポインターを引数として記述できるようになりました。
  • URL エンコード形式でポインターを送信することはできなくなりました。

(BZ#1980256)

.NET 6.0 が利用可能です。

RHEL 9 には .NET バージョン 6.0 が同梱されています。以下は、主な改善点です。

  • 64 ビット Arm (aarch64) に対応
  • IBM Z および LinuxONE (s390x) に対応

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

.NET 6.0 は、この Application Stream の初期バージョンであり、RPM パッケージとして簡単にインストールできます。.NET 6.0 では、RHEL 9 よりもライフサイクルが短くなります。詳細は、Red Hat Enterprise Linux Application Streams ライフサイクル を参照してください。

(BZ#1986211)

RHEL 9 の Java 実装

RHEL 9 AppStream リポジトリーには、以下が含まれます。

  • java-17-openjdk パッケージ。OpenJDK 17 Java Runtime Environment および OpenJDK 17 Java Software Development Kit を提供します。
  • java-11-openjdk パッケージ。OpenJDK 11 Java Runtime Environment および OpenJDK 11 Java Software Development Kit を提供します。
  • java-1.8.0-openjdk パッケージ。OpenJDK 8 Java Runtime Environment および OpenJDK 8 Java Software Development Kit を提供します。

詳細は、OpenJDK のドキュメント を参照してください。

(BZ#2021262)

RHEL 9 の Java ツール

RHEL 9 AppStream リポジトリーには、以下の Java ツールが同梱されています。

  • ソフトウェアプロジェクトマネジメントおよび理解ツールである Maven 3.6.3
  • Java アプリケーションのコンパイル、アセンブル、テスト、および実行を行う Java ライブラリーおよびコマンドラインツールである Ant 1.10.9

Maven3.6Ant1.10 は、これらのアプリケーションストリームの初期バージョンであり、非モジュラー RPM パッケージとして簡単にインストールできます。

(BZ#1951482)

CRB リポジトリーで利用可能な SWIG 4.0

Simplified Wrapper and Interface Generator (SWIG) バージョン 4.0 は、CodeReady Linux Builder (CRB) リポジトリーで利用できます。本リリースでは、PHP 8 のサポートが追加されました。

RHEL 9 では、SWIG を RPM パッケージとして簡単にインストールできます。

CodeReady Linux Builder リポジトリーに含まれるパッケージには対応しないことに注意してください。

(BZ#1943580)