4.14. コンパイラーおよび開発ツール
更新された GCC コンパイラーが RHEL 9.1 で利用可能になりました
システム GCC コンパイラーバージョン 11.2.1 が更新され、アップストリームの GCC で利用可能なバグ修正および機能拡張が数多く追加されました。
GNU コンパイラーコレクション (GCC) には、C、C++、および Fortran のプログラミング言語でアプリケーションを開発するためのツールが含まれます。
使用方法は、RHEL 9 での C および C++ アプリケーションの開発 を参照してください。
新しい GCC Toolset 12
GCC Toolset 12 は最新バージョンの開発ツールを提供するコンパイラーツールセットです。このツールセットは、AppStream リポジトリーにおいて、Software Collection の形式で、Application Stream として利用できます。
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 で以下のコマンドを実行します。
dnf install gcc-toolset-12
# dnf install gcc-toolset-12
GCC Toolset 12 のツールを実行するには、以下のコマンドを実行します。
scl enable gcc-toolset-12 tool
$ scl enable gcc-toolset-12 tool
GCC Toolset バージョン 12 のツールバージョンが、このようなツールのシステムバージョンをオーバーライドするシェルセッションを実行するには、次のコマンドを実行します。
scl enable gcc-toolset-12 bash
$ scl enable gcc-toolset-12 bash
詳細は、GCC ツールセット 12 を参照してください。
(BZ#2077465)
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
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
# 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#2077438)
GCC Toolset 12: binutils がバージョン 2.38 にリベースされました
GCC Toolset 12 では、binutils パッケージがバージョン 2.38 に更新されました。
主なバグ修正と機能拡張は、以下のとおりです。
-
binutilsパッケージのすべてのツールで、マルチバイト文字の存在を表示または警告するオプションがサポートされるようになりました。 -
readelfおよびobjdumpツールは、デフォルトでdebuginfoファイルへのリンクを自動的にたどるようになりました。この動作は、readelfの--debug-dump=no-follow-linksオプションまたはobjdumpの--dwarf=no-follow-linksオプションを使用して無効にすることができます。
(BZ#2077445)
GCC 12 以降は _FORTIFY_SOURCE レベル 3 をサポートします
この機能拡張により、ユーザーは、GCC バージョン 12 以降でビルドする場合に、コンパイラーコマンドラインで -D_FORTIFY_SOURCE=3 を使用してアプリケーションをビルドできます。_FORTIFY_SOURCE レベル 3 では、ソースコード強化の範囲が改善されるため、コンパイラーコマンドラインで -D_FORTIFY_SOURCE=3 を指定してビルドされたアプリケーションのセキュリティーが向上します。これは、GCC バージョン 12 以降、および __builtin_dynamic_object_size ビルトインを使用する RHEL 9 のすべての Clang でサポートされています。
DNS スタブリゾルバーオプションが no-aaaa オプションをサポートするようになりました
今回の機能拡張により、glibc は /etc/resolv.conf の no-aaaa スタブリゾルバーオプションと RES_OPTIONS 環境変数を認識するようになりました。このオプションが有効な場合、AAAA クエリーはネットワーク経由で送信されません。システム管理者は、診断目的で AAAA DNS ルックアップを無効にすることができます。たとえば、IPv4 のみのネットワークでの余分なルックアップが DNS の問題に影響しないように除外できます。
IBM Z シリーズ z16 のサポートを追加
IBM z16 プラットフォームで s390 命令セットがサポートされるようになりました。IBM z16 は、glibc で HWCAP_S390_VXRS_PDE2 と HWCAP_S390_NNPA という 2 つの追加のハードウェア機能を提供します。その結果、アプリケーションはこれらの機能を使用して、最適化されたライブラリーと機能を提供できるようになりました。
(BZ#2077838)
アプリケーションは、新しい glibc インターフェイスを介して再起動可能なシーケンス機能を使用できます
sched_getcpu 関数 (特に aarch64 で) を高速化するには、glibc でデフォルトで再起動可能なシーケンス (rseq) カーネル機能を使用する必要があります。アプリケーションが共有 rseq 領域を継続的に使用できるようにするために、glibc は、glibc 2.35 アップストリームバージョンで最初に追加された __rseq_offset、__rseq_size、および __rseq_flags シンボルを提供するようになりました。この機能強化により、sched_getcpu 関数のパフォーマンスが向上し、アプリケーションは新しい glibc インターフェイスを介して再起動可能なシーケンス機能を使用できるようになりました。
GCC Toolset 12: GDB がバージョン 11.2 にリベースされました。
GCC Toolset 12 では、GDB パッケージがバージョン 11.2 に更新されました。
主なバグ修正と機能拡張は、以下のとおりです。
-
64 ビット ARM アーキテクチャーメモリータグ付け拡張 (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 ディレクトリーが含まれます。順序は次のとおりです。-
$XDG_CONFIG_HOME/gdb/gdbinit -
$HOME/.config/gdb/gdbinit -
$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#2077494)
GDB は Power 10 PLT 命令をサポートします
GDB は、Power 10 PLT 命令をサポートするようになりました。今回の更新により、ユーザーは共有ライブラリー関数にステップインし、GDB バージョン 10.2-10 以降を使用してスタックバックトレースを検査できるようになりました。
(BZ#1870017)
dyninst パッケージ化がバージョン 12.1 にリベースされました
dyninst パッケージがバージョン 12.1 にリベースされました。主なバグ修正と機能拡張は、以下のとおりです。
-
glibc-2.35の複数名前空間に対する初期サポート - DWARF 並列解析の並列処理性を修正
-
CUDAおよびCDNA2GPU バイナリーのサポートを改善 - IBM POWER Systems (リトルエンディアン) レジスターアクセスのサポートを改善
- PIE バイナリーのサポートを改善
- キャッチブロックの解析を修正
-
64 ビット Arm (
aarch64) 浮動小数点レジスターへのアクセスを修正
新しいファイルセット /etc/profile.d/debuginfod.*
組織の debuginfod サービスをアクティベートするための新しい fileset を追加しました。システム全体の debuginfod クライアントアクティベーションを取得するには、URL を /etc/debuginfod/FOO.urls ファイルに追加する必要があります。
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トレイトを派生できるようになりました。 -
Mutex、CondVar、およびRwLockは、pthreads ではなくカスタムfutexベースの実装を使用するようになり、Rust 言語保証によって新たな最適化が可能になりました。 -
Rust は、新しく安定化された
Terminationトレイトを実装するユーザー定義型を含む、mainからのカスタム終了コードをサポートするようになりました。 -
Cargo は、依存関係機能のより詳細な制御をサポートしています。
dep:プレフィックスは、それを機能として公開することなく、オプションの依存関係を参照できます。また、?は、package-name?/feature-nameのように、その依存関係が他の場所で有効になっている場合にのみ依存関係の機能を有効にします。 -
Cargo には、依存関係を
Cargo.tomlに追加するための新しいcargo addサブコマンドがあります。 詳細は、一連のアップストリームリリース発表を参照してください。
(BZ#2075337)
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++2bのif 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#2061041)
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#2075169)
新しいモジュールストリーム: maven:3.8。
RHEL 9.1 では、新しいモジュールストリームとして Maven 3.8 が導入されています。
maven:3.8 モジュールストリームをインストールするには、次を使用します。
dnf module install maven:3.8
# dnf module install maven:3.8
(BZ#2083112)
.NET バージョン 7.0 が利用可能
Red Hat Enterprise Linux 9.1 は、.NET バージョン 7.0 と共に配布されます。以下は、主な改善点です。
-
IBM Power のサポート (
ppc64le)
詳細は、.NET 7.0 RPM パッケージリリースノート および .NET 7.0 コンテナーリリースノート を参照してください。
(BZ#2112027)