すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Linux:Alibaba Cloud Linux 3とCentOS 8のGCCまたはGlibcバージョン間の互換性

最終更新日:Aug 16, 2024

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互換性

GCCGlibcは、オペレーティングシステムのコアツールチェーンコンポーネントであり、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の重要な変更、変更の影響、および影響を軽減する方法を示しています。

データ型

変更

互換性タイプ

影響

どのように影響を軽減するか

時間

stime関数は、time.hヘッダーファイルで宣言されなくなりました。

API

ソースコードでstime関数を使用すると、コンパイルエラーが発生します。

stime関数の代わりにclock_settime関数を使用します。

ftime関数は非推奨です。

API

ソースコードでftime関数を使用すると、コンパイルエラーが発生します。

ftime関数の代わりにclock_gettime関数を使用します。

gettimeofday関数は、タイムゾーンに関する情報を報告しなくなりました。

API

gettimeofday関数は、タイムゾーンに関する情報を取得できません。

gettimeofday関数の代わりにclock_gettime関数を使用します。

settimeofday関数は、POSIXによって廃止とラベル付けされます。

API

settimeofday関数は、時間と時間ドリフトを同時に設定することはできません。

settimeofday関数の代わりに、clock_settimeおよびadjtime関数を使用します。

nanosleepユーザーモードインターフェイスは、nanosleepシステムコールの代わりにclock_nanosleepシステムコールを使用します。

API

アプリケーションがseccompモードで実行され、clock_nanosleep関数がseccompホワイトリストに追加されていない場合、アプリケーションはnanosleep関数を呼び出すことができません。

clock_nanosleepをseccompホワイトリストに追加します。

sysctl

sys/sysctl.hヘッダーファイルが削除されました。

API

ヘッダーファイルを参照するコードはコンパイルできません。

コードからsys/sysctl.hヘッダーファイルへの参照を削除します。

sysctl関数は削除され、互換性シンボルとして存在し続けます。

API

sysctlシステムコールは常にENOSYSエラーで失敗します。

sysctlインターフェイスを使用する代わりに、/proc/sys仮想プロセスファイルシステムにアクセスします。 ランダムなバイトを取得するには、getentropy関数を使用します。

sstk

sstk関数はヘッダーファイルで宣言されなくなりました。

ABI

Glibc 2.28に準拠するアプリケーションは、Glibc 2.32とABI互換です。 プログラムがこの関数を呼び出すと、呼び出しは失敗を返し、プログラムに予期しない動作を引き起こす可能性があります。

カーネルとGlibcsstk関数をサポートしなくなりました。 sstk関数への呼び出しを削除します。

API

Glibc 2.32を使用してsstk関数を使用するアプリケーションをコンパイルすると、エラーが発生します。

信号

sigmaskマクロ、および以下のレガシー信号処理関数: siginterruptsigpausesigholdsigrelsesigignore、およびsigsetが廃止されます。

ABI

Glibc 2.28でコンパイルされるバイナリは、libc.soとABI互換のままです。

解決策は必要ありません。

API

Glibc 2.32を使用して関数またはマクロを使用するアプリケーションをコンパイルすると、警告またはエラーが返されます。

ソースコードを変更し、代わりにsigsuspend、sigprocmask、sigaction関数を使用します。

sys_siglist_sys_siglist、およびsys_sigabbrev関数は、<string.h> ヘッダーファイルで宣言されなくなりました。

ABI

Glibc 2.28でコンパイルされるバイナリは、libc.soとABI互換のままです。

解決策は必要ありません。

API

Glibc 2.32を使用して関数を使用するアプリケーションをコンパイルすると、警告またはエラーが返されます。

ソースコードを変更し、代わりにstrsignal関数を使用します。

sysエラー

sys_errlist_sys_errlistsys_nerr、および _sys_nerr関数は、stdio.hヘッダーファイルで宣言されなくなりました。

ABI

Glibc 2.28でコンパイルされるバイナリは、libc.soとABI互換のままです。

解決策は必要ありません。

API

Glibc 2.32を使用して関数を使用するアプリケーションをコンパイルすると、警告またはエラーが返されます。

代わりにstrerror関数とstrerror_r関数を使用します。

copy_file_range

copy_file_range関数のシミュレートされた実装が削除されました。

API

カーネルがcopy_file_range関数をサポートしておらず、アプリケーションが関数を呼び出すと、ENOSYSエラーが発生します。

カーネルがcopy_file_range関数をサポートしていない場合、アプリケーションはcopy_file_range関数の機能を提供する必要があります。 Alibaba Cloud Linux 3のデフォルトのカーネルバージョンは5.10で、copy_file_range機能をサポートしています。

スレッド

_libc_single_threaded変数を宣言する <sys/single_threaded.h> ヘッダーファイルが追加されます。

API

pthread_createやpthread_key_createなどのlibpthread関数への弱い参照を使用して、アプリケーションのシングルスレッドの性質を検出することは、時代遅れの機能です。 Glibcの今後のバージョンでは、libc.so.6pthread_createが定義されます。 その結果、このような検出は常にプログラムをマルチスレッドとしてラベル付けする。

代わりに _libc_single_threaded変数を使用して、アプリケーションのシングルスレッドの性質を確認します。

サンRPC

Sun RPCはサポートされなくなりました。

API

Sun RPCヘッダーファイルを参照するすべてのコードの依存関係を変更する必要があります。

  • libtorpc-develパッケージで提供されるrpc/rpc.hヘッダーファイルを使用します。

  • rpcsvc-proto-develパッケージで提供されるrpcsvc/*.hヘッダーファイルを使用します。

  • rpcgenパッケージで提供されるrpcgenプログラムを使用します。

GCC 10の変更と変更の影響

次の表は、GCC8と比較したGCC10の重要な変更、変更の影響、および影響を軽減する方法を説明しています。

データ型

変更

互換性タイプ

影響

どのように影響を軽減するか

-fno-common

GCC 10のデフォルトは -fno-commonオプションです。

API

初期化されていない複数の重複グローバル変数を共通セグメントに定義できます。

変数は、結合段階中にマージされ、bssセグメントに格納される。 一意の名前を持つ初期化された変数のみがリンクステージに存在できます。 -fno-commonオプションを有効にした場合, プログラムの複数のソースファイルに同じグローバル変数が定義されている場合, プログラムでリンカエラーが発生します。

  • グローバル変数が1つのソースファイルでのみ定義されていることを確認し、他のソースファイルの変数の宣言にexternキーワードを追加します。

  • -fcommonオプションを有効にして、前方互換性を確保します。

fortran

パラメーターが引数と一致しない場合、GCC 10Fortranはコンパイルエラーを報告します。

API

パラメーターが引数と一致しない場合、コンパイルエラーが発生します。

  • パラメーターがコード内の引数と一致することを確認します。

  • -fallow-argument-mismatch警告に変換します。

C ++ ヘッダー

<stdexcept><string> は、特定の標準C ++ ヘッダーに含まれなくなりました。

API

アプリケーションのコンパイル中にエラーが発生します。

エラーメッセージに基づいて、必要なヘッダーファイルをアプリケーションに追加します。

列挙チェック

GCC 10は、列挙に対してより厳格なチェックを実施し、他の列挙要素に値を割り当てるための列挙要素の使用を禁止する。

API

アプリケーションのコンパイル中にエラーが発生します。

正しい方法で列挙を使用します。

大規模なシステム拡張 (LSE)

-moutline-atomicsオプションはGCC 10に追加され、-march=armv8-aでは自動的に有効になります。

API

このオプションは、実行時にLSE命令に対するAArch64マシンのサポートを検出するために使用され、標準のアトミック操作の命令を使用します。

このオプションは正しい方法で使用してください。 GCC 10でサポートされているその他のArm64命令セットについては、「3.19.1 AArch64オプション」をご参照ください。

GCC 10の警告オプションの変更

次の表は、GCC 8と比較したGCC 10の警告オプションの変更点を示しています。

説明

コンパイルの警告は、APIの互換性に直接影響しません。 アプリケーションをAlibaba Cloud Linux 3に移行するときにコンパイルの警告が表示される場合は、警告を抑制するようにアプリケーションコードを変更することを推奨します。

オプション

互換性タイプ

変更タイプ

説明

-Waddress-of-packed-member

API

加算

構造体またはユニオンパックされたメンバーのアドレスを取得すると、ポインタ値が整列しないことを警告します。 デフォルトでは、このオプションは有効です。

-Wzero-length-bounds

API

加算

同じオブジェクトの他のメンバーと重複する可能性のある長さゼロの配列メンバーの要素へのアクセスについて警告します。 このオプションは -Warray-boundsで有効になります。

-Warray-bounds

API

強化

メンバー配列への範囲外のアクセスとゼロ長配列の要素へのアクセスについて警告します。

-Wattribute-alias

API

強化

エイリアスを使用する宣言と、ターゲットがエイリアスの型と互換性がない類似の属性について警告します。

-Wformatオーバーフロー

API

強化

宛先バッファをオーバーフローする可能性のあるフォーマット済みの入出力関数への呼び出しについて警告します。 この警告は、フォーマットされた出力関数への呼び出しでバッファのオーバーフローが検出されたときにトリガーされます。

-Wmissing-attributes

API

加算

特定の関数属性がエイリアスにはないがターゲットにはない場合に警告します。

-Wformat切り捨て

API

強化

出力の切り捨てが発生する可能性がある、snprintfなどのフォーマットされた入出力関数への呼び出しについて警告します。 この警告オプションは、-Wformat-overflowオプションと連動します。

-Wstringop-overflow

API

強化

  • ゼロ長配列、動的に割り当てられたオブジェクトと可変長配列、組み込みの文字列関数による終了していない文字配列の読み取りのインスタンスなど、メンバー配列への範囲外のストアについて警告します。

  • 新しい属性アクセスを使用して宣言されたユーザー定義関数への呼び出しによる範囲外のアクセスについて警告します。

-Wreturn-local-addr

API

強化

自動変数のアドレスを返すreturnステートメントのインスタンスについて警告します。

-Wrestrict

API

強化

動的に割り当てられたオブジェクトへのアクセスの重複について警告します。

-ワリス変換

API

強化

-Warith-conversionは、-Wconversion-Wfloat-conversion、および -Wsign-conversionからの警告を再有効にします。これらは自動的に無効になります。

関連ドキュメント

GCCおよびGlibcバージョンのその他の変更については、「GlibcおよびGCC」のリリースノートを参照してください。