本文介紹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。