linux能有二進制兼容嗎_風聞
code2Real-有人就有江湖,有code就有bug2021-12-02 10:07
國內很多單位拿開源linux魔改一下,就自稱開源可控了。
當我指出這種做法是短視時,有人回懟:你不知道二進制兼容嗎?
説得好象在linux上實現二進制兼容是很輕鬆的事一樣。
在解釋這個“二進制兼容”之前,先看看 Unix/C 語言的一個歷史問題:open() 的 flags 參數的取值。
open(2) 函數的原型是 int open(const char *pathname, int flags); 其中 flags 的取值有三個: O_RDONLY, O_WRONLY, O_RDWR。
與一般人的直覺相反,這幾個值不是按位或 (bitwise-OR) 的關係,即 O_RDONLY | O_WRONLY != O_RDWR。
如果你想以讀寫方式打開文件,必須用 O_RDWR,而不能用 (O_RDONLY | O_WRONLY)。
為什麼?因為 O_RDONLY, O_WRONLY, O_RDWR 的值分別是 0, 1, 2。它們不滿足按位或 。
那麼為什麼 C 語言從誕生到現在一直沒有糾正這個不足之處?
比方説把 O_RDONLY, O_WRONLY, O_RDWR 分別定義為 1, 2, 3,這樣 O_RDONLY | O_WRONLY == O_RDWR,符合直覺。而且這三個值都是宏定義,也不需要修改現有的源代碼,只需要改改系統的頭文件就行了。
因為這麼做會破壞二進制兼容性。對於已經編譯好的可執行文件,它調用 open(2) 的參數是寫死的,更改頭文件並不能影響已經編譯好的可執行文件。
比方説這個可執行文件會調用 open(path, 1) 來寫 文件,而在新規定中,這表示讀 文件,程序就錯亂了。
以上這個例子説明,如果以 shared library 方式提供函數庫,那麼頭文件和庫文件不能輕易修改,否則容易破壞已有的二進制可執行文件,或者其他用到這個 shared library 的 library。
操作系統的 system call 可以看成 Kernel 與 User space 的 interface,kernel 在這個意義下也可以當成 shared library,你可以把內核從 2.6.30 升級到 2.6.35,而不需要重新編譯所有用户態的程序。
所謂“二進制兼容性”指的就是在升級(也可能是 bug fix)庫文件的時候,不必重新編譯使用這個庫的可執行文件或使用這個庫的其他庫文件,程序的功能不被破壞。
linux很難做到二進制兼容,而windows就做得比較好,當系統升級時,你不用擔心原來的程序運行不了,而ubuntu這樣的軟件就需要擔心了。
當然,linux一些發行版可能十幾年都不升級,一些單位仍然在使用centos6。
光説理論沒有用,我們還得把linus在一次會議上的講話搬出來壓一壓場子:
在 DebConf 14 會議上,Linus Torvalds 指出 Linux 分裂的一個重要原因:
他一向要求各版本的 Linux 儘量不要更改核心,不能破壞用户空間,但基本沒人遵守 —— 每個發行版都在隨意地修改 glibc 庫,改變底層 API。
這些 API 的差別導致應用開發者無法為 “Linux” 平台創建一個通用的包,一個應用的二進制文件通常只能適用於某個發行版,比如 Debian 10 或 ubuntu 20 。除此之外,API 的變動讓應用程序的向後兼容性也變得更差了。
這些都是非常嚴重的兼容性問題,適配分裂的 Linux 發行版常常讓開發者感到疲憊。Linus 坦言自己參與了一個聊天軟件的新項目,他為 Windows 和 OSX 都創建了二進制文件包,唯獨沒有創建 Linux 的二進制文件。不僅是在這個新項目,Linus 的原話是:“我一般不為 Linux 桌面製作二進制文件,不同的 Linux 發行版有不同的規則,為不同版本的 Linux 做適配是真他*的痛苦。”
除了程序兼容性對開發者的困擾,Linus 還指出 Linux 桌面對非開發者的普通用户太不友好。普通用户需要的是開箱即用,他們買了一台設備,然後使用設備的操作系統進行娛樂/工作,對他們而言,最重要的是清晰的界面、穩定的應用程序。假設有一個不懂技術的用户在使用 ubuntu 20,然後某個軟件在更新到 ubuntu 21 版本後出現兼容性問題,那麼這個用户要為這個不兼容應用程序付出大量的時間和精力去搜索新的程序安裝包,查詢兼容性問題,重新調整/調試/編譯系統上的應用 ,而在 Windows 中,這個用户只需要點一下軟件升級或者重新下載安裝—— 設想一下你是這個用户,你會選擇 Linux 還是Windows ?
無奈的是, Linus 7 年前指出的程序兼容性問題時至今日仍無法解決,新的 Linux 版本還在進一步分裂 Linux 的軟件生態。當然,好的方面是我們有 Flatpak 這種跨 Linux 版本統一包管理程序,但即便是這類包管理程序也存在 Flatpak、Snap 和 Appimage 等好幾種。
希望國家能通過法律強制性解決linux二進制兼容問題,這是市場無法解決的問題,需要國家層面出手。當然也希望華為的OS能避免這個問題,不要讓其它單位魔改OS內核。