Чи можна запустити файл Windows .exe в Linux? [дублікат]


12

Пов'язане запитання:
Чому Windows Exe не працює в Linux?

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

Якщо буде використана та сама архітектура, чи буде це можливо? Як, якщо обидві програми працюють на архітектурі X86, чи вдасться запустити Windows .exeна Linux?

Відповіді:


13

Файл EXE виконується або під Linux або Windows, але не з обох.

Виконує під Windows

Якщо файл - це файл Windows, він не запускається під Linux самостійно. Тож якщо це так, ви можете спробувати запустити його під шаром сумісності Windows (Wine). Якщо воно не сумісне з вином, ви не зможете виконати його під Linux.

Перш ніж почати, вам потрібно буде встановити Wine. Кроки, необхідні для встановлення Wine, залежать від платформи Linux, на якій ви перебуваєте. Ви можете, ймовірно, Google "Ubuntu встановити вино", якщо, наприклад, ви встановлюєте Ubuntu.

Як тільки ви встановите вино, ви зможете виконати ці команди.

wine xxx.exe

Виконати під Linux

Якщо ви знаєте, що цей файл запускається під Linux, ви хочете виконати ці команди:

Ви хочете змінити дозвіл , щоб дозволити всім користувачам електронного х ecute цього файлу (а + х). Ви також можете дозволити користувачеві e x ecute (u + x)

chmod a+x xxx.exe

Запустіть програму, ./вказує командному рядку шукати поточний шлях для виконання файлу (якщо каталог "current" відсутній у змінній середовища $ PATH.

./xxx.exe

11

Операційна система (Windows або Linux) надає послуги додаткам. Наприклад, Windows та Linux матимуть функції, які програма може викликати для доступу до файлів, доступу до мережі, відображення речей на екрані тощо.

Різні операційні системи пропонують різні способи виконання цих дій, тому додаток, який виконує це в Windows, не працюватиме в Linux, і навпаки, хоча архітектура процесора однакова.


2
Ця відповідь правильна. Це не єдина причина (різні завантажувачі та виконавчі формати також є ключовою), але це одна з них.
Метью Флашен

2
Це одна з головних причин того, що ви не можете мати один і той же виконуваний файл в різних операційних системах.

1
@Let_Me_Be: Насправді ваш коментар невірний.
0xA3

1
@ 0xA3 Якщо ви отримуєте доступ до API для платформи, то так. Але здебільшого це насправді не так. Повторна реалізація стандартної бібліотеки C або C ++ насправді дуже проста, потрібно просто повторно реалізувати помилки та переадресувати дзвінки. Багато роботи вимагає різного формату файлів (і API, визначеного для платформи, оскільки їх потрібно повторно застосовувати з нуля).
Šimon Tóth

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; Вино може запускати програму Windows в Linux без перекомпіляції. Для програми Linux в Windows Cygwin забезпечує реалізацію викликів POSIX System в Windows, і дозволяє програму, написану для Linux, перекомпілювати за допомогою Cygwin GCC для запуску в системі Windows без змін вихідного коду. Зважаючи на характер відкритого коду більшості програм Linux, простіше перекомпілювати, а не піти шляхом вин забезпечення бінарного сумісного шару. Забезпечити винний шар сумісності не неможливо, однак спосіб Cygwin є більш надійним, і просто не так багато приводу, щоб дозволити програмі Linux з відкритим кодом легко переноситися на Windows.

  2. Інший - виконуваний формат. Windows використовує формат PE (Portable Executable), а Linux використовує ELF (Executable and Linkkable Format). Формат, що виконується, містить метадані та визначає, як виконуваний файл повинен завантажуватися та виконуватись платформою.

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

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

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

Є й інші причини, але я вважаю, що ці три є великим каменем спотикання.

1 на думку про безпеку файлової системи, немає можливості перекладати між бітами безпеки Linux і NTFS ACL для Windows.

2 Windows не може розблокувати процес; CreateProcess можна дещо використовувати для імітації вилки, проте вона втрачає семантичну копію під час запису. Немає способів створити процес копіювання під час запису в Windows.

3 Я вважаю, що Вино робить це


1

Можливий пошук вина


paul @ я не хочу вина ... я говорю про програмування ... після того, як я отримаю виконуваний файл після компіляції. Чи може цей виконуваний файл працювати як у вікні, так і в Linux

1
Стаття у Вікіпедії дає детальну інформацію про те, чому потрібно ВИНО.
Пол Уілан

1

Тільки якщо це файл .Net .exe. Я зробив додаток у VS і компілював під Windows, потім запустив його в Linux

mono myapp.exe

Я знаю, що це не саме те, що ви шукаєте, але відповідь полягає в тому, що ви можете запустити деякі файли EXE в Linux.


1

Єдиний спосіб запустити виконувані файли на Win, Linux (або навіть Mac) - це мати якийсь "віртуальний рівень" між директивами про збірку та ОС, варіант " Лукас " запустити його під Mono - це єдиний спосіб, як і побудова Java файл (або навіть Adobe Air).

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.