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
Нет, разные операционные системы используют разные форматы (т. Е. Windows использует PE, а Linux использует ELF). Кроме того, при компиляции ваша программа выполняет вызовы собственных методов ОС. Как уже упоминалось, вы можете посмотреть на использование WINE . Он обеспечивает большую функциональность для запуска бинарных файлов Windows в Linux.
источник
Существует три основных причины, по которым файлы .exe не запускаются напрямую в Linux и почему исполняемый файл Linux не запускается напрямую в Windows.
Первый - это Системные вызовы. Системные вызовы почти по определению зависят от платформы. Однако не все системные вызовы выполняются одинаково. Существуют переносимые системные вызовы (например, определенные стандартной библиотекой 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.
Другой - это Исполняемый формат. Windows использует формат PE (переносимый исполняемый файл), а Linux использует формат ELF (исполняемый и связываемый). Формат исполняемого файла содержит метаданные и определяет, как исполняемый файл должен загружаться и выполняться платформой.
Решение: вполне возможно написать конвертер PE -> ELF или ELF -> PE; и это, вероятно, не должно быть слишком сложно сделать (предупреждение: я не знаком с фактическим форматом любого из них). Другой способ - написать исполняемый загрузчик, который может понимать PE-файлы (например, Wine предоставляет один) или исполняемый загрузчик, который может понимать ELF-файл (я считаю, что дизайн Windows ограничивает возможность запуска файла с двойным щелчком мыши в качестве исполняемого файла)
Соглашение о системных вызовах. 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
источник
Возможен поиск вина
источник
Только если это файл .Net .exe. Я сделал приложение в VS и скомпилировал под Windows, затем запустил его на Linux
Я знаю, что это не совсем то, что вы ищете, но ответ таков: вы можете запускать некоторые исполняемые файлы в Linux.
источник
Единственный способ запуска исполняемых файлов в Win, Linux (или даже Mac) - это наличие своего рода «виртуального слоя» между директивами сборки и ОС, вариант lukas запустить его под Mono - это один из способов, точно так же, как создание Java файл (или даже Adobe Air).
Построение двоичных файлов, которые работают, как, впрочем, и на нескольких архитектурах, невозможно, поскольку машинный код сильно привязан к ОС и даже к оборудованию, вам может потребоваться выполнить несколько сборок для каждой системы / ОС.
источник