Kompatibilitas biner antara Mac OS X dan Linux

27

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.

zec
sumber
setara dengan Wine untuk biner OS X adalah Darling: darling.dolezel.info
strugee

Jawaban:

25

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.

Thorbjørn Ravn Andersen
sumber
5
Ini pada dasarnya benar untuk apa masalahnya, tetapi masalahnya bukan perpustakaan (yang bisa diseret) tetapi panggilan sistem, yang merupakan permintaan ke kernel OS. Jika OS tidak menyediakan antarmuka panggilan sistem yang kompatibel, Anda kurang beruntung.
mattdm
1
Aah, ini luar biasa. Ini adalah jenis koreksi konstruktif yang saya harapkan. Terima kasih banyak: D Bisakah Anda memberi tahu saya lebih lanjut tentang panggilan sistem yang seharusnya ini, atau mengarahkan saya ke suatu tempat yang dapat saya pelajari lebih lanjut tentang mereka?
zec
3
Mereka tidak "seharusnya", mereka sebenarnya. :) Ini awal yang baik: ibm.com/developerworks/linux/library/l-system-calls
mattdm
7
Yang mengatakan, ide "gila" Anda tidak sepenuhnya mustahil. Hanya banyak pekerjaan. Proyek Wine pada dasarnya ini untuk menjalankan binari MS Windows di Linux (atau OS X). Ini menyediakan lapisan terjemahan untuk panggilan sistem. wiki.winehq.org/…
mattdm
1
Yah, saya pikir itu tidak akan sepenuhnya mustahil, tetapi saya juga tidak berharap itu akan sesederhana seperti yang saya jelaskan. Saya menulis pertanyaan dengan maksud untuk diperbaiki. Ini kadang-kadang tampak seperti metode yang lebih efisien untuk sampai ke inti permasalahan daripada mengajukan pertanyaan langsung seperti "Bagaimana cara mengkonversi biner linux untuk dijalankan di Mac OS". Juga saya telah menggunakan anggur dari waktu ke waktu, tetapi saya tidak pernah benar-benar merenungkan cara kerjanya sebelumnya, saya pikir saya akan memeriksanya kapan saja.
zec
17

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 lxrunberfungsi seperti sudo: 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.

Warren Young
sumber
2
Salah satu alasan mengapa ini bukan masalah besar untuk program Linux → platform lain adalah: tidak ada aplikasi khusus Linux yang sumbernya tidak tersedia. Anda ingin menjalankan program Anda pada OS X atau Solaris, kompilasi ulang, dan begitulah. Mungkin ada sedikit porting untuk dilakukan di mana kode ditulis dengan cara-cara khusus Linux, tetapi umumnya itu tidak banyak pekerjaan, terutama dibandingkan dengan mempertahankan lapisan kompatibilitas. Kompatibilitas FreeBSD Linux adalah masalah besar ketika Netscape adalah biner yang didistribusikan hanya untuk Linux, dan mungkin masih digunakan untuk Adobe Flash Player.
mattdm
@ Jörg W Mittag - juga, Anda perlu memiliki perpustakaan sistem dari platform lain yang tersedia. Ini mungkin menjadi dasar untuk tuntutan mereka terhadap AutoZone. Tapi jujur ​​saya lupa detailnya dan hampir tidak peduli lagi. :)
mattdm
Jadi apa yang Anda katakan pada dasarnya, bahwa jika sistem operasi X menyediakan layanan yang sama dengan sistem operasi Y, maka biner dapat berjalan di bawah keduanya. Ini benar, tetapi membutuhkan upaya yang disengaja untuk sistem X. Saya tidak mengetahui adanya sistem operasi yang kompatibel dengan OS X.
Thorbjørn Ravn Andersen
bitrotten? Saya akan menunjukkan diri.
GnP
3

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.

joe
sumber
1

Secara teknis hal ini dapat dilakukan di macOS tetapi bukan tanpa upaya yang signifikan, meskipun beberapa upaya sudah dilakukan untuk kita.

  • Baik MacOS dan Red Hat Enterprise Linux yang telah diganti nama telah disertifikasi UNIX 03. Ini berarti pada dasarnya panggilan POSIX harus memiliki API yang sama.
  • Baik macOS dan Linux menggunakan System V ABI untuk platform amd64. Ini berarti bahwa untuk amd64 macOS dan Linux harus memiliki ABI dan API yang kompatibel.
  • macOS menggunakan Mach-O sebagai format asli yang dapat dieksekusi sementara Linux menggunakan ELF. Ini memang membuat segalanya lebih mudah, karena format file yang dapat dieksekusi dapat digunakan untuk membedakan apakah lapisan kompatibilitas harus dipanggil. Ini akan membutuhkan sesuatu seperti itu binfmt_misc.
  • Ada ekstensi kernel pihak ketiga macOS yang menyediakan persis itu. Sekarang kami memiliki cara untuk memuat meyakinkan macOS untuk memuat ELF, kami membutuhkan spesial kami ld-linux.soyang itu sendiri adalah executable Mach-O yang akan memuat ELF kami dan menjalankannya.

Sekarang yang kita butuhkan adalah setidaknya spesial ld-linux.soyang dapat melakukan hal berikut:

  • Menjadi Mach-O yang dapat dieksekusi atau dyldsendiri,
  • Dapat memuat file Linux ELF ke dalam memori di alamat yang benar,
  • Semoga memiliki kemampuan untuk memetakan Linux soname ke yang macOS (misalnya /lib/libc.so.6untuk /lib/libSystem.B.dylib) dan memuat Mach-O yang sesuai ketika ELF yang cocok tidak ditemukan, sehingga kami dapat menggunakan kembali perpustakaan macOS

Hanya 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.frameworkdan Metal.framework.

Maxthon Chan
sumber
0

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.

Daniel Wisehart
sumber