Linux'ta bir Windows .exe dosyasını çalıştırabilir miyim? [çift]


11

İlgili Soru:
Windows exe neden Linux'ta çalışmıyor?

Bir Windows olabilir .exe dosya Linux'ta çalıştırılabilir mi?

Aynı mimari kullanılırsa mümkün olacak mı? Her iki program da X86 mimarisinde çalışıyorsa, bir Windows çalıştırmak mümkün olacak mı? .exe Linux'ta mı?

Yanıtlar:


13

Exe dosyası ya Linux altında ya da Windows altında yürütülür, ancak ikisi birden olmaz.

Windows altında yürütür

Dosya bir windows dosyasıysa, Linux altında kendi başına çalışmaz. Bu durumda, bir Windows uyumluluk katmanı (Wine) altında çalıştırmayı deneyebilirsiniz. Şarapla uyumlu değilse, Linux altında yürütemezsiniz.

Başlamadan önce, Wine'ı yüklemeniz gerekir. Wine'ı kurmanız gereken adımlar, bulunduğunuz Linux platformuna göre değişir. Muhtemelen Google "Ubuntu yükleme şarabı" nı kullanabilirsiniz, örneğin, Ubuntu kullanıyorsanız.

Bir kere şarabınızı kurduktan sonra bu komutları uygulayabilirsiniz.

wine xxx.exe

Linux Altında Çalıştır

Linux altında çalışacak bu dosyayı biliyorsanız, o zaman bu komutları çalıştırmak isteyeceksiniz:

Tüm kullanıcıların izin vermesine izin vermek için izinleri değiştirmek isteyeceksiniz. x bu dosyayı sıkıştır (a + x). Ayrıca sadece kullanıcının e x Ecute (u + x)

chmod a+x xxx.exe

Programı başlatmak ./ komut satırına çalıştırılacak dosyanın geçerli yoluna bakmasını söyler ('current' dizini $ PATH ortam değişkeninde değilse).

./xxx.exe

11

İşletim sistemi (Windows veya Linux) uygulamalara servis sağlar. Örneğin, Windows ve Linux, uygulamanın dosyalara erişmek, ağa erişmek, ekranda bir şeyleri görüntülemek vb. İçin çağırabileceği işlevlere sahip olacaktır.

Farklı işletim sistemleri, bunları yapmanın farklı yollarını sağlar; bu nedenle, Windows mimarisini yapan bir uygulama, CPU mimarisi aynı olsa bile, Linux üzerinde çalışmayacaktır.


2
Bu cevap doğru. Tek sebep bu değil (farklı yükleyiciler ve çalıştırılabilir formatlar da anahtardır), ama onlardan biri.
Matthew Flaschen

2
Farklı işletim sistemlerinde yerel olarak aynı çalıştırılabilir çalıştırmayı çalıştıramamanızın ana nedenlerinden biridir.

1
@Let_Me_Be: Aslında yorumunuz doğru değil.
0xA3

1
@ 0xA3 Platforma özel API'ye erişiyorsanız, evet. Fakat çoğunlukla, bu doğru değil. C veya C ++ standart kütüphanesini yeniden uygulamak aslında çok basittir, sadece hataları tekrar uygulamanız ve çağrıları yönlendirmeniz yeterlidir. Çok fazla iş gerektiren şey, farklı dosya formatlarıdır (ve sıfırdan başlayacakları için platforma özel API'ler).
Let_Me_Be

2
Haydi, söylemelisin demedim. "Çoğunlukla" dedin, programlar platforma özel API'ler kullanmıyor; Aslında, çoğu yap . GTK gibi platformlar arası kütüphaneler kullanan programlar bile, platforma özgü API'leri dolaylı olarak kullanıyor.
Matthew Flaschen

8

Hayır, farklı İşletim Sistemleri farklı formatlar kullanır (örn. Windows, Linux ELF kullanırken PE kullanır). Ayrıca, derlendiğinde, programınız yerel işletim sistemi yöntemlerine çağrı yapar. Belirtildiği gibi, kullanarak bakabilirsiniz ŞARAP . Linux'ta Windows ikili dosyalarını çalıştırmak için çoğu işlevi sağlar.


5

.Exe dosyalarının doğrudan Linux'ta çalışmamasının ve bir Linux çalıştırıcısının doğrudan Windows'ta çalışmamasının üç ana nedeni vardır.

  1. İlk sistem çağrıları. Sistem çağrıları, neredeyse tanımı gereği platforma özgüdür. Ancak, tüm sistem çağrıları aynı şekilde yapılmaz. Taşınabilir sistem çağrıları (örneğin, C / C ++ standart kütüphanesi tarafından tanımlanmıştır) ve taşınabilir olmayan sistem çağrıları (örneğin POSIX veya Microsoft tarafından tanımlanmıştır) vardır. Derleme zamanında sistem kitaplıklarıyla statik olarak bağlanan uygulamalar, statik olarak dahil edilen kod bölümünün, platformun çok farklı tasarımları nedeniyle hedef platformda doğru şekilde yürütme şansının olmayacağını görecektir. Çalışma zamanında dinamik olarak bağlanan uygulamalar birkaç koşulla çalışma şansına sahiptir: taşınabilir sistem çağrılarıysa, orijinal ikili sistem çağrıları arasında hedef platformun sistem çağrıları arasında bir çeviri tablosu bulunur; taşınabilir olmayan sistem çağrısı ise, orijinal platformdan sistem çağrıları alan ve hedef platformda eşdeğer bir çeviri bulan (her zaman mümkün olmayabilir) bir uyumluluk katmanı olmalıdır. 1 farklı platformlar farklı özelliklere sahiptir ve bazı özellikler diğer platformlarda bir anlam ifade etmemektedir. 2 ).

    Çözüm: Windows programını Linux'ta çalıştırmak için Wine, Windows Sistem Çağrısı ve Windows Sistem Kütüphanelerinin bir uygulamasını sağlar; ayrıca PE biçimini tanır; Wine, Windows programını Linux'ta yeniden derlemeden çalıştırabilir. Windows'taki Linux programı için, Cygwin, Windows'ta POSIX Sistem çağrılarının bir uygulamasını sağlar ve Linux için Cygwin GCC kullanılarak, Windows'ta kaynak kodunda hiçbir değişiklik yapılmadan çalıştırılması için yazılmış programın derlenmesini sağlar. Çoğu Linux programının açık kaynak kodlu doğası nedeniyle, Wine'ın ikili uyumlu katman sağlama yoluna gitmek yerine yeniden derlemek daha kolaydır. Şarap benzeri bir uyumluluk katmanı sağlamak imkansız değildir, ancak Cygwin'in yolu daha sağlamdır ve açık kaynaklı olmayan Linux programının Windows'a kolayca taşınabilmesi için çok fazla sürücü yoktur.

  2. Diğeri Yürütülebilir Format. Windows, PE (Taşınabilir Yürütülebilir) biçimini ve Linux, ELF (Yürütülebilir ve Bağlanabilir Biçimi) kullanır. Yürütülebilir format meta veriler içerir ve çalıştırılabilir dosyanın platform tarafından nasıl yükleneceğini ve yürütüleceğini tanımlar.

    Çözüm: Bir PE yazmak tamamen mümkündür - & gt; ELF veya ELF ->; PE dönüştürücü; ve muhtemelen bunu yapmak için çok zor olmamalı (uyarı: İkisinden birinin biçimine aşina değilim). Başka bir yol PE dosyalarını anlayabilen bir yürütülebilir yükleyici (örneğin Wine sağlar) veya ELF dosyasını anlayabilen yürütülebilir bir yükleyici yazmaktır (Windows tasarımının yerel olarak çalıştırılabilir olarak çalışan bir çift tıklanabilir dosyanın olasılığını sınırladığını düşünüyorum)

  3. Sistem çağrıları düzenliyor. Linux ve Windows sadece farklı bir sistem çağrısı seti değil, aynı zamanda çok farklı bir sistem çağrısı çağrısı düzenine sahiptir. Linux'ta, bir sistem çağrısı yapmak için eac / rax sicilindeki syscall numarasını ve sicil kayıtlarının argümanlarındaki argümanları iletirsiniz ve ardından 0x80 kesinti isteği yaparsınız. DOS'ta ayrıca, kayıt defterinde argümanları iletirsiniz, ancak her sistem hizmeti için farklı bir kesme isteği numarası vardır, böylece sistem çağrı numarasını eax / rax cinsinden iletmezsiniz. Windows NT, Linux'a daha çok benzer, ancak 0x80 yerine 0x2E kesme isteğini yükseltirsiniz, ancak sistem çağrı numarası hala farklıdır (bu nedenle, bir çağrı numarası çeviri tablosu ve muhtemelen bir uyumluluk katmanına ihtiyacınız vardır).

    Çözüm: Kendi kendini değiştiren bir kodunuz olmasa veya verileri kod olarak çalıştırmaya veya başka zor kodlar yapmaya çalışsanız bile, bir yürütülebilir dosyayı analiz etmek, tüm sistemi aramak çok zordur (Halting Problemini çözmek kadar zor) arama kesme isteklerini çağırır ve bunları hedef platformun sistem aramalarına çevirir. Daha kolay bir yol, programın kesintiye uğrayan isteklerini ele alan ve bunları hedef platformun sistem çağrılarına yönlendiren bir çalışma zamanı hizmeti sağlamaktır. 3 .

Bunun başka çeşitli nedenleri var, ancak bu üçünün büyük engelli bloklar olduğuna inanıyorum.

1 dosya sistemi güvenliği akla geliyor, Linux'un güvenlik bitleri ve Windows NTFS ACL'si arasında çeviri yapmanın bir yolu yok.

2 Windows bir işlemi gerçekleştiremez; CreateProcess, çatal taklit etmek için bir şekilde kullanılabilir, ancak yazma-yazma anlamını kaybeder. Windows'ta yazma üzerine bir kopya oluşturma işlemi yapmanın bir yolu yoktur.

3 Wine'ın bunu yaptığını düşünüyorum.


1

Bu mümkün arama şarap


paul @ şarap istemiyorum ... derlemeden sonra çalıştırılabilir olduktan sonra programlamadan bahsediyorum. Bu çalıştırılabilir pencere ve linux hem de çalıştırmak

1
Wikipedia makalesi, WINE'ın neden gerekli olduğu konusunda üst düzey detayları verir.
Paul Whelan

1

Win, Linux'ta (hatta Mac'te) çalıştırılabilir dosyaları çalıştırmanın tek yolu, derleme ve işletim sistemi yönergeleri arasında bir tür "sanal katman" olması, lukas 'Mono altında çalıştırma seçeneği, tıpkı bir Java dosyası (veya bir Adobe Air) oluşturmak gibi bir yoldur.

Birkaç mimaride çalışacak şekilde çalışan ikili dosyalar oluşturmak mümkün değildir, çünkü makine kodu işletim sistemine ve hatta donanıma yüksek oranda bağlı olduğundan, her bir sistem / işletim sistemi için birkaç derleme yapmanız gerekebilir.


0

Yalnızca bir .Net .exe dosyasıysa. VS'de bir uygulama yaptım ve Windows altında derledim, sonra Linux'ta çalıştırdım

mono myapp.exe

Bunun tam olarak aradığınız şey olmadığını biliyorum, ancak cevabı çalıştırabilirsiniz. bazı Linux'ta exe dosyaları.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.