Persiapkan diri Anda, pertanyaan ini kemungkinan akan tampak naif dan / atau bodoh, mengingat saya relatif baru dalam pekerjaan sistem unix like, dan pemrograman pada umumnya.
Siap? Baik! Saya akan melalui sekitar 3 level ludicrosity, meningkat seiring berjalannya waktu.
Kami memiliki dua sistem dengan perangkat keras yang sama (titik utama adalah prosesor, katakanlah duo intel core 2 standar).
Satu berjalan (masukkan distro linux Anda di sini: Ubuntu akan digunakan untuk selanjutnya), dan yang lainnya sedang berjalan katakanlah Mac OS X.
Seseorang mengkompilasi program yang setara, Mari kita katakan sesuatu seperti:
int main()
{
int cat = 33;
int dog = 5*cat;
return dog;
}
Kode ini sangat sederhana, karena saya belum ingin mempertimbangkan implikasi dari shared library.
Ketika dikompilasi pada sistem masing-masing. Bukankah perbedaan utama antara output soal ELF vs Mach-O? Jika seseorang melucuti setiap biner dari format, meninggalkan biner datar, bukankah instruksi mesin yang dibongkar akan sama? (dengan mungkin beberapa perbedaan tergantung pada kebiasaan / kecenderungan penyusun).
1.) Jika seseorang mengembangkan program untuk mengemas ulang biner datar yang dihasilkan dari sistem Ubuntu kami, dalam pemformatan Mach-O, apakah program itu akan berjalan di sistem Mac OS X? Kemudian, jika seseorang hanya memiliki biner yang dikompilasi dari program yang seharusnya di atas, dan satu memiliki alat mistis ini untuk mengemas ulang binari datar, akankah program sederhana dapat berjalan pada sistem Mac OS X?
Sekarang mari kita sedikit lebih jauh.
Kami sekarang memiliki program dengan sumber seperti:
#include <stdio.h>
int main()
{
printf("I like tortoises, but not porpoises");
return 0;
}
2.) Dengan asumsi program ini dikompilasi dan dihubungkan secara statis, apakah program ajaib kami masih dapat mengemas ulang biner mentah dalam format Mach-O dan membuatnya bekerja pada mac os X? Karena tidak perlu bergantung pada binari lain, (yang sistem mac tidak akan miliki dalam kasus ini)
Dan sekarang untuk level terakhir;
3.) Bagaimana jika kita menggunakan program yang diharapkan ini untuk mengonversi semua pustaka bersama yang diperlukan ke format Mach-O, dan kemudian mengkompilasi program di atas dengan tautan dinamis. Apakah program masih berhasil dijalankan?
Seharusnya untuk saat ini, jelas setiap langkah absurditas bergantung pada basis sebelumnya, bahkan masuk akal. jadi jika pilar pertama dihancurkan, saya ragu akan ada banyak manfaat untuk tingkatan yang tersisa.
Saya pasti tidak akan berpikir sejauh ini dengan program-program dengan GUI dalam pikiran. Sistem windowing kemungkinan akan menjadi sakit kepala lainnya. Saya hanya mempertimbangkan program baris perintah pada tahap ini.
Sekarang, saya mengundang dunia untuk mengoreksi saya, dan memberi tahu saya segala sesuatu yang salah dengan garis pemikiran saya yang absurd.
Jawaban:
Anda lupa satu hal penting, yaitu bahwa program Anda harus berinteraksi dengan sistem operasi untuk melakukan sesuatu yang menarik.
Konvensi berbeda antara Linux dan OS X sehingga biner yang sama tidak dapat berjalan apa adanya tanpa dasarnya memiliki sepotong kode tergantung sistem operasi untuk dapat berinteraksi dengannya. Banyak dari hal-hal ini disembunyikan di perpustakaan, yang kemudian harus Anda tautkan, dan itu berarti program Anda harus ditautkan, dan penautan juga berbeda antara kedua sistem.
Dan begitulah seterusnya dan seterusnya. Kedengarannya seperti melakukan hal yang sama sangat berbeda dalam detail sebenarnya.
sumber
Ini bisa dilakukan jika seseorang ingin meluangkan cukup waktu untuk mewujudkannya. Proyek Darling sedang mencoba ini, meskipun pada tulisan ini, itu dalam keadaan yang cukup primitif.
Ini telah dilakukan dengan sukses sebelumnya di platform lain:
Solaris dan UnixWare menyertakan program bantuan yang disebut
lxrun
berfungsi sepertisudo
: Anda memberikan nama dan parameter yang dapat dieksekusi ke pembantu dan memperbaiki semuanya secara dinamis sehingga yang dapat dieksekusi dapat berbicara dengan OS. Situs resmi (bawah, tautan arsip ) mengatakan situs itu bitrotted .Kernel Linux pernah memiliki fitur yang disebut iBCS yang melakukan kebalikannya, kecuali bahwa itu tidak membutuhkan bantuan karena kernel mengenali binari "asing" secara langsung. Itu jatuh ke rusak selama seri pengembangan kernel 2.3 , kemungkinan besar karena pertempuran server Unix kecil pada dasarnya berakhir setelah 2,4 keluar.
Kernel FreeBSD dapat dikonfigurasi untuk mengenali binari Linux dan menjalankannya seolah-olah itu asli. Fitur ini tampaknya dalam kondisi yang lebih baik daripada dua di atas.
OpenBSD dan NetBSD memiliki fitur serupa.
OS X memiliki banyak FreeBSD di dalamnya , jadi porting dukungan Linuxnya mungkin mudah.
sumber
Saya cukup setuju dengan semua orang, tetapi saya ingin menambahkan itu, sementara ini akan memakan banyak waktu dan upaya, itu tidak akan sebanyak yang diperlukan untuk mengembangkan Wine.
Sebagian besar kesulitan dalam pengembangan Wine adalah mereka mem-porting format biner dari sistem operasi sumber tertutup dan BANYAK panggilan sistem tidak berdokumen. Mereka pada dasarnya harus merekayasa balik sistem operasi.
Jika seseorang melakukan ini dari satu OS terbuka ke OS terbuka lain, mereka mungkin bisa menyelesaikannya dalam 1/10 dari waktu, karena lapisan kompatibilitas bisa saja disalin / ditempelkan dari OS lain jika sistem panggilan asli yang setara tidak ada. Tentu saja, dalam kebanyakan kasus di dunia POSIX, akan ada panggilan asli yang tersedia.
Proyek catatan lainnya adalah ReactOS, di mana mereka pada dasarnya menciptakan versi Windows yang kompatibel dengan biner penuh ... tidak perlu untuk Wine.
sumber
Secara teknis hal ini dapat dilakukan di macOS tetapi bukan tanpa upaya yang signifikan, meskipun beberapa upaya sudah dilakukan untuk kita.
binfmt_misc
.ld-linux.so
yang itu sendiri adalah executable Mach-O yang akan memuat ELF kami dan menjalankannya.Sekarang yang kita butuhkan adalah setidaknya spesial
ld-linux.so
yang dapat melakukan hal berikut:dyld
sendiri,/lib/libc.so.6
untuk/lib/libSystem.B.dylib
) dan memuat Mach-O yang sesuai ketika ELF yang cocok tidak ditemukan, sehingga kami dapat menggunakan kembali perpustakaan macOSHanya dengan loader di atas ELF yang tidak membuat syscall langsung memiliki peluang bagus untuk bekerja, tetapi ELF dengan syscall mungkin tidak berfungsi. Komponen kedua yang mungkin berguna adalah ekstensi kernel yang menangkap syscalls Linux dan memetakannya ke yang macOS. Pada penggunaan desktop, implementasi mesa khusus diperlukan untuk memetakan panggilan grafis Linux ke
OpenGL.framework
danMetal.framework
.sumber
Ada sejumlah aplikasi Linux khusus yang ini akan sangat membantu. Di sisi FPGA, Quartus dan Vivado adalah contoh program yang baik yang berjalan di Linux dan sepertinya tidak ada kode sumber yang tersedia untuk mereka atau program serupa yang menargetkan FPGA terbaru.
Saya pikir jawaban sederhana untuk pertanyaan Anda adalah: kompilasi ulang pada MacOS di mana Anda memiliki sumber dan membentuk grup untuk memberikan kemampuan jika Anda punya waktu - dan itu akan menjadi tugas yang memakan waktu.
sumber