首頁 > 軟體

談談Linux應用程式 ABI相容性

2020-06-16 17:57:47

背景

最近工作中遇到個問題,就是多個系統跑著不同版本的核心,不同架構的ARM晶片,上層的業務程式能否二進位制歸一(共映象)。

根據自己對Linux的了解,glibc是否可以在ABI層面做到向前相容。那個整個系統能否做到呢?這勾起了我的分析和思考。

ABI相容依賴什麼

試想一下,一個程式從原始碼到最終的二進位制,有哪些元件參與了編譯和連結過程,大概如下:

  • 核心匯出使用者態標頭檔案
  • gcc編譯器,gcc提供的靜態.o/.a,以及它提供的動態庫(如libgcc_s.so)
  • glibc
  • 第三方開源庫

需要分析各組通能否做到二進位制相容性,以及是如何做到的。下面我對各元件,以思維導圖來分析是否能滿足ABI相容性。

上面的思維導圖把我想到的元件都進行細分,把每個細節都覆蓋到。當然,還會有一些細節是我沒有想到的。下面對不那麼常見的元件進行說明:

  • 核心匯出標頭檔案: 構建過交叉編譯工具鏈是嵌入式裡面常做的事情,工具鏈的構建需要使用核心匯出的導檔案。這是核心態和使用者約定好的基礎型別和資料結構,比如我們常見的time_t,pid_t等等型別。整於使用者態軟體都以它為基石。
  • glibc版本機制:glibc對大部分符號都打上版本號,日後在高版本的glibc中,由於POSIX/LSB標準的變化,或者函數介面有變,它會建立該符號的另一新版本,但原來版本的符號仍然存在,同時語意和引數保持不變。它通過這種機制來保證ABI的向前相容性(請注意,無法保證向後的相容性)

從分析來看,大部分軟體都是可以保持向前相容的。這就是為什麼從一台機制上的程式拷貝到另一台機制上,程式還能正常執行。

Linux standard Base(LSB)

噢,這到底是巧合呢?還是什麼:所有Linux 程式都是在所有機器上執行。我也帶個著這個問題去找一些資料。
想信大家聽說到POSIX規範,Linux Standard Base(LSB)規範。起初,我以為LSB是API規範而非ABI規範。當我去深入分析時,發現它是一個ABI規範,它解決兩方面的問題:

  • 在發行版Linux A上執行的程式,可以執行在發行版本Linux B上。
  • 應用程式在現在的機器上執行,也能在未來新系統和機器上執行。

最近Linux基金會發起LSB專案就是希望Linux發行商能做到相互相容,並且也能向前相容。解決Linux應用的可移植性和相容性。

LSB實際是是一組ABI介面的定義,它規範了執行環境所需要的型別,宏,變數和函數的二進位制介面。

那麼,哪些東西受到LSB的制約呢?也即LSB規範約束的範圍多廣。剛開始,我還以為只有kernel, glibc等一些關鍵的元件。事實上,開啟LSB官網說明會發現它包羅萬象,從命令,ELF,glibc介面,到桌面,指令碼語言等等都有相關的規定。

誰應該遵守LSB規範

毫無疑問,kernel, glibc等都應該遵守LSB標準。事情上,並非如此。 LSB希望Linux發布版(如RedHat, SUSE, Ubuntu)能遵守LSB,因此它提供了LSB的測試套和LSB的認證服務。

那麼Kernel和glibc就真的不需要考慮LSB了吧,答案是否定的。整個kernel/glibc和各大Linux知名元件都以開源方式進行開發,它裡面的技術早已不是什麼密秘了,各大公司都有工程師參與,所有公司都希望這些軟體都是遵守LSB,使所有軟體都能輕易地融合在一起,不希望讓發生行商花很大力氣去整合。因此所有軟體都是會盡量遵守LSB規範,但無法排除有那麼一兩個例外的Case。

glibc是大家用得最多的元件,也算是我比較了解的元件之一,到網上找了一些它的相容性分析,發現它也不能保證100%向前相容。不能完全相容的發生在2.16.0和2.13兩個版本上。當前對於一般的軟體,這個相容性是完全足夠了的。

“向後”相容性

那麼Linux能做到向後相容性嗎?答案是否定的,因為LSB也無法做到向後相容。

那問題來了,如果我需要做到向後相容呢?假如有下面這種場景:

很多伺服器都是Ubuntu 7.04,算是8年前的伺服器了,數量很多。同時也會有伺服器使用了12.04,數量較少。但12.04上的編譯器較新,支援很多安全功能。架構師的訴求就是:能否基於12.04版本執行環境做開發編譯,生成的服務程式能同時執行在7.04和12.04兩個伺服器上。

我能想到的解決辦法:

  • 找到Ubuntu 7.04和12.04兩伺服器執行軟體,所遵守的LSB版本,服務程式只能呼叫這兩LSB完全相容的介面
  • 在程式設計和連結服務程式時,可以指定程式使用的LSB標準(Ubuntu 7.04版本的LSB)。

對於第一個方法,個人認為可行,但約束很多。方法二未知可行,後續再分析

這就是“向後”相容性想討論的一個問題。它不是真正的向後相容性,完全是依賴於向前相容來實現的。

後記

相容性,完全不是我熟悉的東西,只是工作上遇到問題,做了初步分析。希望通過blog記錄我的思考,當某一天,我對這個知識有深入的經驗,再跟大家分享。如有寫得不正確,或者誤導的內容,請指正,謝謝!

2015/7/11 於上海 燦鴻颱風來襲

本文永久更新連結地址http://www.linuxidc.com/Linux/2015-07/119763.htm


IT145.com E-mail:sddin#qq.com