OSX programlarını Linux'ta çalıştırılamaz yapan nedir?


40

OSX ve Linux arasında birçok fark olduğunu biliyorum, ama onları tamamen farklı kılan, temelde uyumsuz kılan şey nedir?


5
Peki, neden OSX programlarının Linux üzerinde çalıştırılabilir olmasını bekliyorsunuz? Peki ya bu iki özel işletim sistemi, soruda bunlardan bahsetmenizi sağlar, ancak OSX programlarını çalıştırabilecek başka bir işletim sistemi de değildir?
Wrosecrans

6
Bu temelde benim sorum. OSX bir unix çekirdeğinde çalışır. Diğer unix / linux'larla karşılaştırıldığında neyin özel olduğunu merak ediyordum
Falmarri

6
Sadece Mac makineleri  görebilirsiniz ikili içeride gizli küçük elma vardır
bobobobo

Genel olarak, farklı işletim sistemleri birbirlerinin ikili dosyalarını çalıştıramaz; İşte bu yüzden, Unix etrafında yazılım kaynak tarballs olarak dağıtma uygulaması büyüdü. MacOS ne de Linux Ne bu açıdan özel şunlardır: o olur ya, eğer bir şey special olmak olabilir diğer ikilileri çalıştırın. Wrosecrans'ın yorumuna yanıt veren daha fazla oy alan yorum, noktasını tamamen kaçırıyor. : /
Peter Cordes

Yanıtlar:


56

Bütün ABI söz sepp2k olarak değil, sadece ikili biçimde (ELF karşı Mach-O), farklıdır.

Örneğin, Linux ve Darwin / XNU (OS X'in çekirdeği) kullanımı hem süre scPowerPC'e ve int 0x80/ sysenter/ syscallsyscall giriş için x86, çok daha ortak noktası orada değil oradan.

Darwin, Mach mikro çekirdeğinde negatif sistem numaralarını ve BSD monolitik çekirdeğinde pozitif sistem numaralarını yönlendirir - bkz. Xnu / osfmk / mach / syscall_sw.h ve xnu / bsd / kern / syscalls.master . Linux'un sistem numaraları mimariye göre değişir - bkz. Linux / arch / powerpc / include / asm / unistd.h , linux / arch / x86 / include / asm / unistd_32.h ve linux / arch / x86 / include / asm / unistd_64.h - ama hepsi olumsuz değil. Bu yüzden açıkça sistem çağrı numaraları, sistem çağrı argümanları ve hatta hangi sistem çağrılarının var olduğu bile farklıdır.

Standart C çalışma zamanı kitaplıkları da farklıdır; Darwin çoğunlukla FreeBSD'nin libc'ünü devralırken, Linux tipik olarak glibc'yi kullanır (ancak eglibc ve dietlibc ve uclibc ve Bionic gibi alternatifler vardır).

Bütün grafik yığınının farklı olduğunu söylemeye gerek yok; Tüm Cocoa Objective-C kütüphanelerini yok sayarak, OS X'deki GUI programları Mach portları üzerinden WindowServer ile konuşuyor, Linux'ta GUI programları genellikle X11 protokolünü kullanarak UNIX alan soketleri üzerinden X sunucusuyla konuşuyor. Tabii ki istisnalar var; Darwin’de X’i çalıştırabilir ve Linux’ta X’i atlayabilirsiniz, ancak OS X uygulamaları kesinlikle X’le konuşmaz.

Birisi işi koyarsa Şarap gibi

  • Mach-O için bir ikili yükleyici uygulanması
  • her XNU sistem çağrısını yakalamak ve uygun Linux sistemlerine dönüştürmek
  • Gerektiğinde CoreFoundation gibi OS X kütüphanelerinin yerine yazmaları
  • Gerektiği gibi, WindowServer gibi OS X hizmetleri için yedek yazma

daha sonra Linux'ta "doğal" bir OS X programı çalıştırmak mümkün olabilir. Yıllar önce, Kyle Moffet, Linux için bir prototip binfmt_mach-o oluşturarak ilk madde üzerinde bazı çalışmalar yaptı , ancak hiçbir zaman tamamlanmadı ve başka benzer proje bilmiyorum.

(Teoride bu oldukça mümkün ve birçok kez benzer çabalar yapıldı; Wine'a ek olarak, Linux’un kendisi de HP-UX ve Tru64 gibi diğer UNIX’lerden ikili dosyaları çalıştırmayı destekliyor ve Glendix projesi Plan 9’a uyumluluk getirmeyi hedefliyor Linux.)


Biri etti Linux için Mach-O ikili yükleyici ve API çevirmen uygulamak için çaba koymak!

shinh / maloader - GitHub , ikili alana yükleme ve kullanıcı alanındaki tüm kütüphane çağrılarını yakalama / çevirme gibi Şarap benzeri bir yaklaşım benimsemiştir. Sistem, sistemleri ve tüm grafiklerle ilgili kütüphaneleri tamamen görmezden geliyor, ancak birçok konsol programının çalışması için yeterli.

Sevgilim maloader üzerine kuruludur, kütüphaneler ve diğer destekleyici çalışma süreleri eklemektedir.


Yeni çabalar, binfmt_misc kullanmak için kendi çekirdek kodlarından birine sahip olmaktan çok daha muhtemel olurdu, değil mi?
SamB

@SamB: Hiç bir chroot içinde binfmt_misc işleyicisi ayarlamayı denediniz mi? Çekirdekte UNIX benzeri diğer sistemler için ikili biçimleri ele almak oldukça makul olduğunu düşünüyorum.
efemient

1
Sorum şu; Linux'ta çalıştırmak için OS X ikili dosyaları edindiyseniz, neden OS X kitaplıklarını ve hizmetlerini yeniden yazmak zorunda kalıyorsunuz? Bu noktada Linux üzerinde değişmeden koşmazlar mıydı? Sadece yasal meselelerle mi ilgili?
Hubro

20

OSX uygulamaları neden linux'da yerel olarak çalışmayacak:

Öncelikle OSX, Linux'tan farklı bir ikili format kullanır, bu nedenle Linux, OSX için derlenmiş ikilileri çalıştıramaz (aynı şekilde Windows veya BSD için derlenmiş ikilileri çalıştıramaz).

İkincisi, GUI uygulamaları hakkında konuşuyorsanız, Apple'ın GUI araç seti Cocoa a) yalnızca OSX için kullanılabilir ve b) X11'in üzerinde çalışmaz.

OSX uygulamaları için neden eşdeğer şarap yok:

Şarap yarı yarıya kullanılabilir duruma gelmeden önce çok fazla iş yapılması gerekiyordu. Bir OSX eşdeğeri için çok fazla talep olmadığından, hiç kimse böyle bir projeye henüz aynı gayreti göstermedi.


Biliyorsun, OSX / unix'in aynı ikili formatı kullanmadığını bile bilmiyordum. Bu konuda daha fazla bilgi vermek için bir bağlantınız var mı?
Falmarri

Falmarri: OSX kullanan Mach-O biçimini, Linux kullanan ELF .
sepp2k

1
@Falmarri Tüm UNIX'ler aynı ikili formatı kullanmazlar ve neredeyse tüm modern olanlar ELF'yi kullanmasına rağmen, genellikle bir UNIX'ten diğerine bir ikili dosya çalıştıramazsınız. Heck, FreeBSD'nin 8.x'de 7.x için bir program çalıştırabileceğini ya da tam tersi olduğunu garanti etmiyorum bile, 1.0 için bir Linux programı hala 2.6.x'te çalışmalıdır.
efemient

5

OS X uygulamalarının Linux'ta çalışmamasının en önemli nedeni, bu OS'lerin farklı sistemler kullanmasıdır.

Kütüphanelerden bahseden bazı önceki cevaplar ancak genellikle durum böyle değildir - Core Foundation, Apple tarafından CFLite adı altında büyük ölçüde açık kaynaklıdır ve herhangi bir platforma kolayca taşınabilir (iTunes'un Windows sürümü aslında Core Vakfı'nın bir Windows portunun tepesinde ve Bazı derleyiciler tweaks, doğrudan bir Linux dağıtımında klan kullanarak CFLite yapabilirsiniz) ve ayrıca, özellikle temel olarak GNUstep olan GNU OpenPEP uygulaması olan Linux için Temel ve AppKit olan Objective-C ortamını taşımak için açık kaynaklı çabalar var. Apple'ın Kakao'sundan daha erken (NeXT Computer şirketinin hala olduğu zaman başladı.)

Birisi belirlenirse, her Mach-O sistem çağrısını yakalayacak ve karşılık gelen Linux sisteme çevirecek bir yükleyici tasarlayabilir ve bu açık kaynaklı kütüphane "meslektaşlarını" uygun ABI çevirisine sahip ikili sisteme dinamik olarak bağlayabilir.

Ve sadece bilginiz için, Mach-O uygulamasının kaynak kodunu bulabilirseniz, portu göz önünde bulundurabilirsiniz ve bunun çok basit olduğu ortaya çıkabilir. Örnek olarak, OS X 10.6 ile birlikte gelen TextEdit uygulaması, birkaç satır (kritik olmayan) CF kodunu çıkardıktan sonra doğrudan GNUstep'e bağlanma ve derhal Linux altında kullanılabilir (GNUstep ile birlikte gönderilen TextEdit'ten bahsetmeden söz etmeden) derlenebilir. TextEdit uygulamasının NeXTSTEP'ten, yani öncüllerinden OS X'e kadar yeniden derlenmesi, hatta "© 1995 NeXT" etiketini koruyarak). TextEdit BSD lisansı altındadır.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.