第16章 コンパイラーおよび開発ツール

16.1. RHEL 7 以降の toolchain の変更点

以下のシナリオで、Red Hat Enterprise Linux 7 で説明されているコンポーネントのリリース以降のツールチェインにおける変更を記載します。『Red Hat Enterprise Linux 8.0 リリースノート』も併せて参照してください。

16.1.1. RHEL 8 の GCC における変更点

Red Hat Enterprise Linux 8 では、GCC ツールチェーンは、GCC 8.2 リリースシリーズに基づいています。以下は、Red Hat Enterprise Linux 7 からの主な変更点です。

  • エイリアス解析、ベクトル化機能の改善、同一コードの折りたたみ、プロシージャー間解析、ストアマージの最適化パスなど、一般的な最適化が多数追加されました。
  • Address Sanitizer が改善されました。
  • メモリリークを検出するために、Leak Sanitizer が追加されました。
  • 未定義の挙動を検出するために、Undefined Behavior Sanitizer が追加されました。
  • デバッグ情報が DWARF5 形式で生成できるようになりました。この機能は実験的なものです。
  • ソースコードカバレッジ解析ツール GCOV が、さまざまな改良とともに拡張されました。
  • OpenMP 4.5 仕様のサポートが追加されました。また、OpenMP 4.0 仕様のオフロード機能は、C、C++、および Fortran コンパイラーによりサポートされます。
  • 特定の、起こりうるプログラムエラーを静的に検出するために、新しい警告と改善された診断が追加されました。
  • ソースの場所は、その場所よりも広い範囲を追跡するため、診断する内容が広くなりました。コンパイラーは、「fix-it」ヒントを提供し、可能なコードの修正を提案します。代替名とタイポの検出を簡単にするためにスペルチェックが追加されました。

セキュリティー

GCC が、生成したコードをさらに強化するツールを提供するように拡張されました。セキュリティーに関する改善点には以下が含まれます。

  • オーバーフローチェックを含む算術計算のための組み込み関数 __builtin_add_overflow__builtin_sub_overflow、および __builtin_mul_overflow が追加されました。
  • スタッククラッシュに対して追加のコード保護を生成するために、-fstack-clash-protection オプションが追加されました。
  • 増加したプログラムセキュリティーの制御フロー命令のターゲットアドレスを確認するために、-fcf-protection オプションが導入されました。
  • 新しい -Wstringop-truncation 警告オプションは、コピーした文字列を切り捨てるか、目的が変更しない strncatstrncpystpncpy などのバインドされた文字列操作関数への呼び出しを一覧表示します。
  • -Warray-bounds 警告オプションが改善され、範囲外の配列のインデックスおよびポインターのオフセットの検出が改善されるようになりました。
  • memcpyrealloc などの生のメモリーアクセス機能により、重要なクラスタイプのオブジェクトで潜在的に危険な操作を警告するために、-Wclass-memaccess 警告オプションが追加されました。

アーキテクチャーおよびプロセッサーのサポート

アーキテクチャーおよびプロセッサーサポートの改善点は次のとおりです。

  • Intel AVX-512 アーキテクチャー、その多数のマイクロアーキテクチャー、および Intel Software Guard Extensions (SGX) にアーキテクチャー固有の新しいオプションが複数追加されました。
  • コード生成は、現在、64 ビットの ARM アーキテクチャー LSE 拡張、ARMv8.2-A 16 ビット浮動小数点拡張 (FPE)、およびアーキテクチャーのバージョン ARMv8.2-A、ARMv8.3-A、および ARMv8.4-A を対象にできるようになりました。
  • ARM および 64 ビット ARM アーキテクチャーで -march=native オプションの処理が修正されました。
  • IBM Z アーキテクチャーのプロセッサー z13 および z14 に対応するようになりました。

言語および標準

以下は、言語と標準規格に関連した主な変更点です。

  • C 言語でコンパイルする際に使用されるデフォルトの標準規格が、GNU 拡張機能が含まれる C17 に変更になりました。
  • C++ 言語でコードをコンパイルする際に使用されるデフォルトの標準規格が、GNU 拡張機能が含まれる C++14 に変更になりました。
  • C++ ランタイムライブラリーが、C++11 および C++14 の標準規格をサポートするようになりました。
  • C++ コンパイラーは、新しい機能を多数持つ C++14 標準仕様を実装するようになりました。たとえば、変数テンプレート、非静的データメンバーイニシャライザーを持つ統合、拡張した constexpr 指定子、標準サイズの割り当て解除関数、汎用ラムダ、可変長の配列、桁区切り記号などになります。
  • C 言語の標準 C11 のサポートが改善しました。ISO C11 アトミック、一般的な選択、およびスレッドローカルストレージが利用可能になりました。
  • 新しい __auto_type GNU C 拡張機能が、C 言語の C++11 の auto キーワード機能のサブセットを提供します。
  • ISO/IEC TS 18661-3:2015 標準規格が指定する型名 _FloatN および _FloatNx が、C フロントエンドで認識されるようになりました。
  • C 言語のコードをコンパイルする際に使用するデフォルトの標準は、GNU 拡張を持つ C17 に変更しました。これは、--std=gnu17 オプションを使用するのと同じ効果があります。以前は、デフォルトは、GNU 拡張を持つ C89 です。
  • GCC は、C++17 言語標準規格と、C++20 標準規格の一部の機能を使用してコンパイルできるようになりました。
  • 空のクラスを引数として渡すと、プラットフォーム ABI で要求される、Intel 64 アーキテクチャーおよび AMD64 アーキテクチャーで領域を使用せず、コピーまたは移動のコンストラクターだけを持つクラスを渡すか返すと、重要なコピーまたは移動のコンストラクターを持つクラスと同じ規則を使用します。
  • C++11 alignof 演算子により返される値は、C _Alignof 演算子と一致し、最小の配置を返すように修正されました。適切な配置を見つけるには、GNU 拡張機能 __alignof__ を使用します。
  • Fortran 言語コード用の libgfortran ライブラリーのメインバージョンが 5 に変更になりました。
  • Ada (GNAT)、GCC Go、および Objective C/C++ 言語のサポートが削除されました。Go コード開発には Go Toolset を使用してください。

関連資料

16.1.2. RHEL 8 の GCC へのセキュリティー強化

本セクションは、Red Hat Enterprise Linux 7.0 のリリース以降に追加されたセキュリティーに関連する GCC の変更に関する詳細を説明します。

新しい警告

以下のような警告オプションが追加されました。

オプション警告の表示理由

-Wstringop-truncation

コピーした文字列を切り捨てるか、目的が変更しない、strncatstrncpystpncpy などのバインドした文字列操作を読み出します。

-Wclass-memaccess

memcpyrealloc のような、生のメモリー機能により、潜在的に危険な方法で操作される重要なクラスタイプのオブジェクトです。

警告は、ユーザー定義のコンストラクターやコピー代入演算子、破損した仮想テーブルポインター、const 修飾型または参照、またはメンバーポインターのデータメンバーを回避する呼び出しを検出します。この警告は、データメンバーへのアクセス制御を回避する呼び出しも検出します。

-Wmisleading-indentation

コードのインデントが、人にコードのブロック構造の誤解を招くようなアイディアを提供します。

-Walloc-size-larger-than=size

割り当てるメモリーの量が size を超えた場合にメモリー割り当て関数を呼び出します。2 つのパラメーターを乗じることで割り当てが指定される関数とともに、そして、alloc_size 属性が付けられた関数とも連携します。

-Walloc-zero

メモリー量を割り当てないようにするメモリー割り当て関数を呼び出します。2 つのパラメーターを乗じることで割り当てが指定される関数とともに、そして、alloc_size 属性が付けられた関数とも連携します。

-Walloca

alloca 関数へのすべての読み出し。

-Walloca-larger-than=size

size 委譲のメモリーが必要になると、alloca 関数が呼び出されます。

-Wvla-larger-than=size

指定のサイズを超えたか、そのバウンドが十分に拘束されるか不明な可変長配列 (VLA) の定義。

-Wformat-overflow=level

フォーマットされた出力関数の sprintf ファミリーへの呼び出しで、特定の好ましいバッファーオーバーフロー。level 値の詳細および説明は、man ページの gcc(1) を参照してください。

-Wformat-truncation=level

フォーマットされた出力関数の snprintf ファミリーへの呼び出しで、特定の好ましい出力の切り替え。level 値の詳細および説明は、man ページの gcc(1) を参照してください。

-Wstringop-overflow=type

memcpystrcpy などの文字列処理関数への呼び出しのバッファーオーバーフロー。level 値の詳細と説明は、man ページの gcc(1) を参照してください。

警告の改良

このような GCC の警告が修正されました。

  • -Warray-bounds オプションが改善され、範囲外の配列インデックスおよびポインターオフセットの複数インスタンスを検出するようになりました。たとえば、フレキシブル配列メンバーと文字列リテラルに負または過剰なポインターが検出されます。
  • GCC 7 で導入された -Wrestrict オプションは、標準メモリーと、memcpystrcpy などの文字列操作関数への制限引数を介してオブジェクトへのアクセスをオーバーラップする、より多くのインスタンスを検出するように強化されました。
  • -Wnonnull オプションは、null 以外の引数 (nonnull 属性が付いている) を期待する関数に null ポインターを渡す広範囲なケースセットを検出するように強化されました。

新しい UndefinedBehaviorSanitizer

UndefinedBehaviorSanitizer と呼ばれる未定義の動作を検出するための新しいランタイムサニタイザーが追加されました。主な機能は以下のようになります。

オプションチェック

-fsanitize=float-divide-by-zero

ゼロによる浮動小数点除算を検出します。

-fsanitize=float-cast-overflow

浮動小数点型から整数の変換がオーバーフローしていないことを確認してください。

-fsanitize=bounds

配列境界の計測を有効にして、範囲外のアクセスを検出します。

-fsanitize=alignment

アラインメントチェックを有効にし、アラインが適切でないさまざまなオブジェクトを検出します。

-fsanitize=object-size

オブジェクトサイズのチェックを有効にして、様々な範囲外のアクセスを検出します。

-fsanitize=vptr

C++ メンバー関数呼び出し、メンバーアクセス、および基本クラスおよび派生クラスへのポインター間の会話のチェックを有効にします。また、参照されるオブジェクトに正しい動的タイプがない場合は検出します。

-fsanitize=bounds-strict

配列境界の厳密なチェックを有効にします。これにより、柔軟なメンバー状の配列の計測と -fsanitize=bounds を有効にします。

-fsanitize=signed-integer-overflow

汎用ベクトルを持つ算術演算でも、算術オーバーフローが診断されます。

-fsanitize=builtin

事前定義されたビルトインの __builtin_clz または __builtin_ctz への無効な引数をランタイム時に診断します。-fsanitize=undefined からのチェックを含みます。

-fsanitize=pointer-overflow

ポインターのラッピングに簡易ランタイムテストを実行します。-fsanitize=undefined からのチェックが含まれます。

AddressSanitizer の新規オプション

以下のオプションが AddressSanitizer に追加されました。

オプションチェック

-fsanitize=pointer-compare

異なるメモリオブジェクトを指定するポインターの比較を警告します。

-fsanitize=pointer-subtract

異なるメモリーオブジェクトを指すポインターの減算を警告します。

-fsanitize-address-use-after-scope

その変数が定義されている範囲後に取得されていて使用されているアドレスの変数をサニタイズします。

その他のサニタイザーおよび計測

  • プローブを挿入するために、-fstack-clash-protection オプションが追加されました。スタック領域が静的または動的に割り当てられた場合に、スタックオーバーフローを確実に検出され、オペレーティングシステムが提供するスタックガードページを超えることに依存する攻撃ベクトルを軽減します。
  • 制御フロー転送のターゲットアドレス命令 (間接的な関数呼び出し、関数の戻り値、間接ジャンプなど) のターゲットアドレスが有効であることを確認することで、コード計測を実行して、プログラムセキュリティーを高める新しいオプション -fcf-protection=[full|branch|return|none] が追加されました。
  • Pointer Bounds Checker と呼ばれるバインド違反検出器は、-fcheck-pointer-bounds オプションで有効にできます。メモリーアクセスは、ポインターの境界違反 (オーバーフロー) に検出するために、境界に対して使用されるポインターのランタイムチェックで命令されます。この機能は、新しい ISA 拡張 Intel MPX サポートで、64 ビットの Intel および AMD のアーキテクチャーのターゲットで利用できます。

関連資料

  • 上述のオプションの一部に提供された値の詳細および説明は、man ページの gcc(1) を参照してください。

    $ man gcc

16.2. コンパイラーツールセット

RHEL 8.0 は、以下のコンパイラーツールセットを Application Streams として提供します。

  • LLVM コンパイラーインフラストラクチャーフレームワークを提供する Clang および LLVM Toolset 7.0.1 は、LLVM コンパイラーインフラストラクチャーフレームワーク、C 言語および C++ 言語用の Clang コンパイラー、LLDB デバッガー、コード解析の関連ツールを提供します。「Using Clang and LLVM Toolset」を参照してください。
  • Rust Toolset 1.31 は、Rust プログラミング言語コンパイラー rustccargo ビルドツールおよび依存マネージャー、cargo-vendor プラグイン、および必要なライブラリーを提供します。「Using Rust Toolset」 ドキュメントを参照してください。
  • Go Toolset 1.11.5。Go プログラミング言語ツールおよびライブラリーを提供します。Go は、golang としても知られています。「Using Go Toolset」を参照してください。

16.3. RHEL 8 における Java 実装および Java ツール

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

  • 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 を提供します。
  • icedtea-web パッケージ (Java Web Start の実装を提供)
  • Java ライブラリーおよびコマンドラインツールを提供する ant モジュール。Java アプリケーションのコンパイル、アセンブル、テスト、および実行を行います。Ant はバージョン 1.10 に更新されました。
  • ソフトウェアプロジェクト管理および包括ツールを提供する maven モジュール。Maven は、Software Collection として、または未サポートの Optional チャンネルでのみ利用できました。
  • scala モジュールは、汎用 Java プラットフォームのプログラミング言語を提供します。Scala は、以前は Software Collection としてのみ利用できました。

また、java-1.8.0-ibm パッケージは、Supplementary リポジトリーを介して配布されます。Red Hat では、このリポジトリーのパッケージはサポートされていません。

16.4. GDB で互換性に影響を与える変更

Red Hat Enterprise Linux 8 で提供される GDB のバージョンは、特に GDB の出力が端末から直接読み込まれる場合に、互換性に影響を与える変更が多数含まれています。次のセクションは、この変更の詳細を提供します。

GDB の出力の解析は推奨されません。Python GDB API または GDB Machine Interface (MI) を使用するスクリプトが推奨されます。

16.4.1. GDBserver がシェルで inferior を開始

inferior コマンドライン引数で拡張や変数置換を有効にするために、GDBserver では、GDB と同じように、シェルで inferior を開始するようになりました。

シェルを使用して無効にするには、以下を行います。

  • GDB コマンド target extended-remote を使用すると、set startup-with-shell off コマンドでシェルを無効にします。
  • target remote GDB コマンドを使用する場合は、GDBserver の --no-startup-with-shell オプションでシェルを無効にします。

例16.1 リモートの GDB inferior へのシェル拡張例

この例は、GDBserver から /bin/echo /* コマンドを実行する方法が Red Hat Enterprise Linux versions 7 および 8 でどう異なるかを示します。

  • RHEL 7 の場合:

    $ gdbserver --multi :1234
    $ gdb -batch -ex 'target extended-remote :1234' -ex 'set remote exec-file /bin/echo' -ex 'file /bin/echo' -ex 'run /*'
    /*
  • RHEL 8 の場合:

    $ gdbserver --multi :1234
    $ gdb -batch -ex 'target extended-remote :1234' -ex 'set remote exec-file /bin/echo' -ex 'file /bin/echo' -ex 'run /*'
    /bin /boot (...) /tmp /usr /var

16.4.2. gcj サポートが削除される

Java 用 (gcj) の GNU Compiler でコンパイルされた Java プログラムをデバッグするサポートが削除されました。

16.4.3. シンボルのダンプのメンテナンスコマンドの新しい構文

シンボルのダンプのメンテナンスコマンドの構文では、ファイル名の前にオプションが含まれるようになり、RHEL 7 の GDB で機能するコマンドが、RHEL 8 では機能しなくなりました。

例として、次のコマンドはファイルにシンボルを格納しませんが、エラーメッセージを生成します。

(gdb) maintenance print symbols /tmp/out main.c

シンボルのダンプのメンテナンスコマンドの新しい構文は、以下のようになります。

maint print symbols [-pc address] [--] [filename]
maint print symbols [-objfile objfile] [-source source] [--] [filename]
maint print psymbols [-objfile objfile] [-pc address] [--] [filename]
maint print psymbols [-objfile objfile] [-source source] [--] [filename]
maint print msymbols [-objfile objfile] [--] [filename]

16.4.4. スレッド番号がグローバルではなくなる

GDB は、グローバルのスレッド番号設定のみを使用していました。番号設定は、inferior_num.thread_num の形式 (2.1 など) で、inferior ごとに表示されるように拡張されました。そのため、利便性に関する変数 $_thread と、Python 属性 InferiorThread.num のスレッド番号が、inferior の間で固有ではならなくなりました。

GDB は、スレッドごとに、グローバルスレッド ID と呼ばれる 2 番目のスレッド ID を格納します。これは、以前のリリースのスレッド番号と同等の、新規のものになります。グローバルスレッド番号にアクセスするには、利便性に関する変数 $_gthread および Python 属性 InferiorThread.global_num を使用します。

後方互換性の場合は、Machine Interface (MI) スレッド ID に常にグローバル ID が含まれます。

例16.2 GDB スレッド番号変更の例

Red Hat Enterprise Linux 7 の場合:

# debuginfo-install coreutils
$ gdb -batch -ex 'file echo' -ex start -ex 'add-inferior' -ex 'inferior 2' -ex 'file echo' -ex start -ex 'info threads' -ex 'pring $_thread' -ex 'inferior 1' -ex 'pring $_thread'
(...)
  Id   Target Id         Frame
* 2    process 203923 "echo" main (argc=1, argv=0x7fffffffdb88) at src/echo.c:109
  1    process 203914 "echo" main (argc=1, argv=0x7fffffffdb88) at src/echo.c:109
$1 = 2
(...)
$2 = 1

Red Hat Enterprise Linux 8 の場合:

# dnf debuginfo-install coreutils
$ gdb -batch -ex 'file echo' -ex start -ex 'add-inferior' -ex 'inferior 2' -ex 'file echo' -ex start -ex 'info threads' -ex 'pring $_thread' -ex 'inferior 1' -ex 'pring $_thread'
(...)
  Id   Target Id         Frame
  1.1  process 4106488 "echo" main (argc=1, argv=0x7fffffffce58) at ../src/echo.c:109
* 2.1  process 4106494 "echo" main (argc=1, argv=0x7fffffffce58) at ../src/echo.c:109
$1 = 1
(...)
$2 = 1

16.4.5. 値の中身に対するメモリーが制限される

GDB は、以前は、値のコンテンツに割り当てられるメモリー量に制限を課していませんでした。その結果、デバッグプログラムにより、GDB が割り当てるメモリー量が多くなりすぎていました。割り当てたメモリーの量を制限できるように、max-value-size 設定が追加されました。この制限のデフォルト値は 64 KiB です。これにより、Red Hat Enterprise Linux 8 の GDB では、表示される値が大きくなりすぎることはありませんが、その値が大きすぎることが報告されます。

たとえば、char s[128*1024]; と定義された値を出力すると、異なる結果が生成されます。

  • Red Hat Enterprise Linux 7 では、$1 = 'A' <repeats 131072 times> となります。
  • Red Hat Enterprise Linux 8 では、value requires 131072 bytes, which is more than max-value-size (値には 131072 バイトが必要ですが、この値は max-value-size を超えています) と表示されます。

16.4.6. スタブ形式の Sun のバージョンがサポート対象外になる

Sun バージョンの stabs デバッグファイルフォーマットのサポートが削除されました。RHEL で gcc -gstabs オプションを使用して GCC が生成した stabs フォーマットは、GDB でも引き続きサポートされます。

16.4.7. Sysroot 処理変更

set sysroot path コマンドは、デバッグに必要なファイルを検索する際にシステムルートを指定します。このコマンドに適用したディレクトリー名は、文字列 target: のプレフィックスになり、GDB が、(ローカルおよびリモートの) ターゲットシステムの共有ライブラリーを読み込みます。以前は利用できた remote: プレフィックスは、target: として扱われるようになりました。さらに、デフォルトのシステム root 値は、後方互換性として、空の文字列から target: に変更になりました。

GDB がリモートのプロセスを開始したり、すでに実行しているプロセス (ローカルおよびリモートの両方) に接続する際に、指定したシステムの root が、主な実行ファイルのファイル名の先頭に追加されます。これは、プロセスがリモートの場合に、デフォルト値 target: が、GDB が、リモートシステムからデバッグ情報を読み込もうとすることを示しています。これが発生しないようにするには、target remote コマンドの前に set sysroot コマンドを実行して、ローカルのシンボルファイルが、リモートのファイルが見つかるよりも早く見つかるようにします。

16.4.8. HISTSIZE が GDB コマンドの履歴サイズを制御しなくなる

HISTSIZE 環境変数に使用されている GDB は、コマンド履歴がどのぐらい保存されるかを指定していましたが、代わりに GDBHISTSIZE 環境変数が使用されるように変更になりました。この変数は、GDB に固有になります。可能な値、およびその影響は、以下のようになります。

  • 正の数 - このサイズのコマンド履歴を使用
  • -1 または空の文字列 - コマンド履歴をすべて保持
  • 数値以外の値 - 無視

16.4.9. 完了制限が追加される

set max-completions コマンドを使用して、完了時に検討される候補の最大値が制限されるようになりました。現在の制限を表示するには、show max-completions コマンドを実行します。デフォルト値は 200 です。この制限により、GDB が、生成する完了リストが大きすぎて、応答しなくならないようにします。

たとえば、p <tab><tab> の入力後の出力は、以下のようになります。

  • RHEL 7 の場合: Display all 29863 possibilities? (y or n)
  • RHEL 8 の場合: Display all 200 possibilities? (y or n)

16.4.10. HP-UX XDB 互換性モードが削除される

HP-UX XDB 互換性モードの -xdb オプションが GDB から削除されています。

16.4.11. スレッドのシグナル処理

GDB は、シグナルが実際に送信されるスレッドの代わりに、現在のスレッドへシグナルを配信していました。このバグは修正され、実行を再開する際に GDB が現在のスレッドへシグナルを常に渡すようになりました。

また、signal コマンドは、現在のスレッドに、必要なシグナルを常に正しく配信するようになりました。シグナルに対してプログラムが停止したり、ユーザーがスレッドを切り替えた場合は、GDB が確認を求めます。

16.4.12. ブレークポイントモードが常に挿入され、自動的にマージされる

breakpoint always-inserted 設定が変更しました。auto 値と対応する動作が削除されました。デフォルト値は off です。off の場合は、すべてのスレッドが停止するまで、GDB がターゲットからブレークポイントを削除しないようになります。

16.4.13. remotebaud コマンドがサポート対象外に

set remotebaud コマンドおよび show remotebaud コマンドはサポートされなくなりました。代わりに set serial baud コマンドおよび show serial baud コマンドを使用してください。

16.5. コンパイラーおよび開発ツールにおける互換性に影響を与える変更

16.5.1. std::string および std::list における C++ ABI の変更

RHEL 7 (GCC 4.8) と RHEL 8 (GCC 8) との間で変更した libstdc++ ライブラリーから std::string クラスおよび std::list クラスの Application Binary Interface (ABI) は、C++11 標準に従います。libstdc++ ライブラリーは、古い ABI および新しい ABI の両方をサポートしますが、その他の C++ システムライブラリーはサポートしません。その結果、このライブラリーに対して動的にリンクするアプリケーションを再構築する必要があります。これは、C++98 を含むすべての C++ 標準モードに影響します。RHEL 7 で Red Hat Developer Toolset コンパイラーを使用して構築したアプリケーションにも影響します。このコンパイラーは、古い ABI を維持して、システムライブラリーとの互換性を維持します。

16.5.2. librtkaio が削除される

この更新では、librtkaio ライブラリーが削除されました。このライブラリーは、ファイルへの高パフォーマンスのリアルタイム非同期 I/O アクセスを提供しました。これは、Linux の KAIO (kernel Asynchronous I/O) サポートに基づいています。

削除の結果は以下のようになります。

  • librtkaio を読み込む LD_PRELOAD メソッドを使用するアプリケーションは、不明なライブラリーに関する警告を表示し、代わりに librt ライブラリーを読み込み、適切に実行します。
  • librtkaio を読み込む LD_LIBRARY_PATH メソッドを使用するアプリケーションは、代わりに librt を読み込んで適切に実行し、警告は表示されません。
  • dlopen() システムコールを使用するアプリケーションでは、代わりに librtkaiolibrt ライブラリーを直接読み込みます。

librtkaio のユーザーには以下のオプションがあります。

  • 自身のアプリケーションを変更せずに、上記のフォールバックメカニズムを使用してください。
  • librt ライブラリーを使用するようにアプリケーションのコードを変更します。互換性のある POSIX 準拠 API を提供します。
  • 互換性のある API を提供する libaio ライブラリーを使用するようにアプリケーションのコードを変更します。

特定の条件では、librtlibaio の両方が、同じ機能および性能を提供します。

Red Hat 互換性レベルは、libaio パッケージが 2 になります。librtk と削除された librtkaio の場合は 1 です。

詳細は、https://fedoraproject.org/wiki/Changes/GLIBC223_librtkaio_removal を参照してください。

16.5.3. Sun RPC インターフェースおよび NIS インターフェースが glibc から削除される

glibc ライブラリーは、新しいアプリケーションに Sun RPC および NIS のインターフェースを提供しなくなりました。このインターフェースは、レガシーアプリケーションを実行する場合にのみ利用可能になりました。開発者は、Sun RPC の代わりに libtirpc ライブラリー、そして NIS の代わりに libnsl2 ライブラリーを使用するようにアプリケーションを変更する必要があります。アプリケーションは、置換ライブラリーの IPv6 サポートを利用します。

16.5.4. MPI デバッグサポートの Valgrind ライブラリーが削除される

valgrind-openmpi パッケージが提供する Valgrindlibmpiwrap.so ラッパーライブラリーが削除されました。このライブラリーにより、MPI (Message Passing Interface) を使用して、Valgrind がプログラムをデバッグできるようになりました。このライブラリーは、以前のバージョンの Red Hat Enterprise Linux の Open MPI 実装バージョンに固有です。

libmpiwrap.so を使用する場合は、MPI 実装およびバージョンに固有のアップストリームソースから独自のバージョンを構築することが推奨されます。LD_PRELOAD 技術を使用して、カスタムビルドのライブラリーを Valgrind に提供します。

16.5.5. 開発用ヘッダーおよび静的ライブラリーが valgrind-devel から削除される

valgrind-devel サブパッケージは、カスタムの valgrind ツールを開発する開発ファイルを追加するために使用されました。これらのファイルには、保証された API がないため、この更新によりこのファイルが削除され、静的なリンクが必要となり、サポート対象外となります。valgrind-devel パッケージには、valgrind が有効なプログラムや、valgrind.hcallgrind.hdrd.hhelgrind.hmemcheck.h などのヘッダーファイルに対する開発ファイルが含まれます。このファイルは安定しており、サポートも適切です。

16.5.6. 32 ビット Xen の nosegneg ライブラリーが削除される

glibc i686 パッケージは、以前は代替の glibc ビルドに含まれており、負のオフセット (nosegneg) を使用してスレッド記述子セグメントレジスターの使用を回避していました。この代替ビルドは、ハードウェアの仮想化サポートを使用せずに、フル準仮想化のコストを削除するための最適化として、32 ビットバージョンの Xen Project ハイパーバイザーでのみ使用されます。この代替ビルドはこれ以上使用されず、削除されます。

16.5.7. GCC が、Ada、Go、および Objective C/C++ コードを構築しなくなる

GCC コンパイラーから、Ada (GNAT)、GCC Go、および Objective C/C++ の言語でコードを構築する機能が削除されました。

Go コードを構築する場合は、代わりに Go Toolset を使用します。

16.5.8. make の新しい演算子 != を使用すると一部の makefile の既存構文で解釈が異なる

BSD makefile との互換性を高める $(shell …​) 関数の代わりに、シェル代入演算子 != が GNU make に追加されました。これにより、variable!=value のように、感嘆符で終わり、その後に代入が続く名前の変数は、新しいシェル代入として解釈されるようになりました。以前の動作に戻すには、variable! =value のように、感嘆符の後に空白を追加します。

演算子と関数の詳細と相違点は、GNU の make マニュアルを参照してください。