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


Вопрос:

почему Windows exe не работает на Linux?

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

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

15
задан Varun Janga
12.03.2023 12:29 Количество просмотров материала 2827
Распечатать страницу

7 ответов

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

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

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

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

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

wine xxx.exe

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

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

вы хотите изменить разрешения, чтобы разрешить всем пользователям execute этот файл (a+x). вы также можете разрешить только пользователю еxecute (u+x)

chmod a+x xxx.exe

запуск программы ./ указывает командной строке искать текущий путь к исполняемому файлу (если "текущий" каталог не находится в переменной среды $PATH.

./xxx.exe
13
отвечен Thariama 2023-03-13 20:17

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

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

11
отвечен Angus 2023-03-13 22:34

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

8
отвечен Nico Huysamen 2023-03-14 00:51

есть три основных причины .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, легче перекомпилировать, а не идти по пути вина обеспечения бинарно-совместимого слоя. Это не является невозможным обеспечьте вин-подобный уровень совместимости, однако Cygwin's way более надежен, и просто не так много диска, чтобы позволить программе Linux с открытым исходным кодом легко переноситься в Windows.

  2. другой исполняемый формат. Windows использует ПЭ (переносимый исполняемый) формат и использует Linux эльф (исполняемый и linkable формат). Формат исполняемого файла содержит метаданные и определяет способ загрузки и выполнения исполняемого файла платформой.

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

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

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

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

1 безопасность файловой системы приходит на ум, нет никакого способа перевести между битами безопасности Linux и NTFS Windows СПИСОК КОНТРОЛЯ ДОСТУПА.

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

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

5
отвечен Lie Ryan 2023-03-14 03:08

возможен поиск wine

1
отвечен Paul Whelan 2023-03-14 05:25

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

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

1
отвечен t3mujin 2023-03-14 07:42

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

mono myapp.exe

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

0
отвечен Lukasz Madon 2023-03-14 09:59

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх