[英]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 指定:
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”,而是因为:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.