Почему Windows EXE не работает на Linux?


29

Я не спрашиваю о том, как заставить Windows exe работать в Linux.

Я спрашиваю, ПОЧЕМУ это не работает.

Чем отличается способ запуска исполняемого файла в Windows и запуска исполняемого файла в Linux? Почему они должны быть разными? Кроме того, почему исполняемые файлы Linux не имеют расширения файла?


Ответы:


45

Исполняемые файлы Linux и Windows используют разные форматы. Linux использует формат ELF на большинстве архитектур, в то время как Windows использует формат PE . ELF лучше подходит для того, как Linux управляет общими библиотеками, а PE лучше подходит для того, как Windows управляет общими библиотеками, но нет фундаментальной причины, по которой Linux не может выполнять исполняемые файлы PE или исполняемые файлы Windows ELF. Фактически, Linux может выполнять PE-исполняемые файлы через Wine .

Сложность состоит в том, что Windows и Linux имеют совершенно разные API : у них разные интерфейсы ядра и наборы библиотек. Таким образом, чтобы фактически запустить приложение Windows, Linux должен был эмулировать все вызовы API, которые делает приложение. Это много работы. Wine делает это в некоторой степени, но это очень сложно, тем более что производитель Windows не сотрудничает. Вы можете сравнить его, скажем, с изучением английского языка, когда ваш родной язык - китайский: исполняемый формат - алфавит (его не так сложно освоить), API - это словарь (требуются годы, чтобы достичь уровня, на котором вы можете начать читать литературу ).


9
«Словарь» - отличная аналогия.
Приостановлено до дальнейшего уведомления.

Я думаю, что вы имели в виду совсем другое .
Мирча Chirea

Android также поддерживает бинарные файлы Linux (не пакеты), если они скомпилированы для ARM, потому что он основан на Linux
Suici Doga

@SuiciDoga Вроде, но это сложнее, чем это. Ядро Android может запускать двоичные файлы Linux (если они скомпилированы для правильного ABI ядра, например, с использованием регистров NEON), но если вы хотите запускать динамически связанные программы, вам также необходимо установить все библиотеки. (И если вы сделаете это, вы также можете установить менеджер пакетов, так что «бинарные файлы, но не пакеты» на самом деле не соответствуют действительности.)
Жиль «ТАК - перестать быть злым»

Да, я знаю о том, что вы должны изменить путь к библиотеке и т. Д.
Suici Doga

14

Двоичные файлы Windows имеют другой ABI и используют другой API, чем двоичные файлы Linux.

Двоичные файлы Linux не нуждаются в расширении, поскольку * nix использует биты разрешения для идентификации исполняемого файла вместо расширения.


1
Согласитесь с ответом ... дополнительная часть данных, которые могут иметь отношение: ELF ( en.wikipedia.org/wiki/Executable_and_Linkable_Format ) против PE ( en.wikipedia.org/wiki/PE_executable )
RobotHumans

Ах да, для этого нужен другой загрузчик. en.wikipedia.org/wiki/Loader_%28computing%29
Игнасио Васкес-Абрамс

Мне особенно нравится вторая часть информации, отсутствующая в ответе @Gilles.
Тимоти Гу

@ IgnacioVazquez-Abrams Это очень интересно. Что если я скажу вам, что я просто запускаю Windows-игру PlantsVsZombies.exe на Ubuntu 16.04 Linux изначально? Я просто сделал это от скуки, зная, что он не запустится, но он это сделал, и я мог играть на нем отлично. Это как невозможно, потому что для запуска этой игры нужно сначала запустить API API, а это явно не нужно. Как это запустить ??? Должен ли я сделать новый вопрос для этого?
Никос

@ RestlessC0bra: Вино и Моно это вещи.
Игнасио Васкес-Абрамс

0

Вот как я слышал, что сторона окон объясняла программистам в терминах непрофессионалов.

В Windows есть хуки в программах и ОС, которые Exe делает вызовы, которых просто нет в Linux. Из-за различий в обеих средах. Первоначально Linux ищет разрешения, Windows сначала ищет связываемый формат, проверяя расширение, просматривая свойства, затем заглядывая в файл Exe и т. Д.

Существуют такие приложения, как Netbackup, которые были запущены в linux и были модифицированы для работы в среде Windows без использования Wine IMHO, часто это одни из самых стабильных приложений Windows с лучшим поведением.

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


2
Каким-то образом я хотел бы верить, что Билл Гейтс ответил на мой вопрос ;-)
Nav
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.