Можно ли запустить исполняемый файл, созданный для одной операционной системы, в другой?

Я знаю о Wine/Darling и других слоях совместимости, но мне было интересно, возможно ли это (например) таким образом:
1. Создайте простую программу hello_world.c в OS X.
2. Используя objcopy/ objconv/некоторый другой инструмент, скопируйте машинный код в исполняемый файл Linux и замените вызов OSX libc вызовом glibc. Если это другой исполняемый файл, динамически связанный с другими библиотеками OSX, скопируйте библиотеки.
3. Запустите программу в Linux, предполагая, что она работает.
Пример hello_world.c:

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

person Mitsos101    schedule 20.11.2015    source источник


Ответы (1)


  1. Во-первых, динамическая библиотека — не единственная часть, специфичная для ОС, код запуска статически связан и специфичен для OS X/Linux.
  2. Двоичный файл OS X — мачо, Linux требует ELF.
  3. Даже если бы это был ELF, есть идентификатор ELF, который нужно пропатчить, чтобы dyn-загрузчик вообще его учитывал.
  4. системные вызовы могут быть встроенными. (использование man 2), то же самое с макросами набора FD и многими другими макросами в заголовках OS X libc.
  5. the calling conventions might be different (
    • register usage
    • выравнивание стека
    • прохождение мелких структур в реестрах.

и т.д. В этом случае, например. OS X использует AIX ABI и Linux SysV. )

В общем, POSIX — это концепция совместимости исходного кода, а не бинарная. Так что нет, это невозможно или только при невыполнимых ограниченных требованиях. Исключениями являются такие вещи, как Linuxator в системах BSD.

person Marco van de Voort    schedule 27.02.2016