Можно ли запускать исполняемые файлы COFF в UNIX или исполняемые файлы ELF в Windows? И каковы будут шаги, чтобы иметь возможность запускать файлы любого типа в Windows и UNIX. Мне просто любопытно.
COFF в Linux или ELF в Windows
Ответы (4)
Чтобы на самом деле запускать исполняемые файлы и делать из них полезные вещи, вам нужно беспокоиться об API, а не только о формате исполняемого файла. На машине Linux с установленной WINE вы можете запускать файлы Windows .EXE из командной строки, и они делают то же самое, что и в Windows.
Обратный путь на самом деле невозможен, однако, если вы установите CYGWIN на компьютере с Windows, а затем пересоберете приложение из исходного кода с помощью компиляторов CYGWIN, вы получите исполняемый файл, который работает в Windows и делает то же самое, что и исполняемый файл Linux на компьютере. Линукс. Многие стандартные инструменты Linux уже портированы и находятся в репозитории CYGWIN, включая X-Windows и GIMP.
Чтобы правильно ответить на ваш вопрос, уместно рассмотреть, что такое ELF, COFF и PE. Эти двоичные форматы, по сути, представляют собой просто контейнеры, которые дают указания операционной системе о том, как выполнять необработанные инструкции ЦП, содержащиеся в файле. Они очень похожи на аудио/видео контейнеры, такие как MKV, WMV и OGG. Поддержка исполняемого формата либо есть в операционной системе, либо нет. Microsoft Windows до недавнего времени постоянно не поддерживала COFF или ELF. В Windows 10 Microsoft предоставила косвенную поддержку ELF, встроив в ядро Windows системные процедуры, совместимые с UserMode-Linux. Ядро Linux UserMode работает поверх ядра Windows и запускает все двоичные форматы ELF почти так, как если бы оно работало независимо от MS Windows.
Альтернативой использованию UserMode-Linux (подядра) является переписывание Microsoft большей части API Linux в полностью совместимом формате. Их выбор решает еще одну проблему совместимости: API. «A» означает «Приложение», а «I» — «Интерфейс», однако API как интерфейс — это в основном просто набор исполняемых подпрограмм и предположений среды. Доступ к файловой системе и большинству основных системных процедур обеспечивается ядром Windows, в то время как все остальное предоставляется ядром UserMode Linux. Таким образом, Windows может не только запускать исполняемые файлы в формате ELF, но и запускать самые популярные исполняемые файлы ELF, которые уже созданы для работы с Linux API.
Обратное, другая половина вопроса, запуск PE (большинство исполняемых файлов Microsoft Windows) в Linux также возможен. Существуют две библиотеки оболочки времени выполнения, которые могут запускать MSIL (приложение виртуальной машины) и Win32 (обычное приложение ЦП). Поскольку ядро Linux расширяется для распознавания определенного формата байтов, а затем запускает соответствующую программу-оболочку, в действительности ядро поддерживает PE и потенциально более исполняемые форматы контейнеров. Таким образом, Linux может запускать некоторые программы PE либо в среде моно (приложения .NET/C#), либо в среде выполнения WINE (Win32 C/C++).
Чтобы установить среду UserMode-Linux, следуйте инструкциям на странице Сеть разработки Microsoft. Подвести итоги:
- Включите режим разработчика: Настройки | Обновление и безопасность | Для разработчиков | Проверьте переключатель Режим разработчика
- В меню «Пуск» откройте «Включение или отключение компонентов Windows».
- Прокрутите вниз и проверьте функцию «Подсистема Windows для Linux (бета)».
- Нажмите «ОК» и перезагрузите компьютер (обязательный шаг)
- После перезагрузки откройте PowerShell/командную строку и запустите «Bash» и следуйте простым инструкциям, чтобы принять лицензию Canonical и начать загрузку образа Ubuntu.
- После завершения загрузки вы сможете запустить «Bash в Ubuntu в Windows» из меню «Пуск».
Имейте в виду, что этот метод работает только в Windows 10 и по-прежнему ограничен консолью в текстовом режиме и портом Win32 Xorg, например vcXsrv, для чего-либо графического. Системы Cygwin или MSYS2 не могут запускать двоичные файлы ELF, но позволяют портировать и запускать те же приложения, которые обычно являются двоичными файлами ELF в системе Linux.
http://lbw.sourceforge.net/ работает лучше, чем строка. low был еще одним проектом, который делал то же самое, но он был менее рабочим.
РЕДАКТИРОВАТЬ: http://atratus.org/, кажется, делает то же самое, без необходимости иметь Interix/SFU .
COFF изначально был представлен UNIX (вокруг System V или около того), так что да, некоторые UNIX, вероятно, все еще поддерживают формат COFF. По крайней мере, какое-то время Linux устарел, и, по-видимому, большинство других Unices также устарели или полностью прекратили поддержку.
Поддержка Windows ELF немного более сомнительна - почти наверняка не без каких-то глубоких ухищрений. Вы должны быть более конкретными в том, что вы пытаетесь сделать здесь...