11

Связанный вопрос:
Почему windows exe не работает на Linux?

Может ли файл Windows .exe быть запущен в Linux?

Если будет использована та же архитектура, будет ли это возможно? Например, если обе программы работают на архитектуре X86, возможно ли будет запустить Windows .exe на Linux?

7 ответов7

13

Exe-файл будет выполняться под Linux или Windows, но не одновременно.

Выполняется под Windows

Если файл является файлом Windows, он не будет работать под Linux самостоятельно. Так что, если это так, вы можете попробовать запустить его в слое совместимости с Windows (Wine). Если он не совместим с Wine, вы не сможете выполнить его под Linux.

Прежде чем начать, вам нужно будет установить Wine. Шаги, необходимые для установки Wine, зависят от платформы Linux, на которой вы работаете. Вы можете, вероятно, Google "Ubuntu установить Wine", если, например, вы устанавливаете Ubuntu.

После того, как вы установили Wine, вы сможете выполнять эти команды.

wine xxx.exe

Выполнить под Linux

Если вы знаете, что этот файл запускается под Linux, то вам нужно выполнить следующие команды:

Вы хотите изменить права доступа , чтобы разрешить всем пользователям электронной х ecute этот файл (а + х). Вы могли бы также позволить только пользователю е х ecute (и + х)

chmod a+x xxx.exe

Запустите программу, ./ командную строку искать в текущем пути файл для выполнения (если директория 'current' отсутствует в переменной окружения $ PATH.

./xxx.exe
11

Операционная система (Windows или Linux) предоставляет сервисы приложениям. Например, в Windows и Linux будут функции, которые приложение может вызывать для доступа к файлам, для доступа к сети, для отображения объектов на экране и т.д.

Разные операционные системы предоставляют разные способы выполнения этих задач, поэтому приложение, которое делает это в стиле Windows, не будет работать в Linux, и наоборот, даже если архитектура ЦП одинакова.

8

Нет, разные операционные системы используют разные форматы (т.е. Windows использует PE, в то время как Linux использует ELF). Кроме того, при компиляции ваша программа выполняет вызовы собственных методов ОС. Как уже упоминалось, вы можете посмотреть на использование вина. Он обеспечивает большую функциональность для запуска бинарных файлов Windows в Linux.

5

Существуют три основные причины, по которым файлы .exe не запускаются напрямую в Linux и почему исполняемый файл Linux не запускается напрямую в Windows.

  1. Первый - это Системные вызовы. Системные вызовы почти по определению зависят от платформы. Однако не все системные вызовы выполняются одинаково. Существуют переносимые системные вызовы (например, определенные стандартной библиотекой C/C++) и непереносимые системные вызовы (например, определенные POSIX или Microsoft). Приложения, которые статически связаны во время компиляции с системными библиотеками, обнаружат, что часть кода, которая статически включена, вероятно, не будет иметь шансов на правильное выполнение на целевой платформе из-за сильно отличающегося дизайна платформы. Приложения, которые динамически связаны во время выполнения, могут работать с несколькими условиями: если это переносимые системные вызовы, существует таблица перевода между системными вызовами исходных двоичных файлов и системными вызовами целевой платформы; если это непереносимый системный вызов, должен быть слой совместимости, который принимает системные вызовы исходной платформы и находит эквивалентный перевод в целевой платформе (что не всегда возможно 1, разные платформы имеют разный набор функций, а некоторые особенность не имеет смысла в другой платформе 2).

    Решение: для запуска программы Windows в Linux Wine предоставляет реализацию системных вызовов Windows и системных библиотек Windows, а также распознает формат PE; Wine может запускать программы Windows в Linux без перекомпиляции. Для программы Linux в Windows Cygwin обеспечивает реализацию системных вызовов POSIX в Windows и позволяет перекомпилировать программу, написанную для Linux, с использованием Cygwin GCC для запуска в системе Windows без изменений исходного кода. Из-за природы большинства программ для Linux с открытым исходным кодом легче перекомпилировать, чем использовать Wine для обеспечения бинарно-совместимого уровня. Обеспечить уровень совместимости с вином не исключено, однако способ Cygwin более надежен, и не так уж много места для того, чтобы можно было легко перенести программу Linux с открытым исходным кодом в Windows.

  2. Другой - это Исполняемый формат. Windows использует формат PE (переносимый исполняемый файл), а Linux использует формат ELF (исполняемый и связываемый). Формат исполняемого файла содержит метаданные и определяет, как исполняемый файл должен загружаться и выполняться платформой.

    Решение: вполне возможно написать конвертер PE -> ELF или ELF -> PE; и это, вероятно, не должно быть слишком сложно сделать (предупреждение: я не знаком с фактическим форматом любого из них). Другой способ - написать исполняемый загрузчик, который может понимать PE-файлы (например, Wine предоставляет один) или исполняемый загрузчик, который может понимать ELF-файл (я считаю, что дизайн Windows ограничивает возможность запуска файла с двойным щелчком мыши в качестве исполняемого файла)

  3. Соглашение о системных вызовах. Linux и Windows не только имеют различный набор доступных системных вызовов, но также имеют совершенно другое соглашение о системных вызовах. В Linux для выполнения системного вызова вы передаете номер системного вызова в регистре eax/rax и аргументы в остальных регистрах, а затем делаете запрос прерывания 0x80. В DOS вы также передаете аргументы в регистр, однако для каждой системной службы существует отдельный номер запроса прерывания, поэтому вы не передаете номер системного вызова в eax/rax. Windows NT больше похожа на Linux, однако вместо 0x80 вы генерируете запрос прерывания 0x2E, однако номер системного вызова по-прежнему отличается (поэтому вам нужна таблица преобразования номеров системных вызовов и, возможно, уровень совместимости).

    Решение: Даже если у вас нет самоизменяющегося кода или вы пытаетесь выполнить данные в виде кода или делать другие хитрые коды, все равно очень сложно (так же сложно, как решить проблему остановки) проанализировать исполняемый файл, выполнить поиск по всей системе. вызывает запросы на прерывание и переводит их в системные вызовы целевой платформы. Более простым способом является предоставление службы времени выполнения, которая обрабатывает запросы прерываний программы и перенаправляет их на системные вызовы целевой платформы 3.

Существуют и другие причины, но я считаю, что эти три являются серьезным камнем преткновения.

1 Вспоминается безопасность файловой системы, нет способа преобразовать биты безопасности Linux в ACFS Windows NTFS.

2 Windows не может обработать процесс; CreateProcess может использоваться для эмуляции fork, однако он теряет семантику копирования при записи. В Windows невозможно создать процесс копирования при записи.

3 Я верю, что это делает Wine

1

Возможен поиск вина

1

Единственный способ запуска исполняемых файлов в Win, Linux (или даже Mac)- это наличие своего рода "виртуального слоя" между директивами сборки и ОС, вариант lukas запустить его под Mono - это один из способов, точно так же, как создание Java файл (или даже Adobe Air).

Построение двоичных файлов, которые работают, как, впрочем, и на нескольких архитектурах, невозможно, поскольку машинный код сильно привязан к ОС и даже к оборудованию, вам может потребоваться выполнить несколько сборок для каждой системы / ОС.

0

Только если это файл .Net .exe. Я сделал приложение в VS и скомпилировал под Windows, затем я запустил его на Linux

mono myapp.exe

Я знаю, что это не совсем то, что вы ищете, но ответ таков: вы можете запускать некоторые исполняемые файлы в Linux.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .