繁体   English   中英

Linux 可执行文件是否与 OS X“兼容”?

[英]Is a Linux executable “compatible” with OS X?

如果你在基于 Linux 的平台上用 C 编译一个程序,然后将它移植到使用 MacOS 库,它会工作吗?

来自编译器的核心机器代码在 Mac 和 Linux 上都兼容吗?

我问这个的原因是因为两者都是“基于 UNIX”的,所以我认为这是真的,但我不确定。

不,Linux 和 Mac OS X 二进制文件不能交叉兼容。

一方面,Linux 可执行文件使用一种称为ELF的格式。

Mac OS X 可执行文件使用Mach-O 格式

因此,即使许多库通常在每个系统上单独编译,它们也不会以二进制格式进行移植。

此外,Linux 实际上并不是基于 UNIX 的。 它确实与 UNIX 共享许多共同的特性和工具,但其中很多都与 POSIX 等计算标准有关。

综上所述,人们可以并且确实创造了非常酷的方法来处理交叉兼容性问题。

编辑:

最后,为了解决您对字节码的看法:在制作二进制文件时,编译器通常会生成特定于您正在开发的平台的机器代码 (情况并非总是如此,但通常如此。)

通常,您可以轻松地跨各种 Unix 品牌移植程序。 但是,您需要(至少)在每个平台上重新编译它。

可执行文件(二进制文件)在多个平台上不可用,因为可执行文件与操作系统的 ABI(应用程序二进制接口)紧密耦合,即应用程序如何与操作系统通信的约定。

例如,如果您的程序使用 POSIX write调用在控制台上打印一个字符串,则 ABI 指定:

  • 系统调用是如何完成的(Linux 过去在 x86 上调用 0x80 软件中断,现在它使用特定的sysenter指令)
  • 系统调用号
  • 函数的参数如何传输到系统
  • 任何类型的对齐
  • ...

这在操作系统之间有很大差异。

但是请注意,在某些情况下,可能会有“ABI 适配器”允许将一个操作系统的二进制文件运行到另一个操作系统上。 例如, Wine允许您在各种 Unix 版本上运行 Windows 可执行文件, NDISwrapper允许您在 Linux 上使用 Windows 网络驱动程序。

“字节码”通常是指由虚拟机执行的代码(例如对于 java 或 python)。 C被编译成机器码,CPU可以直接执行。 机器语言是特定于硬件的,因此它在英特尔芯片上运行的任何操作系统(甚至在 Windows 下)下都是相同的,但机器代码如何包装到可执行文件中的细节,以及它如何与系统调用集成动态链接库因系统而异。

所以不,您不能采用编译后的代码并在不同的操作系统中使用它。 (但是,有一些“交叉编译器”可以在一个操作系统上运行,但生成的代码可以在另一个操作系统上运行)。

没有“来自编译器的核心字节码”。 只有机器码

虽然相同的机器指令可能适用于多个操作系统(只要它们在相同的硬件上运行),托管的可执行文件远不止这些,而且由于 Linux 的编译和链接的本机可执行文件有很大不同BSD 或 Darwin 上的运行时和库要求,您将无法在另一个系统上运行一个二进制文件。

相比之下,Windows可执行文件有时可以在Linux下运行,因为Linux提供了用于Windows的PE格式的二进制格式加载程序,以及广泛的API实现(酒)。 原则上这个想法也可以在其他平台上使用,但我不知道有人为 Linux<->Darwin 写过这个。 如果您已经拥有源代码,并且它可以在 Linux 中编译,那么您也很有可能在 MacOS 下进行编译(当然是模 UI 组件)。

好吧,也许……但很可能不是。

但如果是这样,则不是“因为两者都是 UNIX”,而是因为:

  • Mac 电脑现在碰巧使用相同的处理器(这在过去非常不同)
  • 您碰巧使用了一个完全不依赖任何库的程序(不太可能)
  • 您碰巧使用相同的运行时库
  • 您碰巧使用了与两者兼容的加载程序/二进制格式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM