Могу ли я запустить Windows .exe файл в Linux? [Дубликат]

12

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

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

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

Варун Джанга
источник

Ответы:

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
Thariama
источник
11

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

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

Angus
источник
2
Этот ответ правильный. Это не единственная причина (различные загрузчики и исполняемые форматы также являются ключевыми), но это одна из них.
Мэтью Флэшен
2
Это одна из основных причин, по которой нельзя запускать один и тот же исполняемый файл в разных операционных системах.
1
@Let_Me_Be: На самом деле ваш комментарий не верный.
0xA3
1
@ 0xA3 Если вы обращаетесь к API для конкретной платформы, тогда да. Но по большей части это на самом деле не так. Переопределение стандартной библиотеки C или C ++ на самом деле очень просто, вам просто нужно заново реализовать ошибки и перенаправить вызовы. Требуется много работы, это другой формат файла (и API для конкретной платформы, поскольку они должны быть переопределены с нуля).
Let_Me_Be
2
@ Пусть я никогда не говорил, что ты должен. Я указывал, что вы сказали «по большей части», программы не используют API-интерфейсы для конкретной платформы; на самом деле, большинство делают . Даже программы, использующие кроссплатформенные библиотеки, такие как GTK, по-прежнему косвенно используют API-интерфейсы для конкретной платформы.
Мэтью Флэшен
8

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

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

Пол Уилан
источник
Пол @ Я не хочу вина ... Я говорю о программировании ... после того, как я получу исполняемый файл после компиляции. может ли этот исполняемый файл работать как в Windows, так и в Linux
1
Статья в Википедии дает подробные сведения о том, почему требуется WINE.
Пол Уилан
1

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

mono myapp.exe

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

Лукаш Мадон
источник
1

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

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

t3mujin
источник