Mac OS X ve Linux arasındaki ikili uyumluluk


27

Kendinizi destekleyin, bu soru muhtemelen saf olmayan ve / veya aptal görünecek, unix benzeri sistemlerin içsel çalışmalarında göreceli olarak yeni olduğumu ve genel olarak programlandığımı görecek.

Hazır? Tamam! Ben gittikçe artan, yaklaşık 3 seviyelik bir gülünçlük yaşayacağım.


Benzer donanıma sahip iki sistemimiz var (ana nokta işlemci olmak, standart bir intel core 2 duo diyelim).

Biri çalışıyor (linux dağıtımınızı buraya yerleştirin: Ubuntu bundan sonra kullanılacak) ve diğeri ise Mac OS X diyelim.

Bir eşdeğer bir program derler, şöyle bir şey söyleyelim:

int main()
{
    int cat = 33;
    int dog = 5*cat;
    return dog;
}

Kod son derece basittir, çünkü henüz paylaşılan kütüphanelerin etkilerini düşünmek istemiyorum.

İlgili sistemlerde derlendiğinde. Çıktı arasındaki temel fark, Mach-O vs ELF meselesi değil midir? Biri formatlamanın her ikilikini sıyırırsa, düz bir ikili bırakırsa, demonte edilen makine talimatları aynı olmaz mıydı? (derleyici alışkanlıklarına / eğilimlerine bağlı olarak belki de birkaç farkla).

1.) Ubuntu sistemimizden üretilen düz ikilinin yeniden paketlenmesi için bir program geliştirildiyse, Mach-O biçimlendirmesinde Mac OS X sisteminde çalışır mıydı? Öyleyse, yukarıda sözde programın derlenmiş bir ikili dosyası varsa ve bir tanesi düz ikili dosyaları yeniden paketlemek için bu mistik araca sahip olsaydı, basit programlar Mac OS X sisteminde çalıştırılabilir mi?


Şimdi biraz daha ileri götürelim.

Şimdi aşağıdaki gibi kaynaklara sahip bir programımız var:

#include <stdio.h>
int main()
{
    printf("I like tortoises, but not porpoises");
    return 0;
}

2.) Bu programın derlenmiş ve statik olarak bağlı olduğunu varsayarsak, sihirli programımız hala ham ikiliyi Mach-O formatında yeniden paketleyebilecek ve mac os X üzerinde çalışabilecek mi? Başka herhangi bir ikili dosyaya güvenmesine gerek kalmayacağını görmek (bunun için mac sisteminin bu durumda olmayacağı)


Ve şimdi son seviye için;

3.) Bu gerekli programı tüm gerekli paylaşılan kütüphaneleri Mach-O formatına dönüştürmek için kullandıysak ve bunun yerine yukarıdaki programı dinamik bağlantı ile derledik. Program hala çalışmayı başarabilir mi?

Şimdilik böyle olmalı, açıkçası her saçmalık adımının bir önceki temele dayanması, hatta mantıklı olması bile gerekiyor. Bu nedenle, ilk direk tahrip olursa, geri kalan katmanlara hak edeceğinden şüpheliyim.

Kesinlikle GUI'nin aklında olduğu programlarla bunu düşünecek kadar ileri gitmeyeceğim. Pencere sistemleri büyük olasılıkla başka bir baş ağrısı olur. Bu aşamada sadece komut satırı programlarını düşünüyorum.

Şimdi, dünyayı beni düzeltmeye davet ediyorum ve saçma düşünme çizgimde yanlış olan her şeyi bana anlat.


OS X ikili dosyaları için Wine'in
strugee

Yanıtlar:


25

Önemli bir şeyi unutursunuz, yani programınızın ilginç bir şey yapmak için işletim sistemiyle etkileşime girmesi gerekir.

Kurallar Linux ve OS X arasında farklıdır, bu nedenle aynı ikili, kendisiyle etkileşime girmek için işletim sistemine bağımlı bir kod grubuna sahip olmadan olduğu gibi çalışamaz. Bunların çoğu, daha sonra bağlantı kurmanız gereken kütüphanelerde gizlenir ve bu, programınızın bağlanabilir olması gerektiği anlamına gelir ve bağlantı, iki sistem arasında da farklıdır.

Ve böylece devam ediyor. Yüzeyde aynı şeyi yapmak gibi sesler gerçek detaylarda çok farklı.


5
Bu temelde sorunun ne olduğu konusunda doğrudur, ancak konu gerçekten kütüphaneler değil (sürüklenebilecek) değil, işletim sistemi çekirdeğine istekte bulunan sistem çağrılarıdır. İşletim sistemi uyumlu bir sistem çağrısı arayüzü sağlamazsa, şansınız kalmaz.
mattdm

1
Aah, bu mükemmel. Bu, tam da umduğum gibi yapıcı bir düzeltme. Bir demet teşekkürler: D Bana bu sözde sistem çağrıları hakkında daha fazla bilgi verebilir misiniz ya da beni onlar hakkında daha fazla şey öğrenebileceğim bir yere yönlendirebilir misiniz?
zec

3
"Sözde" değiller, gerçekler. :) İşte güzel bir başlangıç: ibm.com/developerworks/linux/library/l-system-calls
mattdm

7
Bu, "çılgın" fikrin tamamen imkansız değil dedi. Sadece bir sürü iş. Wine projesi aslında MS Windows ikili dosyalarını Linux'ta (veya OS X) çalıştırmak için. Sistem aramaları için bir çeviri katmanı sağlar. wiki.winehq.org/…
mattdm

1
Tamamen imkansız olmayacağını düşündüm, ancak anlattığım kadar basit olmasını beklemiyordum. Soruyu düzeltilmek amacıyla yazdım. Bu, zaman zaman "Mac OS'de çalışacak bir linux ikiliyi nasıl dönüştürebilirim" gibi doğrudan bir soru sormaktan ziyade, konunun kalbine ulaşmanın daha etkili bir yöntemi gibi gözüküyor. Ayrıca zaman zaman şarap kullandım, ama daha önce nasıl çalıştığını hiç düşünmedim, sanırım şimdi araştıracağım.
zec

17

Birisi gerçekleşmesi için yeterli zaman harcamak isterse bu yapılabilir. Darling projesi bu yazı olarak, oldukça ilkel bir durumda olsa, bu çalışıyor.

Diğer platformlarda daha önce başarıyla yapıldı:

OS X'in içinde bir çok FreeBSD var , bu yüzden Linux desteğini taşımak kolay olabilir.


2
Bunun Linux programları için büyük bir sorun olmamasının nedenlerinden biri → diğer platformlar: Kaynağın mevcut olmadığı yalnızca Linux için önemli uygulamalar yok. Programınızı OS X veya Solaris'te çalıştırmak istiyorsunuz, yeniden derleyin ve devam edin. Kodun Linux'a özgü yollarla yazıldığı yerde yapılacak küçük bir bağlantı olabilir, ancak genellikle uyumluluk katmanını korumakla karşılaştırıldığında genellikle çok fazla iş yoktur. FreeBSD'nin Linux uyumluluğu Netscape yalnızca Linux için dağıtılan bir ikiliydi ve muhtemelen hala Adobe Flash Player için kullanıldığında çok önemliydi.
mattdm

@ Jörg W Mittag - Ayrıca, sistem kütüphanelerini diğer platformdan da hazır bulundurmanız gerekiyordu. Bu , AutoZone'a karşı davalarının temeli olabilir . Ama dürüstçe, detayları unutuyorum ve daha fazla umrumda değil. :)
mattdm

Yani esasen söylediğiniz şey, eğer işletim sistemi X, işletim sistemi Y ile aynı hizmetleri sağlıyorsa, o zaman her iki durumda da bir ikili çalışabilir. Bu doğrudur, ancak sistem X için kasıtlı bir çaba gerektirir. Herhangi bir işletim sisteminin OS X ile bu şekilde uyumlu olduğundan habersiz.
Thorbjørn Ravn Andersen

bitrotten? Kendimi göstereceğim.
GnP,

3

Herkese çok katılıyorum, ancak şunu eklemek isterim ki, bu önemli bir zaman ve çaba gerektirse de, Wine'ı geliştirmek için harcadığı kadar olmazdı.

Wine geliştirmedeki zorluğun büyük bir kısmı, kapalı kaynaklı bir işletim sisteminden ikili bir biçimde yerleştirildikleri ve sistem çağrılarının MANY'sinin belgelenmemiş olmasıdır. Esasen işletim sistemini yeniden yapılandırmak zorunda kaldılar.

Biri bunu bir açık işletim sisteminden diğer bir açık işletim sistemine yapacak olsaydı, uyumluluk katmanı eşdeğer bir yerel sistem çağrısı durumunda diğer işletim sisteminden oldukça kopyalanıp yapıştırılabildiğinden, muhtemelen zamanın 1 / 10'unda gerçekleştirilebilirdi. yok Tabii ki, POSIX dünyasındaki çoğu durumda, yerel bir arama yapılabilir.

Dikkat edilecek diğer bir proje ise ReactOS, esasen Windows'un tam olarak ikilik uyumlu bir sürümünü oluşturdukları ... Wine'a gerek yok.


1

MakOS'ta teknik olarak uygulanabilir ancak önemli bir çaba olmadan değil, çabanın bir kısmı zaten bizim için yapıldı.

  • Hem macOS hem de yeniden markalı Red Hat Enterprise Linux, UNIX 03 sertifikasına sahiptir. Bu, prensip olarak POSIX çağrılarının aynı API'ye sahip olması gerektiği anlamına gelir.
  • Hem macOS hem de Linux, amd64 platformu için System V ABI kullanır. Bu, amd64 macOS ve Linux için ABI ve API ile uyumlu olması gerektiği anlamına gelir.
  • macOS Mach-O'yu yerel yürütülebilir formatı olarak kullanırken Linux ELF'yi kullanır. Bu, işleri kolaylaştırır, çünkü yürütülebilir dosya formatı, uyumluluk katmanının çağrılıp çağrılmayacağını ayırt etmek için kullanılabilir. Bu binfmt_miscolsa gibi bir şey gerektirir .
  • Tam olarak bu sağlayan bir üçüncü taraf macOS çekirdek uzantısı var. Şimdi ELF'i yüklemek için makosu ikna etmenin bir yolunu bulduk, ELF'imizi yükleyip ld-linux.soçalıştıracak bir Mach-O çalıştırılabilir özelliğine ihtiyacımız var.

Şimdi ihtiyacımız olan, en azından ld-linux.soaşağıdakileri yapabilen bir özel :

  • Bir Mach-O çalıştırılabilir veya dyldkendisi olmak,
  • Linux ELF dosyalarını belleğe doğru adresten yükleyebilir,
  • Umarım MacOS olanlar (örneğin Linux soname'ini eşleme yeteneği /lib/libc.so.6için /lib/libSystem.B.dylibeşleşen bir ELF bulunmazsa biz MacOS kütüphaneleri yeniden böylece, Mach-O gelir) ve yük

Sadece doğrudan sistem çağrıları yapmayan ELF üzerindeki yükleyici ile çalışma şansı yüksektir, ancak sistem çağrıları içeren ELF çalışmayabilir. Faydalı olabilecek ikinci bir bileşen, bu Linux sistemlerini yakalayan ve onları macOS olanlarına eşleyen bir çekirdek uzantısı olacaktır. Masaüstü kullanımlarından itibaren, Linux grafik çağrılarını OpenGL.frameworkve ile eşlemek için özel mesa uygulaması gerekir Metal.framework.


0

Bunun çok yardımcı olacağı bazı Linux uygulamaları var. FPGA tarafında, Quartus ve Vivado, Linux altında çalışan programlara güzel bir örnektir ve kendileri veya en yeni FPGA'ları hedef alan benzer programlar için kaynak kodu bulunma olasılığı düşüktür.

Sanırım sorunuzun basit cevabı şudur: MacOS'ta kaynağınız olduğu yerde yeniden derleyin ve vaktiniz varsa kabiliyeti sağlamak için bir grup oluşturun - ve bu zaman alıcı bir iş olacaktı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.