Saya tahu ada banyak perbedaan antara OSX dan Linux, tetapi apa yang membuat mereka sangat berbeda, yang membuat mereka pada dasarnya tidak kompatibel?
Saya tahu ada banyak perbedaan antara OSX dan Linux, tetapi apa yang membuat mereka sangat berbeda, yang membuat mereka pada dasarnya tidak kompatibel?
Jawaban:
Seluruh ABI berbeda, bukan hanya format biner (Mach-O versus ELF) seperti yang disebutkan sepp2k.
Sebagai contoh, sementara Linux dan Darwin / XNU (kernel OS X) digunakan sc
pada PowerPC dan int 0x80
/ sysenter
/ syscall
pada x86 untuk entri syscall, tidak ada banyak kesamaan dari sana.
Darwin mengarahkan nomor syscall negatif di microkernel Mach dan nomor syscall positif di kernel monolitik BSD - lihat xnu / osfmk / mach / syscall_sw.h dan xnu / bsd / kern / syscalls.master . Nomor syscall Linux bervariasi berdasarkan arsitektur - lihat linux / arch / powerpc / include / asm / unistd.h , linux / arch / x86 / include / asm / unistd_32.h , dan linux / arch / x86 / include / asm / unistd_64.h - tetapi semuanya tidak negatif. Jadi jelas nomor syscall, argumen syscall, dan bahkan mana syscall berbeda.
Pustaka runtime C standar juga berbeda; Darwin kebanyakan mewarisi libc FreeBSD, sedangkan Linux biasanya menggunakan glibc (tetapi ada alternatif, seperti eglibc dan dietlibc dan uclibc dan Bionic).
Belum lagi seluruh tumpukan grafik berbeda; mengabaikan seluruh Cocoa Objective-C libraries, program GUI di OS X berbicara dengan WindowServer melalui port Mach, sementara di Linux, program GUI biasanya berbicara dengan server X melalui soket domain UNIX menggunakan protokol X11. Tentu saja, ada pengecualian; Anda dapat menjalankan X di Darwin, dan Anda dapat memotong X di Linux, tetapi aplikasi OS X jelas tidak berbicara X.
Seperti Wine, jika seseorang memasukkannya ke dalam
kemudian menjalankan program OS X "secara native" di Linux bisa dimungkinkan. Bertahun-tahun yang lalu, Kyle Moffet melakukan beberapa pekerjaan pada item pertama, membuat prototipe binfmt_mach-o untuk Linux, tetapi tidak pernah selesai, dan saya tahu tidak ada proyek serupa lainnya.
(Secara teori ini sangat mungkin, dan upaya serupa telah dilakukan berkali-kali; selain Wine, Linux sendiri memiliki dukungan untuk menjalankan binari dari UNIX lain seperti HP-UX dan Tru64, dan proyek Glendix bertujuan untuk membawa kesesuaian Plan 9 ke Linux.)
Seseorang telah berupaya untuk mengimplementasikan pemuat biner Mach-O dan penerjemah API untuk Linux!
shinh / maloader - GitHub mengambil pendekatan Wine-suka memuat biner dan menjebak / menerjemahkan semua panggilan perpustakaan di userspace. Itu benar-benar mengabaikan syscalls dan semua perpustakaan yang berhubungan dengan grafis, tetapi cukup untuk membuat banyak program konsol bekerja.
Sayang dibangun berdasarkan maloader, menambahkan pustaka dan bit runtime pendukung lainnya.
Mengapa aplikasi OSX tidak dapat berjalan secara native di linux:
Pertama-tama OSX menggunakan format biner yang berbeda dari Linux, sehingga Linux tidak dapat menjalankan binari yang dikompilasi untuk OSX (cara yang sama ia tidak dapat mengeksekusi binari yang dikompilasi untuk Windows atau BSD).
Kedua, jika Anda berbicara tentang aplikasi GUI, Apple GUI toolkit Cocoa a) hanya tersedia untuk OSX dan b) tidak berjalan di atas X11.
Mengapa tidak ada padanan anggur untuk aplikasi OSX:
Banyak pekerjaan yang harus dilakukan sebelum anggur bahkan dapat digunakan setengah jalan. Karena tidak ada banyak permintaan untuk setara OSX, belum ada yang menginvestasikan jumlah usaha yang sama ke dalam proyek semacam itu.
Alasan terpenting mengapa aplikasi OS X tidak dapat berjalan di Linux adalah karena OS tersebut menggunakan syscalls yang berbeda.
Beberapa jawaban sebelumnya menyebutkan pustaka tetapi pada umumnya tidak demikian - Core Foundation sebagian besar bersumber terbuka oleh Apple dengan nama CFLite dan siap dibawa-bawa ke platform apa pun (versi Windows dari iTunes sebenarnya berada di atas port Windows Core Foundation, dan dengan beberapa kompiler tweak, Anda dapat langsung membuat CFLite menggunakan dentang pada distribusi Linux) dan ada juga upaya open-source untuk mem-port lingkungan Objective-C, terutama Foundation dan AppKit ke Linux, terutama GNUstep, implementasi GNU dari OpenStep, yang bertanggal lebih awal dari Apple's Cocoa (dimulai ketika masih ada perusahaan NeXT Computer.)
Jika seseorang ditentukan, mereka dapat mendesain loader yang akan menangkap setiap syscall Mach-O dan menerjemahkannya ke syscall Linux yang sesuai, serta secara dinamis menghubungkan pustaka "mitra" pustaka sumber terbuka ke biner dengan terjemahan ABI yang sesuai.
Dan hanya untuk informasi Anda, jika Anda dapat memperoleh kode sumber aplikasi Mach-O, Anda dapat mempertimbangkan untuk port dan itu mungkin menjadi sangat sederhana. Sebagai contoh, aplikasi TextEdit yang dibundel dengan OS X 10.6 dapat secara langsung dikompilasi ulang yang menghubungkan GNUstep setelah menghapus beberapa baris kode CF (tidak kritis) dan dengan demikian segera tersedia di Linux (belum lagi TextEdit yang dikirim dengan GNUstep sebenarnya adalah mengkompilasi ulang langsung aplikasi TextEdit dari NeXTSTEP, pendahulu untuk OS X, bahkan mempertahankan label "© 1995 NeXT"). TextEdit di bawah lisensi BSD.
Pada 8 Desember 2012 proyek baru telah diluncurkan - Sayang.