Bisakah saya menjalankan file Windows .exe di Linux? [duplikat]

12

Pertanyaan Terkait:
Mengapa Windows Exe tidak berfungsi di Linux?

Bisakah .exefile Windows dijalankan di Linux?

Jika arsitektur yang sama digunakan, apakah mungkin? Seperti jika kedua program berjalan pada arsitektur X86, apakah mungkin menjalankan Windows .exedi Linux?

Varun Janga
sumber

Jawaban:

13

File exe akan dijalankan di Linux atau Windows, tetapi tidak keduanya.

Jalankan Di Bawah Windows

Jika file tersebut adalah file windows, itu tidak akan berjalan di Linux sendiri. Jadi jika itu masalahnya, Anda dapat mencoba menjalankannya di bawah lapisan kompatibilitas Windows (Wine). Jika itu tidak kompatibel dengan anggur, maka Anda tidak akan dapat menjalankannya di Linux.

Sebelum dapat memulai, Anda harus memasang Wine. Langkah-langkah yang Anda perlukan untuk menginstal Wine akan berbeda dengan platform Linux yang Anda gunakan. Anda mungkin dapat Google "Ubuntu install wine", jika misalnya, Anda menginstal Ubuntu.

Setelah Anda menginstal anggur, Anda dapat menjalankan perintah ini.

wine xxx.exe

Jalankan Di Linux

Jika Anda tahu file ini dijalankan di linux, maka Anda ingin menjalankan perintah ini:

Anda akan ingin mengubah izin untuk memungkinkan semua pengguna untuk e x ecute file ini (a + x). Anda juga bisa mengizinkan pengguna untuk e x ecute (u + x)

chmod a+x xxx.exe

Luncurkan program, ./baris perintah memberitahu untuk mencari di jalur saat ini untuk mengeksekusi file (jika direktori 'saat ini' tidak dalam variabel lingkungan $ PATH.

./xxx.exe
Thariama
sumber
11

Sistem operasi (Windows atau Linux) menyediakan layanan untuk aplikasi. Misalnya, Windows dan Linux akan memiliki fungsi yang dapat dipanggil aplikasi untuk mengakses file, mengakses jaringan, menampilkan hal-hal di layar, dll.

Sistem operasi yang berbeda menyediakan cara yang berbeda dalam melakukan hal-hal itu, sehingga aplikasi yang melakukannya dengan cara Windows tidak akan berfungsi di Linux, dan sebaliknya, meskipun arsitektur CPUnya sama.

Angus
sumber
2
Jawaban ini benar. Itu bukan satu-satunya alasan (loader yang berbeda dan format yang dapat dieksekusi juga penting), tetapi itu salah satunya.
Matthew Flaschen
2
Itu salah satu alasan utama Anda tidak dapat menjalankan eksekusi yang sama secara asli pada sistem operasi yang berbeda.
1
@Let_Me_Be: Sebenarnya komentar Anda tidak benar.
0xA3
1
@ 0xA3 Jika Anda mengakses API khusus platform, maka ya. Tetapi sebagian besar, itu sebenarnya tidak benar. Mengimplementasikan kembali pustaka standar C atau C ++ sebenarnya sangat sederhana, Anda hanya perlu mengimplementasikan kembali bug dan mengalihkan panggilan. Yang membutuhkan banyak pekerjaan adalah format file yang berbeda (dan API khusus platform karena harus diimplementasikan kembali dari awal).
Let_Me_Be
2
@Biarkan, aku tidak pernah mengatakan kamu harus. Saya menunjukkan bahwa Anda mengatakan "sebagian besar", program tidak menggunakan API khusus platform; pada kenyataannya, sebagian besar melakukannya . Bahkan program yang menggunakan pustaka lintas platform seperti GTK masih menggunakan API khusus platform secara tidak langsung.
Matthew Flaschen
8

Tidak, Sistem Operasi yang berbeda menggunakan format yang berbeda (mis. Windows menggunakan PE sementara linux menggunakan ELF). Juga, ketika dikompilasi, program Anda membuat panggilan ke metode OS asli. Seperti yang disebutkan, Anda dapat melihat menggunakan WINE . Ini menyediakan sebagian besar fungsionalitas untuk menjalankan binri Windows di Linux.

Nico Huysamen
sumber
5

Ada tiga alasan utama mengapa file .exe tidak akan langsung berjalan di Linux dan mengapa executable Linux tidak akan langsung berjalan di Windows.

  1. Yang pertama adalah Panggilan sistem. Panggilan sistem, hampir secara definisi, spesifik platform. Namun, tidak semua panggilan sistem dibuat sama. Ada panggilan sistem portabel (misalnya ditentukan oleh perpustakaan standar C / C ++) dan panggilan sistem non-portabel (misalnya ditentukan oleh POSIX atau Microsoft). Aplikasi yang terhubung secara statis pada waktu kompilasi dengan pustaka sistem akan menemukan bahwa bagian dari kode yang disertakan secara statis mungkin tidak akan memiliki peluang untuk dieksekusi dengan benar di platform target karena desain platform yang sangat berbeda. Aplikasi yang terhubung secara dinamis pada saat runtime memiliki peluang untuk berjalan dengan beberapa kondisi: jika itu panggilan sistem portabel, ada tabel terjemahan antara panggilan sistem biner asli ke panggilan sistem platform target; jika itu panggilan sistem non-portabel,1 , platform yang berbeda memiliki serangkaian fitur yang berbeda, dan beberapa fitur tidak masuk akal di platform lain 2 ).

    Solusi: Untuk menjalankan program Windows di Linux, Wine menyediakan implementasi Panggilan Sistem Windows dan Perpustakaan Sistem Windows, ia juga mengenali format PE; Wine dapat menjalankan program Windows di Linux tanpa kompilasi ulang. Untuk program Linux di Windows, Cygwin menyediakan implementasi panggilan Sistem POSIX di Windows, dan memungkinkan program yang ditulis untuk Linux untuk dikompilasi ulang menggunakan Cygwin GCC untuk berjalan di sistem Windows tanpa perubahan kode sumber. Karena sifat open source dari sebagian besar program Linux, lebih mudah untuk mengkompilasi ulang daripada menggunakan cara Wine memberikan lapisan yang kompatibel dengan biner. Bukan tidak mungkin untuk menyediakan lapisan kompatibilitas seperti anggur, namun cara Cygwin lebih kuat dan tidak banyak drive yang memungkinkan program Linux non-open-source dengan mudah dipindahkan ke Windows.

  2. Yang lainnya adalah Format Executable. Windows menggunakan format PE (Portable Executable) dan Linux menggunakan ELF (Executable and Linkable Format). Format yang dapat dieksekusi berisi metadata, dan mendefinisikan bagaimana file yang dapat dieksekusi akan dimuat dan dieksekusi oleh platform.

    Solusi: Sangat mungkin untuk menulis konverter PE -> ELF atau ELF -> PE; dan mungkin seharusnya tidak terlalu sulit untuk melakukannya (peringatan: Saya tidak terbiasa dengan format sebenarnya dari keduanya). Cara lain adalah dengan menulis loader yang dapat dieksekusi yang dapat memahami file PE (mis. Wine menyediakannya) atau loader yang dapat dieksekusi yang dapat memahami file ELF (Saya percaya desain Windows membatasi kemungkinan file yang dapat diklik ganda yang berjalan secara native sebagai yang dapat dieksekusi)

  3. Konvensi pemanggilan sistem. Linux dan Windows tidak hanya memiliki serangkaian panggilan sistem yang berbeda, tetapi juga memiliki konvensi panggilan panggilan sistem yang sangat berbeda. Di Linux, untuk membuat panggilan sistem, Anda memasukkan nomor syscall di register eax / rax dan argumen di register lainnya, dan kemudian Anda membuat permintaan interupsi 0x80. Di DOS, Anda juga memberikan argumen dalam register, namun ada nomor permintaan interupsi yang berbeda untuk setiap layanan sistem sehingga Anda tidak memberikan nomor panggilan sistem dalam eax / rax. Windows NT lebih mirip dengan Linux, namun bukannya 0x80 Anda meningkatkan permintaan interupsi 0x2E, namun nomor panggilan sistem masih berbeda (jadi Anda memerlukan tabel terjemahan nomor syscall dan mungkin lapisan kompatibilitas).

    Solusi: Sekalipun Anda tidak memiliki kode modifikasi sendiri atau mencoba mengeksekusi data sebagai kode atau melakukan kode rumit lainnya, masih sangat sulit (sekeras memecahkan Masalah Pemutusan) untuk menganalisis yang dapat dieksekusi, cari semua sistem panggilan interupsi permintaan, dan menerjemahkannya ke panggilan sistem platform target. Cara yang lebih mudah adalah dengan menyediakan layanan runtime yang menangani permintaan interupsi program dan mengarahkannya ke panggilan sistem platform target 3 .

Ada berbagai alasan lain, tetapi saya percaya ketiganya adalah batu sandungan besar.

1 keamanan sistem file terlintas dalam pikiran, tidak ada cara untuk menerjemahkan antara bit keamanan Linux dan Windows 'NTFS ACL.

2 Windows tidak dapat melakukan proses; CreateProcess agak dapat digunakan untuk meniru garpu tetapi kehilangan semantik copy-on-write. Tidak ada cara untuk melakukan proses copy-on-write di Windows.

3 Saya percaya Wine melakukan ini

Lie Ryan
sumber
1

Mungkin anggur pencarian

Paul Whelan
sumber
paul @ saya tidak ingin anggur ... saya berbicara tentang pemrograman ... setelah saya dapat dieksekusi setelah kompilasi. dapatkah executable dijalankan di kedua jendela dan linux
1
Artikel wikipedia memberikan detail tingkat tinggi mengapa WINE diperlukan.
Paul Whelan
1

Hanya jika itu file .Net .exe. Saya membuat aplikasi dalam VS dan dikompilasi di bawah Windows kemudian saya jalankan di Linux

mono myapp.exe

Saya tahu ini bukan apa yang Anda cari, namun jawabannya adalah Anda dapat menjalankan beberapa file exe di Linux.

Lukasz Madon
sumber
1

Satu-satunya cara untuk menjalankan executables di Win, Linux (atau bahkan Mac) adalah memiliki semacam "lapisan virtual" antara rakitan dan arahan OS, opsi lukas untuk menjalankannya di bawah Mono adalah satu cara untuk berjalan, seperti membangun Java file (atau bahkan Adobe Air).

Membangun binari yang menjalankan itu, seperti halnya, untuk berjalan pada beberapa arsitektur tidak mungkin karena kode mesin sangat terikat pada OS dan bahkan perangkat keras, Anda mungkin harus melakukan beberapa build untuk setiap sistem / OS.

t3mujin
sumber