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
GCC Toolset 12 のツールを実行するには、以下のコマンドを実行します。
$ scl enable gcc-toolset-12 tool
GCC Toolset バージョン 12 のツールバージョンが、このようなツールのシステムバージョンをオーバーライドするシェルセッションを実行するには、次のコマンドを実行します。
$ 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
この問題を回避するには、プラグインディレクトリーに 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
およびCDNA2
GPU バイナリーのサポートを改善 - 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
(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)