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


27

冒犯自己,这个问题可能会显得天真和/或愚蠢,因为我对诸如系统之类的unix的内部工作和编程一般来说还比较陌生。

准备?好!我将经历大约3个水平的可笑性,并随着操作的进行而增加。


我们有两个具有相似硬件的系统(主要是处理器,让我们说一个标准的Intel Core 2 Duo)。

一个正在运行(在此处插入您的Linux发行版:以后将使用Ubuntu),另一个正在运行,例如Mac OSX。

一个人编译一个等效的程序,让我们说一些类似的东西:

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;
}

2.)假设该程序已编译并静态链接,我们的魔术程序是否仍然能够以Mach-O格式重新打包原始二进制文件,并使它在mac os X上运行?看起来它不需要依赖任何其他二进制文件(在这种情况下,mac系统不需要)


现在到了最后的水平;

3.)如果我们使用该假定程序将所有必需的共享库转换为Mach-O格式,然后使用动态链接编译上述程序,该怎么办。该程序仍然可以成功运行吗?

现在应该是这样,显然荒谬的每一步都依赖于先前的基础,甚至变得有意义。因此,如果第一根支柱遭到破坏,我怀疑其余层级会有很多好处。

我绝对不会想到带有GUI的程序来考虑这一点。窗口系统可能完全是另一个麻烦。在此阶段,我仅考虑命令行程序。

现在,我邀请世界来纠正我,并告诉我我荒谬的思维思路中的所有错误。


酒的用于OS X的二进制等效是达林:darling.dolezel.info
strugee

Answers:


25

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

Linux和OS X之间的约定不同,因此相同的二进制文件不能按原样运行,而实质上没有大量依赖于操作系统的代码可以与其进行交互。其中许多东西都隐藏在库中,然后您需要链接这些库,这意味着您的程序需要可链接,并且两个系统之间的链接也有所不同。

如此下去。表面上听起来像做同样的事情在实际细节上有很大不同。


5
对于问题所在,这基本上是正确的,但问题实际上不是库(可以拖到后面),而是系统调用,这是对OS内核的请求。如果操作系统不提供兼容的系统调用接口,那么您很不走运。
mattdm 2011年

1
啊,太好了。这正是我所希望的建设性更正。谢谢一堆:D您能告诉我更多有关这些所谓的系统调用的信息,还是将我重定向到我可以了解更多有关它们的地方?
zec

3
它们不是“应该”的,而是实际的。:)这是一个好的开始:ibm.com/developerworks/linux/library/l-system-calls
mattdm

7
也就是说,您的“疯狂”想法并非完全不可能。只是很多工作。Wine项目本质上是用于在Linux(或OS X)上运行MS Windows二进制文件的项目。它为系统调用提供了一个转换层。wiki.winehq.org/...
mattdm

1
好吧,我认为这并不是完全不可能的,但是我也没想到它会像我描述的那样简单。我写这个问题是为了得到纠正。有时,这似乎比直接问“如何转换Linux二进制文件以在Mac OS上运行”之类的直接问题更为有效。另外,我不时使用葡萄酒,但是我以前从未真正考虑过葡萄酒的工作方式,我想现在应该去研究一下它。
zec

17

如果有人想花费足够的时间实现目标,这是可行的。该达林项目正在尝试这一点,但截至发稿时,它在一个相当原始的状态。

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

  • Solaris和UnixWare包含一个名为的帮助程序lxrun,其工作原理类似于sudo:将可执行文件的名称和参数传递给该帮助程序,它会动态修复问题,以便可执行文件可以与OS通讯。该官方网站(下降,存档链接)表示,它bitrotted

  • Linux的内核曾经具有一个称为iBCS的功能,它的功能与之相反,只是它不需要帮助程序,因为内核可以直接识别“外部”二进制文件。在内核2.3开发系列期间,陷入了严重的失修状态,这很可能是因为2.4发布之后,小型Unix服务器之争基本上已经结束。

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

    OpenBSD和NetBSD具有相似的功能。

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


2
对于Linux程序→其他平台来说,这不是什么大问题的原因之一是:没有重要的仅适用于Linux的应用程序没有可用的源。您想在OS X或Solaris上运行程序,重新编译它,然后就可以了。在使用特定于Linux的方式编写代码的地方可能需要做一些移植工作,但是通常这并不需要很多工作,特别是与维护兼容性层相比。当Netscape仅是用于Linux的二进制发行版时,FreeBSD的Linux兼容性大为退缩,并且可能仍用于Adobe Flash Player。
mattdm 2011年

@JörgW Mittag-同样,您需要具有其他平台上的系统库。这可能是他们针对AutoZone提起诉讼的基础。但老实说,我忘记了细节,不再关心。:)
mattdm 2011年

因此,您实质上的意思是,如果操作系统X提供与操作系统Y相同的服务,则二进制文件可以在两者下运行。的确如此,但是需要对系统X进行认真的努力。我不知道任何操作系统都可以通过这种方式与OS X兼容。
ThorbjørnRavn Andersen 2012年

烂 我将展示自己。
GnP 2014年

3

我几乎与所有人都同意,但是我想补充一点,尽管这将花费大量的时间和精力,但并不会比开发Wine花费的时间要多。

Wine开发中的许多困难之处在于,它们正在从封闭源操作系统中移植二进制格式,并且许多系统调用都未记录在案。他们必须对操作系统进行反向工程。

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

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


1

从技术上讲,它在macOS中是可行的,但并非没有很大的努力,尽管其中有些努力已经为我们完成。

  • macOS和更名的Red Hat Enterprise Linux均已通过UNIX 03认证。这意味着,原则上POSIX调用应具有相同的API。
  • macOS和Linux都将System V ABI用于amd64平台。这意味着对于amd64,macOS和Linux应该具有兼容的ABI和API。
  • macOS使用Mach-O作为其本机可执行文件格式,而Linux使用ELF。这确实使事情变得容易,因为可执行文件格式可用于区分是否应调用兼容性层。这将需要一些类似的东西binfmt_misc
  • 存在第三方macOS内核扩展,它提供了确切的功能。现在,我们有了一种加载说服macOS来加载ELF的方法,我们需要我们的特殊ld-linux.so文件,它本身就是Mach-O可执行文件,可以加载并运行ELF。

现在,我们至少需要一种ld-linux.so可以执行以下操作的特殊功能:

  • 成为Mach-O可执行文件或dyld本身,
  • 可以将Linux ELF文件加载到正确地址的内存中,
  • 希望具有以映射的Linux的soname到MACOS那些(实施例的能力/lib/libc.so.6/lib/libSystem.B.dylib)和负载相应Mach-O的当一个匹配ELF没有找到,所以我们可以重用的MacOS库

仅使用ELF之上的那种不会直接进行系统调用的加载程序,很有可能会工作,但是带有系统调用的ELF可能无法工作。第二个可能有用的组件是内核扩展,它可以捕获那些Linux系统调用并将它们映射到macOS系统调用。从桌面使用开始,需要特殊的台面实现才能将Linux图形调用映射到OpenGL.frameworkMetal.framework


0

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

我认为对您的问题的简单回答是:在MacOS上重新编译,如果您有时间,可以在MacOS上进行编译,并组成一个小组来提供功能-这将是一项耗时的工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.