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

时间:2015-11-20 16:37:58

标签: linker cross-compiling emulation wine objcopy

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

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

1 个答案:

答案 0 :(得分:2)

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

    通常,POSIX是源兼容性概念,而不是二进制概念。所以不,这是不可能的,或者只是在不可行的约束要求下。