Saya tahu ada banyak perbedaan antara OSX dan Linux, tetapi apa yang membuat keduanya sangat berbeda, sehingga pada dasarnya tidak kompatibel?
Jawaban yang Diterima:
Seluruh ABI berbeda, bukan hanya format biner (Mach-O versus ELF) seperti yang disebutkan sepp2k.
Misalnya, saat Linux dan Darwin/XNU (kernel OS X) menggunakan sc
di PowerPC dan int 0x80
/sysenter
/syscall
pada x86 untuk entri syscall, tidak ada lagi kesamaan dari sana.
Darwin mengarahkan nomor syscall negatif di mikrokernel 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 menurut 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 non-negatif. Jadi jelas nomor syscall, argumen syscall, dan bahkan yang syscalls yang ada berbeda.
Pustaka runtime C standar juga berbeda; Darwin sebagian besar mewarisi libc FreeBSD, sedangkan Linux biasanya menggunakan glibc (tetapi ada alternatif, seperti eglibc dan dietlibc dan uclibc dan Bionic).
Belum lagi bahwa keseluruhan tumpukan grafik berbeda; mengabaikan seluruh perpustakaan Cocoa Objective-C, program GUI pada 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 melewati X di Linux, tetapi aplikasi OS X pasti tidak berbicara tentang X.
Seperti Wine, jika seseorang memasukkan karyanya ke
- menerapkan pemuat biner untuk Mach-O
- menjebak setiap panggilan sistem XNU dan mengubahnya menjadi panggilan sistem Linux yang sesuai
- menulis pengganti pustaka OS X seperti CoreFoundation sesuai kebutuhan
- menulis penggantian untuk layanan OS X seperti WindowServer sesuai kebutuhan
kemudian menjalankan program OS X "asli" 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 kompatibilitas Plan 9 ke Linux.)
Seseorang memiliki berusahalah untuk mengimplementasikan pemuat biner Mach-O dan penerjemah API untuk Linux!
shinh/maloader – GitHub mengambil pendekatan seperti Wine untuk memuat biner dan menjebak/menerjemahkan semua panggilan perpustakaan di ruang pengguna. Ini sepenuhnya mengabaikan syscalls dan semua pustaka terkait grafis, tetapi cukup untuk membuat banyak program konsol bekerja.
Terkait:Linux – Bagaimana cara menampilkan pesan selamat datang di unix??Sayang dibangun di atas maloader, menambahkan perpustakaan dan bit runtime pendukung lainnya.