Czy mogę uruchomić plik .exe systemu Windows w systemie Linux? [duplikować]

12

Powiązane pytanie:
Dlaczego system Windows nie działa w systemie Linux?

Czy .exeplik systemu Windows można uruchomić w systemie Linux?

Jeśli zastosowana zostanie ta sama architektura, czy będzie to możliwe? Na przykład, jeśli oba programy działają w architekturze X86, czy będzie możliwe uruchomienie systemu Windows .exew systemie Linux?

Varun Janga
źródło

Odpowiedzi:

13

Plik exe zostanie uruchomiony w systemie Linux lub Windows, ale nie w obu przypadkach.

Wykonuje się w systemie Windows

Jeśli plik jest plikiem systemu Windows, nie będzie działał sam w systemie Linux. W takim przypadku możesz spróbować uruchomić go pod warstwą kompatybilności z Windows (Wine). Jeśli nie jest kompatybilny z winem, nie będzie można go uruchomić pod Linuksem.

Zanim zaczniesz, musisz zainstalować Wine. Kroki, które musisz zainstalować Wine będą się różnić w zależności od platformy Linux, na której jesteś. Prawdopodobnie możesz Google „Ubuntu zainstalować wino”, jeśli na przykład instalujesz Ubuntu.

Po zainstalowaniu wina będziesz mógł wykonać te polecenia.

wine xxx.exe

Wykonaj w systemie Linux

Jeśli znasz ten plik do działania w systemie Linux, będziesz chciał wykonać następujące polecenia:

Będziemy chcieli, aby zmienić uprawnienia, aby umożliwić wszystkim użytkownikom do E x ecute tego pliku (a + x). można też pozwolić tylko użytkownikowi e x ecute (u + x)

chmod a+x xxx.exe

Po uruchomieniu programu ./polecenie wiersza poleceń szuka w bieżącej ścieżce pliku do wykonania (jeśli katalogu „bieżący” nie ma w zmiennej środowiskowej $ PATH).

./xxx.exe
Thariama
źródło
11

System operacyjny (Windows lub Linux) zapewnia usługi dla aplikacji. Na przykład Windows i Linux będą miały funkcje, które aplikacja może wywoływać w celu uzyskania dostępu do plików, dostępu do sieci, wyświetlania rzeczy na ekranie itp.

Różne systemy operacyjne zapewniają różne sposoby wykonywania tych czynności, więc aplikacja działająca w systemie Windows nie będzie działać w systemie Linux i odwrotnie, nawet jeśli architektura procesora jest taka sama.

Angus
źródło
2
Ta odpowiedź jest poprawna. To nie jedyny powód (różne moduły ładujące i formaty plików wykonywalnych są również kluczowe), ale jest to jeden z nich.
Matthew Flaschen
2
Jest to jeden z głównych powodów, dla których ten sam plik wykonywalny nie działa natywnie w różnych systemach operacyjnych.
1
@Let_Me_Be: W rzeczywistości twój komentarz jest nieprawidłowy.
0xA3,
1
@ 0xA3 Jeśli uzyskujesz dostęp do interfejsu API specyficznego dla platformy, to tak. Ale w przeważającej części nie jest to prawdą. Ponowne wdrożenie standardowej biblioteki C lub C ++ jest w rzeczywistości bardzo proste, wystarczy ponownie zaimplementować błędy i przekierować wywołania. Dużo pracy zajmuje inny format pliku (i interfejsy API specyficzne dla platformy, ponieważ trzeba je zaimplementować od nowa).
Šimon Tóth,
2
@Let, nigdy nie mówiłem, że powinieneś. Wskazałem, że powiedziałeś „w przeważającej części”, programy nie używają API specyficznych dla platformy; w rzeczywistości większość zrobić . Nawet programy korzystające z bibliotek wieloplatformowych, takich jak GTK, nadal używają interfejsów API specyficznych dla platformy pośrednio.
Matthew Flaschen
8

Nie, różne systemy operacyjne używają różnych formatów (tj. Windows używa PE, a Linux używa ELF). Ponadto po skompilowaniu program wywołuje metody natywnego systemu operacyjnego. Jak wspomniano, możesz zajrzeć do korzystania z WINE . Zapewnia większość funkcji do uruchamiania binariów systemu Windows w systemie Linux.

Nico Huysamen
źródło
5

Istnieją trzy główne powody, dla których pliki .exe nie działają bezpośrednio w systemie Linux i dlaczego plik wykonywalny systemu Linux nie działa bezpośrednio w systemie Windows.

  1. Pierwszy to wywołania systemowe. Wywołania systemowe są prawie z definicji specyficzne dla platformy. Jednak nie wszystkie wywołania systemowe są takie same. Istnieją przenośne wywołania systemowe (np. Zdefiniowane w standardowej bibliotece C / C ++) i nieprzenośne wywołania systemowe (np. Zdefiniowane przez POSIX lub Microsoft). Aplikacje, które są statycznie połączone w czasie kompilacji z bibliotekami systemowymi, stwierdzą, że statycznie zawarty fragment kodu prawdopodobnie nie miałby szansy na poprawne wykonanie na platformie docelowej z powodu znacznie odmiennej konstrukcji platformy. Aplikacje, które są dynamicznie połączone w czasie wykonywania, mają szansę działać z kilkoma warunkami: jeśli są to przenośne wywołania systemowe, istnieje tabela translacji między oryginalnymi wywołaniami systemowymi binariów na wywołania systemowe platformy docelowej; jeśli jest to nieprzenośne wywołanie systemowe,1 , różne platformy mają inny zestaw funkcji, a niektóre funkcje nie mają sensu na drugiej platformie 2 ).

    Rozwiązanie: W przypadku uruchamiania programu Windows w systemie Linux Wine zapewnia implementację wywołań systemu Windows i bibliotek systemu Windows, rozpoznaje również format PE; Wine może uruchomić program Windows w systemie Linux bez ponownej kompilacji. W przypadku programu Linux w systemie Windows Cygwin zapewnia implementację wywołań systemowych POSIX w systemie Windows i umożliwia rekompilację programu napisanego dla systemu Linux za pomocą Cygwin GCC w celu uruchomienia go w systemie Windows bez zmian kodu źródłowego. Ze względu na otwarty charakter większości programów Linuksa łatwiej jest dokonać ponownej kompilacji niż przejść przez sposób Wine'a w celu zapewnienia warstwy kompatybilnej binarnie. Nie jest niemożliwe zapewnienie warstwy kompatybilności podobnej do wina, jednak sposób Cygwina jest bardziej niezawodny i po prostu nie ma zbyt wielu napędów, aby umożliwić łatwe przeniesienie programu Linux innego niż open source do systemu Windows.

  2. Drugi to Format wykonywalny. Windows używa formatu PE (Portable Executable), a Linux używa ELF (format wykonywalny i Linkable). Format wykonywalny zawiera metadane i określa, w jaki sposób plik wykonywalny ma być ładowany i wykonywany przez platformę.

    Rozwiązanie: Można całkowicie napisać konwerter PE -> ELF lub ELF -> PE; i prawdopodobnie nie powinno to być zbyt trudne (ostrzeżenie: nie znam faktycznego formatu żadnego z nich). Innym sposobem jest napisanie programu ładującego, który może zrozumieć pliki PE (np. Wine zapewnia jeden) lub programu ładującego, który może zrozumieć plik ELF (uważam, że konstrukcja systemu Windows ogranicza możliwość dwukrotnego kliknięcia pliku działającego natywnie jako plik wykonywalny)

  3. System wywołuje konwencję wywoływania. Linux i Windows mają nie tylko inny zestaw dostępnych wywołań systemowych, ale mają też zupełnie inną konwencję wywoływania wywołań systemowych. W Linuksie, aby wykonać wywołanie systemowe, przekazujesz numer syscall w rejestrze eax / rax i argumenty w pozostałych rejestrach, a następnie wysyłasz żądanie przerwania 0x80. W DOS-ie przekazujesz również argumenty do rejestru, jednak dla każdej usługi systemowej jest inny numer żądania przerwania, więc nie podajesz numeru wywołania systemowego w eax / rax. Windows NT jest bardziej podobny do Linuksa, jednak zamiast 0x80 podnosisz żądanie przerwania 0x2E, jednak numer wywołania systemowego wciąż się różni (więc potrzebujesz tabeli translacji numerów syscall i ewentualnie warstwy zgodności).

    Rozwiązanie: Nawet jeśli nie masz kodu samodmodyfikującego się lub próbujesz wykonać dane jako kod lub wykonać inne skomplikowane kody, nadal bardzo trudno (tak trudne jak rozwiązanie problemu zatrzymania) jest analiza pliku wykonywalnego, wyszukiwanie całego systemu wywołuje żądania przerwania i tłumaczy je na wywołania systemowe platformy docelowej. Łatwiejszym sposobem jest zapewnienie usługi wykonawczej, która obsługuje żądania przerwań programu i przekierowuje je do wywołań systemowych platformy docelowej 3 .

Istnieje wiele innych powodów, ale uważam, że te trzy są dużymi przeszkodami.

1 przychodzi na myśl bezpieczeństwo systemu plików, nie ma sposobu na tłumaczenie między bitami bezpieczeństwa Linuksa a listą kontrolną NTFS systemu Windows.

2 Windows nie może rozwidlić procesu; CreateProcess może być w pewien sposób użyte do emulacji widelca, jednak traci semantyczność kopiowania przy zapisie. W systemie Windows nie ma możliwości utworzenia procesu kopiowania przy zapisie.

3 Wierzę, że Wine to robi

Lie Ryan
źródło
1

Możliwe jest wyszukiwanie wina

Paul Whelan
źródło
paul @ nie chcę wina ... mówię o programowaniu ... po uzyskaniu pliku wykonywalnego po kompilacji. czy ten plik wykonywalny może działać zarówno
1
Artykuł w Wikipedii zawiera szczegółowe informacje na temat tego, dlaczego WINE jest wymagane.
Paul Whelan
1

Tylko jeśli jest to plik .exe .Net. Zrobiłem aplikację w VS i skompilowałem pod Windows, a następnie uruchomiłem ją w systemie Linux

mono myapp.exe

Wiem, że nie jest to dokładnie to, czego szukasz, ale odpowiedź brzmi: możesz uruchomić niektóre pliki exe w systemie Linux.

Łukasz Madon
źródło
1

Jedynym sposobem na uruchomienie plików wykonywalnych na Win, Linux (lub nawet Macu) jest posiadanie pewnego rodzaju „wirtualnej warstwy” między dyrektywami asemblera i OS, opcja Lukasa polegająca na uruchomieniu go pod Mono jest jedną z możliwości, podobnie jak budowanie Javy plik (a nawet Adobe Air).

Budowanie plików binarnych, które działają tak, aby działały na wielu architekturach, nie jest możliwe, ponieważ kod maszynowy jest silnie powiązany z systemem operacyjnym, a nawet ze sprzętem, może być konieczne wykonanie kilku kompilacji dla każdego systemu / systemu operacyjnego.

t3mujin
źródło