是否可以 运行 为一个操作系统构建的可执行文件在另一个操作系统上?

Is it possible to run an executable built for one operating system on another?

我知道 Wine/Darling 和其他兼容层,但我想知道是否可以(例如)这样:
1. 在 OS X.
上构建一个简单的 hello_world.c 程序 2. 使用 objcopy/objconv/some 其他工具,将机器代码复制到 Linux 可执行文件中,并将对 OSX libc 的调用替换为对 glibc 的调用。如果它是动态链接到其他 OSX 库的另一个可执行文件,请复制这些库。
3. 运行 Linux 上的程序,假设它有效。
例子 hello_world.c:

#include <stdio.h>
int main(void) {
    printf("Hello World");
    return 0;
}
  1. 首先,动态库不是唯一OS特定的部分,启动代码是静态链接的并且OS X/Linux特定的。
  2. OS X 二进制文件是 macho,Linux 需要 ELF。
  3. 即使是 ELF,也有一个 ELF 标识符需要修补才能使 dyn 加载器甚至考虑它。
  4. 系统调用可能是内联的。 (man 2 用法),与 OS X libc headers.
  5. 中的 FD 设置宏和许多其他宏相同
  6. 调用约定可能不同 (
    • 注册使用
    • 堆栈对齐
    • 在寄存器中传递小结构。

等等,等等。在这种情况下,例如OS X 使用 AIX ABI,Linux SysV。 )

总的来说,POSIX 是一个源兼容性概念,而不是二进制的。所以不,这是不可能的,或者只能在不可行的约束要求下。例外情况是 BSD 系统上的 Linuxator。