GNUコンパイラコレクション (GCC) 10およびGlibc 2.28には、GCC8およびGlibc 2.32と比較して重要な変更が組み込まれています。 この変更は、GCC10とGlibc 2.28の前方互換性または後方互換性に影響します。 このトピックでは、GCCバージョン間およびGlibcバージョン間の互換性について説明します。 このトピックでは、影響を軽減する方法についても説明します。
背景情報
GCCまたはGlibcのバージョン間の互換性は、ABI (Application Binary Interface) 互換性とAPI互換性に分類できます。 GCCまたはGlibcバージョン間のABI互換性とは、コードの再コンパイルを必要とせずにバイナリを実行できる互換性を指します。 GCCまたはGlibcバージョン間のAPI互換性とは、コードの再コンパイルを必要とせずにアプリケーションコードを変更せずに実行できる互換性を指します。
GCCまたはGlibcバージョン間のABI互換性
ほとんどの場合、GCCコンパイラにはABI互換性がありません。 ただし、Alibaba Cloud LinuxやCentOSなどのオペレーティングシステムディストリビューションには、GCCパッケージに標準のC ++ ライブラリ (libstdc ++) が含まれています。 アプリケーションとのABI互換性に対するGCCの影響は、アプリケーションとのABI互換性に対するlibstdc ++ ライブラリの影響を指します。
前方互換性:
libstdc ++とGlibcは高度に前方互換性があります。 CentOS上のGCC 8およびGlibc 2.28でコンパイルされるほとんどのコンポーネントは、コードのコンパイルを必要とせずに、Alibaba Cloud Linux 3上のそれぞれGCC 10およびGlibc 2.32環境で実行できます。下位互換性:
libstdc ++とGlibcは下位互換性がありません。 Alibaba Cloud Linux 3上のGCC 10およびGlibc 2.32でコンパイルされたコンポーネントは、CentOS 8上のGCC 8およびGlibc 2.32環境でそれぞれ変更せずに実行できません。
GCCまたはGlibcバージョン間のAPI互換性
GCCとGlibcは、オペレーティングシステムのコアツールチェーンコンポーネントであり、APIとの上位互換性と上位互換性があります。 ただし、バージョンの更新中に、APIの互換性に影響を与える変更がGCCおよびGlibcに加えられる場合があります。
GCC
フォワードAPIの互換性に影響を与える変更の例: 初期の
GCCバージョンで使用されていたコンパイルパラメーターは、後のGCCバージョンでは廃止されます。 その結果、コンパイルパラメーターを使用するアプリケーションは、以降のバージョンのGCCを使用してコンパイルできません。 後のバージョンのGCCを使用してアプリケーションをコンパイルするには、アプリケーションのコンパイルパラメーターを変更する必要があります。下位APIの互換性に影響を与える変更の例: 新しいコンパイルパラメーターは、後の
GCCバージョンで導入されます。 その結果、初期のGCCバージョンを使用して新しいコンパイルパラメーターを使用するアプリケーションをコンパイルすることはできません。 初期のGCCバージョンを使用してアプリケーションをコンパイルするには、アプリケーションのコンパイルパラメーターを変更する必要があります。
グリベック
フォワードAPIの互換性に影響を与える変更の例: 初期の
Glibcバージョンで使用されていた関数またはヘッダーファイルは、後のバージョンのGlibcでは廃止されます。 その結果、Glibc以降のバージョンを使用して関数またはヘッダーファイルを使用するアプリケーションをコンパイルすることはできません。 新しいバージョンのGlibcを使用してアプリケーションをコンパイルするには、アプリケーションコードを変更する必要があります。下位APIの互換性に影響を与える変更の例: 新しい関数と実装は、後の
Glibcバージョンで導入されます。 その結果、初期のGlibcバージョンを使用して新しい関数を使用するアプリケーションをコンパイルすることはできません。 初期のGlibcバージョンを使用してアプリケーションをコンパイルするには、アプリケーションコードを変更する必要があります。
Glibc 2.32の変化と変化の影響
次の表は、Glibc 2.32と比較したGlibc 2.28の重要な変更、変更の影響、および影響を軽減する方法を示しています。
データ型 | 変更 | 互換性タイプ | 影響 | どのように影響を軽減するか |
|
| API | ソースコードで |
|
| API | ソースコードで |
| |
| API |
|
| |
| API |
|
| |
| API | アプリケーションが |
| |
|
| API | ヘッダーファイルを参照するコードはコンパイルできません。 | コードから |
| API |
|
| |
|
| ABI | Glibc 2.28に準拠するアプリケーションは、 | カーネルと |
API | Glibc 2.32を使用してsstk関数を使用するアプリケーションをコンパイルすると、エラーが発生します。 | |||
|
| ABI | Glibc 2.28でコンパイルされるバイナリは、 | 解決策は必要ありません。 |
API | Glibc 2.32を使用して関数またはマクロを使用するアプリケーションをコンパイルすると、 | ソースコードを変更し、代わりに | ||
| ABI | Glibc 2.28でコンパイルされるバイナリは、 | 解決策は必要ありません。 | |
API | Glibc 2.32を使用して関数を使用するアプリケーションをコンパイルすると、 | ソースコードを変更し、代わりに | ||
|
| ABI | Glibc 2.28でコンパイルされるバイナリは、 | 解決策は必要ありません。 |
API | Glibc 2.32を使用して関数を使用するアプリケーションをコンパイルすると、 | 代わりに | ||
|
| API | カーネルが | カーネルが |
|
| API |
| 代わりに |
|
| API |
|
|
GCC 10の変更と変更の影響
次の表は、GCC8と比較したGCC10の重要な変更、変更の影響、および影響を軽減する方法を説明しています。
データ型 | 変更 | 互換性タイプ | 影響 | どのように影響を軽減するか |
|
| API | 初期化されていない複数の重複グローバル変数を 変数は、結合段階中にマージされ、 |
|
| パラメーターが引数と一致しない場合、 | API | パラメーターが引数と一致しない場合、コンパイルエラーが発生します。 |
|
|
| API | アプリケーションのコンパイル中にエラーが発生します。 | エラーメッセージに基づいて、必要なヘッダーファイルをアプリケーションに追加します。 |
列挙チェック |
| API | アプリケーションのコンパイル中にエラーが発生します。 | 正しい方法で列挙を使用します。 |
大規模なシステム拡張 (LSE) |
| API | このオプションは、実行時にLSE命令に対する | このオプションは正しい方法で使用してください。 |
GCC 10の警告オプションの変更
次の表は、GCC 8と比較したGCC 10の警告オプションの変更点を示しています。
コンパイルの警告は、APIの互換性に直接影響しません。 アプリケーションをAlibaba Cloud Linux 3に移行するときにコンパイルの警告が表示される場合は、警告を抑制するようにアプリケーションコードを変更することを推奨します。
オプション | 互換性タイプ | 変更タイプ | 説明 |
| API | 加算 | 構造体または |
| API | 加算 | 同じオブジェクトの他のメンバーと重複する可能性のある長さゼロの配列メンバーの要素へのアクセスについて警告します。 このオプションは |
| API | 強化 | メンバー配列への範囲外のアクセスとゼロ長配列の要素へのアクセスについて警告します。 |
| API | 強化 | エイリアスを使用する宣言と、ターゲットがエイリアスの型と互換性がない類似の属性について警告します。 |
| API | 強化 | 宛先バッファをオーバーフローする可能性のあるフォーマット済みの入出力関数への呼び出しについて警告します。 この警告は、フォーマットされた出力関数への呼び出しでバッファのオーバーフローが検出されたときにトリガーされます。 |
| API | 加算 | 特定の関数属性がエイリアスにはないがターゲットにはない場合に警告します。 |
| API | 強化 | |
| API | 強化 |
|
| API | 強化 | 自動変数のアドレスを返すreturnステートメントのインスタンスについて警告します。 |
| API | 強化 | 動的に割り当てられたオブジェクトへのアクセスの重複について警告します。 |
| API | 強化 |
|
関連ドキュメント
GCCおよびGlibcバージョンのその他の変更については、「GlibcおよびGCC」のリリースノートを参照してください。