*nix 可执行文件兼容性

*nix 可执行文件兼容性

我在看这个方案现在我想知道,一个可执行文件可以在具有相同祖先的两个系统中运行吗? (所以可能是相同的内核?)

例如,根据方案:Solaris <- 系统 V R4 <- BSD 4.3,那么,BSD*(OpenBSD、FreeBSD、NetBSD)和 Solaris 可以运行相同的可执行文件吗?

PS 可能这个问题对你来说是显而易见且毫无意义的,但我对 *nix 完全陌生,所以对我来说这很重要。

答案1

简短回答:不。

中等答案:也许,如果目标操作系统支持的话。

答案很长...

首先要注意的是,不同的供应商可能使用不同的芯片组。因此,可以为 SPARC 芯片编译 Solaris 二进制文件。这不能在 Intel/AMD 机器上运行。类似地,AIX 可能位于 PowerPC 上。 HP-UX 可能位于 PA-RISC 上。让我们忽略所有这些问题,只关注“Intel/AMD”领域。

下一个问题是不同的操作系统可能会暴露不同的内核系统调用。这意味着应用程序对内核的任何调用都不会按预期进行。这显然是一个问题。但是目标内核可能能够提供“ABI兼容层”;内核(假设是 FreeBSD 内核)可以检测到您正在尝试运行 Linux 二进制文件,并且可以在 Linux 内核 ABI 和本机内核 ABI 之间进行转换。

下一个问题是图书馆之一; Linux 二进制文件期望能够加载特定版本的 glibc,该版本可能不存在于托管操作系统中。这可能可以通过复制所需的库来解决。同样,操作系统可以使这对您来说更容易,例如通过为这些库提供一个软件包来使它们易于安装。

毕竟你的二进制文件可能跑步 :-)

早在 90 年代,Linux 有一个 iBCS 模块,可以实现此类操作。例如,它使得在 Linux 上运行 SCO Unix 程序成为可能。我在我的机器上运行了 SCO Unix Oracle 作为概念验证。效果非常好!显然没有供应商支持,所以它不适合生产:-)

现在,Linux 在这个领域拥有了巨大的立足点,其他操作系统尝试添加兼容性层,以允许 Linux 程序在其操作系统上运行。

所以如果你的操作系统支持的是如果您正确安装和配置它,那么您可能能够运行另一个 Unix 上的一些程序。

答案2

不,在许多情况下,可执行文件甚至无法在相同的由于内核更改而导致操作系统版本不同。

前几天我遇到的一个简单的例子:dmesgOpenBSD 上的命令输出系统消息缓冲区,这是所有内核消息(启动信息等)的所在。我最近重新编译了内核,突然dmesg会回来说

dmesg: sysctl: KERN_MSGBUF: Cannot allocate memory

这是由于没有重新编译用户态实用程序,并且dmesg尽管在可执行文件被识别为“工作”的意义上,但无法执行其任务(由于内核代码的更改)。

因此,dmesg以前的版本无法在更高版本的操作系统上“工作”。

编辑(来自评论,有补充)

将内核的系统调用视为 API。如果无法更改 API,或者需要始终保持与先前版本的兼容性,这对 API 意味着什么?这不是设计缺陷,而是软件的一般工作方式。

您不能指望运行针对一个 API 版本编译的代码可以与该 API 的任何其他版本一起使用。作为 API/内核开发人员,您会更关心破坏向后兼容性,而不是添加和改进操作系统。

幸运的是,Unix 系统上的大多数软件都是根据 POSIX 标准设计的,这意味着来源可执行文件的内容可以在系统类型之间转移,并且几乎可以在任何地方编译和运行。 Unix 平台之间的二进制兼容性问题仅在以下情况下才成为问题:

  • 需要非 POSIX 扩展,并且
  • 源代码是闭源的。

相关内容