GNU/Linux >> Belajar Linux >  >> Linux

(C/C++) Bagaimana cara menghasilkan file yang dapat dieksekusi yang dapat berjalan di Windows dan Linux?

Tidak ada cara untuk memiliki satu native executable yang dikompilasi dari sumber C++ yang bekerja pada platform yang berbeda. Saya tidak percaya Anda bahwa file yang dapat dieksekusi yang sama dijalankan di Windows dan Linux, seperti yang Anda nyatakan di paragraf kedua.


Jawaban sederhananya adalah, Anda tidak bisa.

Format biner PE (Windows) dan ELF (Linux) sangat berbeda.

Belum lagi Program C/C++ memerlukan penautan ke pustaka yang tidak akan tersedia di kedua platform secara bersamaan.

Namun, Anda dapat menggunakan Wine di Linux untuk menjalankan Windows yang dapat dieksekusi asalkan tidak mencoba panggilan khusus Windows yang eksotis.

Atau Anda dapat memilih untuk menggunakan bahasa lintas platform yang lebih "umum" seperti bahasa CLI (C#/IronPython/Java dll.) yang didukung oleh .NET untuk Windows dan Mono untuk linux/lainnya.


Oke, anak-anak.

Ya, Anda BISA menulis biner multi-platform, tetapi sulit. Ini disebut Fat Binary, dan dulu cukup umum di tahun 1980-an meskipun saya belum pernah melihatnya selama beberapa dekade. https://en.wikipedia.org/wiki/Fat_binary

Pada dasarnya, Anda mengkompilasi kode mesin untuk setiap platform yang ingin Anda jalankan dan kemudian menautkan kode tersebut dengan titik masuk yang berbeda. Meskipun artikel Wikipedia hanya menjelaskan pengemasan arsitektur yang berbeda ke dalam biner yang sama, sebenarnya mungkin untuk membuat satu biner yang berjalan pada sistem operasi yang berbeda selama titik masuk untuk sistem operasi tidak bertabrakan.

Beberapa format yang dapat dieksekusi sengaja dirancang untuk memungkinkan ini. Misalnya, MZ, NE, LX, dan PE dapat dilapis. Program OS/2 lama kadang-kadang melakukan ini... mereka jarang memuat seluruh program untuk kedua sistem operasi, tetapi ketika dijalankan pada DOS akan mencetak pesan yang memberi tahu Anda bahwa Anda menggunakan sistem operasi yang salah untuk program tersebut.

Sejauh Linux dan Windows dalam satu biner: Meskipun Anda tidak dapat melakukan ELF dan PE, saya yakin mungkin dapat dilakukan dengan PIE atau COFF dan PE atau COM. Linux yang lebih lama akan menjalankan binari COFF, yang diturunkan dari PE, jadi sepertinya Anda dapat membuat biner universal jika versi Linux yang lebih baru masih akan menjalankan ini. Saya tidak bisa mengatakan dengan pasti ini akan berhasil, tetapi tampaknya masuk akal.

Peringatan lain:Biasanya Anda perlu melompati kode tepat di awal untuk melewati titik masuk sistem operasi lain, header, dll. karena Anda tidak dapat menemukan kode Anda di sana (jelas).

Masalah dengan ini dalam komputasi modern adalah bahwa sebagian besar perangkat lunak anti-virus salah mengidentifikasi ini sebagai virus. Dulu umum bahwa virus akan menyerang binari dengan memasukkan lompatan seperti itu di awal executable yang melompat ke ujung biner, menempelkan kode mereka sendiri ke ujung biner, lalu memasukkan lompatan lain kembali ke executable utama. kode. Karena Anda perlu melakukan sesuatu yang kurang lebih serupa untuk mendukung beberapa platform dalam satu biner, sebagian besar perangkat lunak AV akan secara heuristik mengidentifikasi ini sebagai virus dan mengkarantina executable Anda.

Singkatnya:YA itu bisa dilakukan untuk (beberapa) kombinasi platform. Bukan tidak mungkin, tetapi Anda harus gila untuk melakukannya.


Linux
  1. Cara menghasilkan Checksum file dengan fungsi SHA2 Hash yang berbeda di Linux dan Windows

  2. Bagaimana cara menggunakan / (pemisah direktori) di Linux dan Windows dengan Python?

  3. Bagaimana saya bisa menjalankan Windows yang dapat dieksekusi dari WSL (Ubuntu) Bash

  1. Cara Menginstal Wine Dan Menjalankan Aplikasi Windows Di Linux

  2. Bagaimana saya bisa menghubungkan file di Linux?

  3. menggunakan linux bagaimana saya bisa meneruskan konten file sebagai parameter ke yang dapat dieksekusi?

  1. Bagaimana saya bisa mendefinisikan DIRECTORY_SEPARATOR untuk platform Windows dan Linux?

  2. Bagaimana cara mengubah file yang dapat dieksekusi linux (biner) ke file windows exe?

  3. Bagaimana cara menentukan apakah file biner linux 32-bit atau 64-bit?