Linux 可执行文件是否与 OS X “兼容”?
- 2024-10-30 08:35:00
- admin 原创
- 65
问题描述:
如果您在基于 Linux 的平台上用 C 语言编译一个程序,然后移植它以使用 MacOS 库,它会起作用吗?
来自编译器的核心机器代码是否与 Mac 和 Linux 兼容?
我之所以问这个问题是因为两者都是“基于 UNIX”的,所以我认为这是正确的,但我不太确定。
解决方案 1:
不,Linux 和 Mac OS X 二进制文件不交叉兼容。
首先,Linux 可执行文件使用一种称为ELF 的格式。
Mac OS X 可执行文件使用Mach-O 格式。
因此,即使许多库通常在每个系统上单独编译,它们也无法以二进制格式移植。
此外,Linux 实际上并非基于 UNIX。它确实与 UNIX 共享许多共同的功能和工具,但其中很多都与 POSIX 等计算标准有关。
尽管如此,人们可以而且确实创造了非常酷的方法来解决交叉兼容性问题。
编辑:
最后,关于字节码的问题:在制作二进制文件时,编译器通常会生成特定于您正在开发的平台的机器代码。(情况并非总是如此,但通常如此。)
解决方案 2:
一般情况下,你可以很容易地跨各种 Unix 品牌移植程序。但是你(至少)需要在每个平台上重新编译它。
可执行文件(二进制文件)无法在多个平台上使用,因为可执行文件与操作系统的 ABI(应用程序二进制接口)紧密耦合,即应用程序与操作系统通信的约定。
例如,如果您的程序使用 POSIX 调用将字符串打印到控制台write
,则 ABI 指定:
系统调用是如何完成的(Linux 过去在 x86 上调用 0x80 软件中断,现在使用特定
sysenter
指令)系统调用号
函数的参数如何传输到系统
任何类型的对齐
...
并且这在不同的操作系统中存在很大的差异。
但请注意,在某些情况下,可能会有“ABI 适配器”允许将一个操作系统的二进制文件运行在另一个操作系统上。例如,Wine允许您在各种 Unix 版本上运行 Windows 可执行文件,NDISwrapper允许您在 Linux 上使用 Windows 网络驱动程序。
解决方案 3:
“字节码”通常是指虚拟机执行的代码(例如 Java 或 Python)。C 被编译为机器代码,CPU 可以直接执行。机器语言是特定于硬件的,因此在英特尔芯片上运行的任何操作系统(甚至在 Windows 下)下都是相同的,但机器代码如何包装成可执行文件以及如何与系统调用和动态链接库集成的细节因系统而异。
因此,您不能将编译后的代码用于不同的操作系统。(但是,有些“交叉编译器”可以在一个操作系统上运行,但生成的代码却可以在另一个操作系统上运行)。
解决方案 4:
不存在“来自编译器的核心字节码”。只有机器码。
虽然相同的机器指令可能适用于多种操作系统(只要它们在同一硬件上运行),但托管可执行文件的内容远不止于此,而且由于 Linux 的编译和链接的本机可执行文件与 BSD 或 Darwin 的运行时和库要求非常不同,因此您无法在另一个系统上运行一个二进制文件。
相比之下,Windows 二进制文件有时可以在 Linux 下执行,因为 Linux 既提供了适用于 Windows PE 格式的二进制格式加载器,也提供了广泛的 API 实现(Wine)。原则上,这个想法也可以在其他平台上使用,但我不知道有人为 Linux<->Darwin 编写过这个。如果您已经拥有源代码,并且它在 Linux 中编译,那么您很有可能在 MacOS 下编译它(当然是模块化 UI 组件)。
解决方案 5:
嗯,也许吧...但很可能不是。
但如果确实如此,那并不是“因为两者都是 UNIX”,而是因为:
如今,Mac 电脑恰好使用相同的处理器(这在过去是非常不同的)
你碰巧使用了一个完全不依赖任何库的程序(可能性很小)
你恰好使用相同的运行时库
您恰好使用了与两者兼容的加载器/二进制格式。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件