本文介紹GCC/Glibc組件的兼容性情況。從GCC 8到GCC10版本、Glibc 2.28到Glibc 2.32版本的重要變更,以及這些變更產生的前向或后向兼容性影響,同時也提出了相應的解決方案。
背景信息
GCC/Glibc
組件的兼容性可分為ABI(Application Binary Interface)兼容性和API(Application Programming Interface)兼容性。對于GCC/Glibc
的ABI兼容性,主要指影響二進制直接運行的兼容性;而對于GCC/Glibc
的API兼容性,則主要指影響應用程序代碼編譯的兼容性。
GCC/Glibc的ABI兼容性
GCC
是一個編譯器,通常不涉及“ABI 兼容性”的概念。然而,由于Alibaba Cloud Linux及CentOS等操作系統發行版會在GCC
軟件包中搭載標準的C++
庫(libstdc++
),因此GCC
對應用ABI兼容性的影響,通常是指libstdc++
庫對應用ABI兼容性的影響。
前向兼容性:
libstdc++
和Glibc
都有良好的前向兼容性,因此基于CentOS 8的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.28
環境中運行。
GCC/Glibc的API兼容性
GCC
和Glibc
作為操作系統的核心工具鏈,對應用API有著良好的前后向兼容。然而,在版本更新的過程中,也會出現影響應用API兼容性的變更。
GCC
影響前向兼容性的示例:低版本的
GCC
編譯參數在高版本中被廢棄,使用了相同編譯參數的應用程序無法在高版本的GCC
環境中編譯通過,需要手動修改編譯參數。影響后向兼容性的示例:高版本的
GCC
引入新的編譯參數,使用了該參數的應用程序無法直接在低版本的GCC
環境中編譯通過,需要手動修改編譯參數。
Glibc
影響前向兼容性的示例:低版本的
Glibc
函數或頭文件在高版本中被廢棄,使用了該函數或頭文件的應用程序無法在高版本的Glibc
環境中編譯通過,需要手動修改應用程序代碼。影響后向兼容性的示例:高版本的
Glibc
引入了新的函數及實現,使用了該函數的應用程序無法直接在低版本的Glibc
環境中編譯通過,需要手動修改應用程序代碼。
Glibc 2.32版本的重要變更及影響
下表列出了Glibc 2.28
到Glibc 2.32
版本的重要變更,并介紹了這些變更所帶來的影響以及相應的解決方案。
類別 | 變更 | 兼容性變更類型 | 影響 | 解決方案 |
|
| API | 如果源碼使用了 | 使用 |
廢棄了 | API | 如果源碼使用了 | 使用 | |
| API |
| 使用 | |
| API |
| 使用 | |
| API | 在 | 添加 | |
| 刪除了頭文件 | API | 引用了該頭文件的代碼會編譯失敗。 | 刪除代碼中對 |
刪除了 | API | 調用 | 使用 | |
| 從頭文件中刪除了 | ABI | 基于舊版本 | 內核和 |
API | 對于新編譯的應用程序,會直接編譯失敗。 | |||
| 傳統的信號處理函數 | ABI | 對于已編譯的二進制, | 無需解決方案。 |
API | 對于應用程序代碼,編譯會出現 | 修改源碼,使用 | ||
| ABI | 對于已編譯的二進制, | 無需解決方案。 | |
API | 對于應用程序代碼,編譯會出現 | 修改源碼,使用 | ||
|
| ABI | 對于已編譯的二進制, | 無需解決方案。 |
API | 對于應用程序代碼,編譯會出現 | 使用 | ||
| 刪除了 | API | 應用程序調用 | 如果內核不支持 |
| 新增 | API | 如果使用了弱引用 | 對于單線程的判斷使用 |
| 去除對 | API | 所有引用了 |
|
GCC 10版本的重要變更及影響
下表列出了GCC 8
到GCC 10
版本的重要變更,并介紹了這些變更所帶來的影響以及相應的解決方案。
類別 | 變更 | 兼容性變更類型 | 影響 | 解決方案 |
|
| API |
這些變量會在鏈接階段合并放入到 |
|
| 形參和實參不匹配時, | API | 形參和實參不匹配時,編譯出現報錯。 |
|
| 一些 | API | 應用程序編譯報錯。 | 根據報錯信息,在程序中引入相關的頭文件。 |
枚舉檢查 |
| API | 應用程序編譯報錯。 | 正確使用枚舉。 |
LSE |
| API | 該選項能夠在運行時檢測是 | 正確使用該選項。 |
GCC 10告警信息變更說明
下表列出了GCC 8
到GCC 10
版本相關的告警信息變更。
編譯告警并不會直接影響API的兼容性。在應用程序遷移到Alibaba Cloud Linux 3系統時,如果出現編譯告警,建議修改應用程序代碼以規避這些告警信息。
參數名 | 兼容性變更類型 | 類型 | 說明 |
| API | 新增 | 默認為 當結構體或者 |
| API | 新增 | 由 |
| API | 增強 | 檢測更多的數據元素訪問越界和對長度為0的數組元素訪問。 |
| API | 增強 | 檢測它們之間的類型、別名、聲明與其目標之間的屬性是否匹配。 |
| API | 增強 | 編譯時檢查使用格式化輸出函數是否有可能發生緩沖區溢出。預測到輸出將超過緩沖區界限時,編譯器就會發出警告。 |
| API | 新增 | 檢測別名和弱引用聲明中的函數屬性是否丟失。 |
| API | 增強 | 與 |
| API | 增強 |
|
| API | 增強 | 檢測更多返回自動變量地址的場景。 |
| API | 增強 | 檢測對動態分配對象的重疊訪問。 |
| API | 增強 |
|
相關文檔
了解更多版本變更信息,請參考Glibc
和GCC
的ReleaseNotes。