7.11. コンパイラーおよび開発ツール
glibc
DNS スタブリゾルバーが、同じトランザクション ID で並列クエリーを正しく処理
今回の更新以前は、GNU C ライブラリー glibc
の DNS スタブリゾルバーは、同じトランザクション ID を持つ並列クエリーへの応答を処理しませんでした。そのため、トランザクション ID が等しい場合、2 番目の並列応答がクエリーと一致せず、タイムアウトおよび再試行が生じました。
今回の更新で、2 つ目の並列応答が有効と認識されるようになりました。その結果、glibc
DNS スタブリゾルバーは、認識されない応答による過剰なタイムアウトを回避します。
fgetsgent()
および fgetsgent_r()
で設定ファイルの読み取りがより堅牢になりました。
/etc/gshadow
ファイルで特に構造化エントリー、または読み込み時のファイルサイズの変更によって、fgetsgent()
および fgetsgent_r()
関数が無効なポインターを返すことがありました。そのため、これらの関数を使用して /etc/gshadow
、または /etc/
内のその他の設定ファイルをセグメンテーションフォールトで読み取り、失敗していました。今回の更新で fgetsgent()
および fgetsgent_r()
が変更され、設定ファイルの読み込みがより堅牢となりました。その結果、アプリケーションが正常に設定ファイルを読み取るようになりました。
glibc
文字列は、AMD64 および Intel 64 プロセッサーのシステムキャッシュに悪影響を及ぼさなくなりました。
以前では、文字列関数の glibc
の実装は、64 ビット AMD および Intel プロセッサーのスレッドで利用可能な最終レベルのキャッシュを誤って予測していました。その結果、大規模なバッファーで memcpy
関数を呼び出すと、システムの全体的なキャッシュパフォーマンスに影響を与えるか、memcpy
システムコールの速度が低下していました。
今回の更新で、システム内で報告されたハードウェアスレッド数で、最後のレベルのキャッシュサイズがスケーリングされなくなりました。その結果、文字列関数が大規模なバッファーのキャッシュをバイパスし、残りのシステムキャッシュに悪影響を及ぼさなくなりました。
glibc
動的ローダーが、libc.so.6
の特定の失敗を回避するようになりました。
以前は、libc.so.6
共有オブジェクトがメインプログラム (glibc
バージョン情報を表示するなど) として実行されると、glibc
動的ローダーは、LD_PRELOAD
環境変数を使用してロードされたオブジェクトに関連する libc.so.6
を正しく再配置しませんでした。そのため、LD_PRELOAD
が設定されている場合、libc.so.6
を呼び出すと、libc.so.6
がセグメンテーションフォールトで予期せずに終了することがありました。今回の更新でバグが修正され、動的ローダーが libc.so.6
の再配置を正しく処理するようになりました。その結果、上記の問題が発生しなくなりました。
(BZ#1882466)
glibc
動的リンカーが、静的スレッドローカルストレージ領域の一部を静的 TLS 割り当てに制限するようになりました。
以前は、glibc
動的リンカーは、動的 TLS に利用可能なすべての静的スレッドローカルストレージストレージ (TLS) 空間を最初に使用していました。そのため、動的 TLS の割り当てで、利用可能なすべての静的 TLS 領域の消費がすでに使用されているため、dlopen
関数を使用してランタイム時に追加の共有オブジェクトを読み込むことが失敗することがありました。この問題は、特に 64 ビット ARM アーキテクチャーおよび IBM Power Systems で発生しました。
動的リンカーは、静的 TLS 領域の一部を静的 TLS 割り当てに制限し、動的 TLS の最適化にこの領域を使用しなくなりました。これにより、dlopen
呼び出しは、デフォルト設定でより多くのケースで成功します。デフォルト設定よりも多くの静的 TLS を必要とするアプリケーションでは、新しい glibc.rtld.optional_static_tls
調整可能パラメーターを使用できます。
glibc
動的リンカーが、64 ビット ARM バリアント呼び出し規則の Lazy binding を無効にするようになりました。
以前は、glibc
動的リンカーは、64 ビット ARM(AArch64) バリアント呼び出し規則を使用して、関数の Lazy バインディングを無効にしませんでした。その結果、このような関数呼び出しにおける動的リンカーの破損した引数により、誤った結果やプロセスが失敗する可能性がありました。今回の更新で、上記のシナリオで動的リンカーがレイジーバインディングを無効にし、関数の引数が正しく渡されるようになりました。
gcc
がバージョン 8.4 にリベースされました。
GNU コンパイラーコレクション (GCC) がアップストリームバージョン 8.4 にリベースされ、以前のバージョンにバグ修正が数多く追加されました。