是否可以 运行 为一个操作系统构建的可执行文件在另一个操作系统上?
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;
}
- 首先,动态库不是唯一OS特定的部分,启动代码是静态链接的并且OS X/Linux特定的。
- OS X 二进制文件是 macho,Linux 需要 ELF。
- 即使是 ELF,也有一个 ELF 标识符需要修补才能使 dyn 加载器甚至考虑它。
- 系统调用可能是内联的。 (man 2 用法),与 OS X libc headers.
中的 FD 设置宏和许多其他宏相同
- 调用约定可能不同 (
- 注册使用
- 堆栈对齐
- 在寄存器中传递小结构。
等等,等等。在这种情况下,例如OS X 使用 AIX ABI,Linux SysV。
)
总的来说,POSIX 是一个源兼容性概念,而不是二进制的。所以不,这是不可能的,或者只能在不可行的约束要求下。例外情况是 BSD 系统上的 Linuxator。
我知道 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;
}
- 首先,动态库不是唯一OS特定的部分,启动代码是静态链接的并且OS X/Linux特定的。
- OS X 二进制文件是 macho,Linux 需要 ELF。
- 即使是 ELF,也有一个 ELF 标识符需要修补才能使 dyn 加载器甚至考虑它。
- 系统调用可能是内联的。 (man 2 用法),与 OS X libc headers. 中的 FD 设置宏和许多其他宏相同
- 调用约定可能不同 (
- 注册使用
- 堆栈对齐
- 在寄存器中传递小结构。
等等,等等。在这种情况下,例如OS X 使用 AIX ABI,Linux SysV。 )
总的来说,POSIX 是一个源兼容性概念,而不是二进制的。所以不,这是不可能的,或者只能在不可行的约束要求下。例外情况是 BSD 系统上的 Linuxator。