Apa yang membuat program OSX tidak dapat dijalankan di Linux?

40

Saya tahu ada banyak perbedaan antara OSX dan Linux, tetapi apa yang membuat mereka sangat berbeda, yang membuat mereka pada dasarnya tidak kompatibel?

Falmarri
sumber
5
Nah, mengapa Anda berharap program OSX dapat dijalankan di Linux? Bagaimana dengan dua OS khusus ini yang membuat Anda menyebutkannya dalam pertanyaan, tetapi tidak ada OS lain yang juga tidak dapat menjalankan program OSX?
wrosecrans
6
Itu pada dasarnya pertanyaan saya. OSX berjalan pada kernel unix. Saya bertanya-tanya bagaimana dengan itu membuatnya istimewa dibandingkan dengan unix / linux lainnya
Falmarri
6
Ada apel kecil rahasia di dalam binari yang hanya bisa dilihat oleh mesin Mac bob
bobobobo
Secara umum OS yang berbeda tidak dapat menjalankan binari masing-masing; itulah mengapa praktik mendistribusikan perangkat lunak sebagai tarbal sumber tumbuh di sekitar Unix. Baik MacOS maupun Linux tidak istimewa dalam hal ini: itu akan menjadi sesuatu yang istimewa jika dapat menjalankan binari yang lain. Komentar yang lebih banyak dibalas menjawab komentar wrosecrans benar-benar tidak ada gunanya. : /
Peter Cordes

Jawaban:

56

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 scpada PowerPC dan int 0x80/ sysenter/ syscallpada 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

  • mengimplementasikan pemuat biner untuk Mach-O
  • menjebak setiap syscall XNU dan mengubahnya menjadi syscall Linux yang sesuai
  • menulis penggantian untuk pustaka OS X seperti CoreFoundation sesuai kebutuhan
  • menulis penggantian untuk layanan OS X seperti WindowServer sesuai kebutuhan

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.

singkat
sumber
Upaya baru akan jauh lebih mungkin menggunakan binfmt_misc daripada memiliki kode kernel mereka sendiri, bukan?
SamB
@ SamB: Pernah mencoba mengatur penangan binfmt_misc dalam chroot? Saya pikir ini agak masuk akal untuk menangani format biner untuk sistem mirip UNIX lainnya di kernel.
ephemient
1
Pertanyaanku adalah; jika Anda mendapatkan binari OS X untuk dijalankan di Linux, mengapa Anda perlu menulis ulang pustaka dan layanan OS X? Bukankah mereka akan berjalan tidak berubah di Linux pada saat itu? Apakah ini hanya masalah hukum?
Hubro
20

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.

sepp2k
sumber
Anda tahu, saya bahkan tidak menyadari bahwa OSX / unix tidak menggunakan format biner yang sama. Apakah Anda memiliki tautan ke informasi lebih lanjut tentang itu?
Falmarri
Falmarri: OSX menggunakan format Mach-O , Linux menggunakan ELF .
sepp2k
1
@ Falmarri Tidak semua UNIX menggunakan format biner yang sama, dan meskipun hampir semua UNIX menggunakan ELF, Anda masih tidak bisa menjalankan biner dari satu UNIX di yang lain. Heck, saya tidak berpikir FreeBSD bahkan menjamin bahwa Anda dapat menjalankan program untuk 7.x pada 8.x atau sebaliknya, sedangkan program Linux untuk 1.0 seharusnya masih berjalan pada 2.6.x.
ephemient
5

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.

Maxthon Chan
sumber
1

Pada 8 Desember 2012 proyek baru telah diluncurkan - Sayang.

http://www.darlinghq.org/

Tata_Kazika
sumber