1

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

#include <stdio.h>
int main(void) {
    printf("Hello World");
    return 0;
}
4

1 回答 1

2
  1. 首先,动态库不是唯一特定于操作系统的部分,启动代码是静态链接的并且是特定于 OS X/Linux 的。
  2. OS X 二进制文件是 macho,Linux 需要 ELF。
  3. 即使它是 ELF,也需要修补一个 ELF 标识符,以使 dyn 加载程序甚至考虑它。
  4. 系统调用可能是内联的。(man 2 用法),与 OS X libc 头文件中的 FD 集宏和许多其他宏相同。
  5. 调用约定可能不同(
    • 注册使用
    • 堆栈对齐
    • 在寄存器中传递小结构。

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

一般来说,POSIX 是一个源代码兼容性概念,而不是二进制概念。所以不,这是不可能的,或者只有在不可行的约束要求下。例外是诸如 BSD 系统上的 Linuxator 之类的东西。

于 2016-02-27T22:08:45.977 回答