Mac OS X 和 Linux 之间的二进制兼容性

Mac OS X 和 Linux 之间的二进制兼容性

我们有两个具有相似硬件的系统(重点是处理器,比如说标准的英特尔酷睿 2 双核)。

一个正在运行(在此插入您的 Linux 发行版:此后将使用 Ubuntu),另一个正在运行(假设是 Mac OS X)。

编译一个等效的程序,让我们这样说:

int main()
{
    int cat = 33;
    int dog = 5*cat;
    return dog;
}

代码非常简单,因为我还不想考虑共享库的含义。

在各自的系统上编译时。输出之间的主要区别不是 ELF 与 Mach-O 的问题吗?如果要去除每个二进制文件的格式,留下一个平面二进制文件,那么反汇编的机器指令不是相同的吗? (根据编译器的习惯/倾向,可能会有一些差异)。

  1. 如果要开发一个程序,以 Mach-O 格式重新打包 Ubuntu 系统生成的平面二进制文件,它可以在 Mac OS X 系统中运行吗?那么,如果只有上述程序的编译后的二进制文件,并且有这个用于重新打包平面二进制文件的神秘工具,那么简单的程序是否能够在 Mac OS X 系统上运行呢?

现在让我们更进一步。

我们现在有一个程序,其源代码如下:

#include <stdio.h>
int main()
{
    printf("I like tortoises, but not porpoises");
    return 0;
}
  1. 假设这个程序被编译并静态链接,我们神奇的程序是否仍然能够以 Mach-O 格式重新打包原始二进制文件并使其在 mac os X 上运行?因为它不需要依赖任何其他二进制文件(在这种情况下,mac 系统不需要依赖任何其他二进制文件)

现在进入最后一个关卡;

  1. 如果我们使用这个假定的程序将所有必需的共享库转换为 Mach-O 格式,然后使用动态链接编译上面的程序,会怎么样?程序还能成功运行吗?

现在应该是这样了,显然每一步的荒谬都依赖于之前的基础,甚至是有意义的。所以如果第一根支柱被摧毁,我怀疑剩下的几层会有多少价值。

对于带有 GUI 的程序,我绝对不会想到这一点。窗口系统可能是另一个令人头疼的问题。我现阶段只考虑命令行程序。

现在,我请全世界来纠正我,告诉我我的荒谬思维的一切错误。

答案1

您忘记了一件至关重要的事情,即您的程序必须与操作系统交互才能完成任何有趣的事情。

Linux 和 OS X 之间的约定不同,因此如果没有大量与操作系统相关的代码能够与之交互,相同的二进制文件就无法按原样运行。其中许多东西都是通过库提供的,然后您需要链接到库中,这意味着您的程序需要可链接,并且两个系统之间的链接也不同。

就这样一直持续下去。表面上听起来像是做同样的事情,但实际细节却截然不同。

答案2

如果有人想花足够的时间来实现这一点,这是可行的。这亲爱的计划正在尝试这样做,尽管在撰写本文时,它还处于相当原始的状态。

之前在其他平台上已经成功完成:

  • Solaris 和 UnixWare 包含一个名为的帮助程序lxrun其工作原理类似于sudo:您将可执行文件名称和参数传递给帮助程序,它会动态修复问题,以便可执行文件可以与操作系统对话。这官方网站(向下,存档链接)说这是位腐烂的

  • Linux 的内核曾经有一个功能叫做iBCS其作用恰恰相反,只是它不需要帮助程序,因为内核直接识别“外部”二进制文件。它在内核 2.3 开发系列期间年久失修,很可能是因为 2.4 发布后,小型 Unix 服务器之战基本上就结束了。

  • FreeBSD 的内核可以配置为识别 Linux 二进制文件并像原生一样运行它们。此功能似乎比上述两个功能更好。

    OpenBSD 和 NetBSD 具有相似的功能。

OS X 中有很多 FreeBSD,因此移植其 Linux 支持可能很简单。

答案3

我非常同意每个人的观点,但我想补充一点,虽然这需要花费大量的时间和精力,但不会像开发 Wine 所花费的那么多。

Wine 开发中的大部分困难在于他们从闭源操作系统移植二进制格式,并且许多系统调用都没有记录。他们必须对操作系统进行本质上的逆向工程。

如果有人要从一个开放操作系统到另一个开放操作系统执行此操作,他们可能会在 1/10 的时间内完成,因为如果有等效的本机系统调用,则可以想象兼容性层可以从另一个操作系统复制/粘贴不存在。当然,在 POSIX 世界的大多数情况下,都会有可用的本机调用。

另一个值得注意的项目是 ReactOS,他们本质上是在创建一个完全二进制兼容的 Windows 版本……不需要 Wine。

答案4

有许多专门的 Linux 应用程序,这将有很大的帮助。在 FPGA 方面,Quartus 和 Vivado 是在 Linux 下运行的程序的良好示例,但不太可能提供它们的源代码或针对最新 FPGA 的类似程序。

我认为你的问题的简单答案是:在你有源代码的 MacOS 上重新编译,如果你有时间的话,组建一个小组来提供该功能——这将是一项耗时的任务。

相关内容