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内核。