ความเข้ากันได้ไบนารีระหว่าง Mac OS X และ Linux


27

รั้งตัวเองคำถามนี้จะดูเหมือนไร้เดียงสาและ / หรือโง่เขลาเพราะฉันค่อนข้างใหม่กับการทำงานภายในของยูนิกซ์เช่นระบบและการเขียนโปรแกรมโดยทั่วไป

พร้อมหรือยัง? ตกลง! ฉันจะผ่านความน่าหัวเราะประมาณ 3 ระดับเพิ่มขึ้นเมื่อฉันไปตาม


เรามีสองระบบที่มีฮาร์ดแวร์ที่คล้ายกัน (จุดหลักคือหน่วยประมวลผลให้เราพูด Intel Core 2 duo มาตรฐาน)

หนึ่งกำลังทำงาน (แทรกของลินุกซ์ distro ของคุณที่นี่: Ubuntu จะใช้ต่อจากนี้ไป) และอื่น ๆ ที่กำลังทำงานสมมติว่า Mac OS X

หนึ่งรวบรวมโปรแกรมที่เทียบเท่าให้เราพูดสิ่งที่ชอบ:

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

รหัสนั้นง่ายมากเพราะฉันไม่ต้องการพิจารณาความหมายของไลบรารีที่แชร์

เมื่อรวบรวมในระบบที่เกี่ยวข้อง ความแตกต่างที่สำคัญระหว่างเอาท์พุทเป็นเรื่องของ ELF กับ Mach-O ไม่ใช่หรือ? หากมีใครที่จะตัดเลขฐานสองของการจัดรูปแบบออกจากไบนารีแบบแบนคำสั่งของเครื่องที่ถอดประกอบจะไม่เหมือนเดิมหรือไม่ (อาจมีความแตกต่างเล็กน้อยขึ้นอยู่กับพฤติกรรม / แนวโน้มของผู้แปล)

1. )หากมีการพัฒนาโปรแกรมเพื่อบรรจุหีบห่อไบนารีแบบแบนที่ผลิตจากระบบ Ubuntu ของเราในการจัดรูปแบบ Mach-O มันจะทำงานในระบบ Mac OS X หรือไม่? จากนั้นถ้ามีเพียงไบนารีที่คอมไพล์ของโปรแกรมที่ควรด้านบนและอีกอันหนึ่งมีเครื่องมือลึกลับสำหรับการทำ repackaging แฟลตไบนารีโปรแกรมที่เรียบง่ายจะสามารถทำงานบนระบบ Mac OS X ได้หรือไม่?


ตอนนี้ให้เรานำมันไปอีกหน่อย

ตอนนี้เรามีโปรแกรมที่มีซอร์สเช่น:

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

2. )สมมติว่าโปรแกรมนี้ถูกคอมไพล์และเชื่อมโยงแบบคงที่โปรแกรมเวทย์มนตร์ของเราจะยังสามารถบรรจุไบนารีแบบดิบในรูปแบบ Mach-O และทำงานกับ mac os X ได้หรือไม่? เห็นว่ามันไม่จำเป็นต้องพึ่งพาไบนารีอื่น ๆ (ซึ่งระบบ Mac จะไม่มีในกรณีนี้)


และตอนนี้สำหรับระดับสุดท้าย

3. )จะเกิดอะไรขึ้นถ้าเราใช้โปรแกรมนี้ในการแปลงไลบรารีที่ใช้ร่วมกันที่จำเป็นทั้งหมดให้เป็นรูปแบบ Mach-O จากนั้นจึงรวบรวมโปรแกรมข้างต้นด้วยการเชื่อมโยงแบบไดนามิกแทน โปรแกรมยังคงทำงานได้สำเร็จหรือไม่

ที่ควรจะเป็นสำหรับตอนนี้เห็นได้ชัดว่าในแต่ละขั้นตอนของความไร้สาระอาศัยอยู่บนฐานก่อนหน้านี้แม้จะทำให้รู้สึก ดังนั้นหากเสาแรกถูกทำลายฉันสงสัยว่าจะมีบุญมากสำหรับเทียร์ที่เหลือ

แน่นอนว่าฉันจะไม่ไปคิดเรื่องนี้ด้วยโปรแกรมที่มี GUI อยู่ในใจ ระบบ Windowing อาจจะปวดหัวทั้งหมด ฉันกำลังพิจารณาโปรแกรมบรรทัดคำสั่งในขั้นตอนนี้เท่านั้น

ตอนนี้ฉันเชิญโลกให้มาแก้ไขฉันและบอกทุกอย่างที่ผิดกับความคิดที่ไร้สาระของฉัน


เทียบเท่าของ Wine สำหรับ OS X คือ Darling: darling.dolezel.info
strugee

คำตอบ:


25

คุณลืมสิ่งสำคัญอย่างหนึ่งนั่นคือโปรแกรมของคุณจะต้องโต้ตอบกับระบบปฏิบัติการเพื่อทำสิ่งที่น่าสนใจ

อนุสัญญามีความแตกต่างระหว่าง Linux และ OS X ดังนั้นไบนารีเดียวกันไม่สามารถรันตามที่เป็นอยู่ได้โดยไม่ต้องมีโค้ดที่ขึ้นกับระบบปฏิบัติการเพื่อให้สามารถโต้ตอบกับมันได้ หลายสิ่งเหล่านี้ซ่อนอยู่ในห้องสมุดซึ่งคุณต้องเชื่อมโยงและนั่นหมายความว่าโปรแกรมของคุณจะต้องสามารถเชื่อมโยงได้และการเชื่อมโยงก็แตกต่างกันระหว่างทั้งสองระบบ

และมันก็เกิดขึ้นเรื่อย ๆ สิ่งที่อยู่บนพื้นผิวดูเหมือนจะทำสิ่งเดียวกันแตกต่างกันมากในรายละเอียดที่เกิดขึ้นจริง


5
นี่เป็นสิ่งที่ถูกต้องตามปกติว่าปัญหาคืออะไร แต่ปัญหาไม่ได้เป็นไลบรารีจริงๆ (ซึ่งสามารถลากไปได้) แต่การเรียกของระบบซึ่งเป็นการร้องขอไปยังเคอร์เนลระบบปฏิบัติการ หากระบบปฏิบัติการไม่มีส่วนต่อประสานการโทรของระบบคุณจะโชคไม่ดี
mattdm

1
อ้านี่ยอดเยี่ยมมาก นี่คือการแก้ไขเชิงสร้างสรรค์ที่ฉันหวังไว้ ขอบคุณมัด: D คุณช่วยบอกฉันเพิ่มเติมเกี่ยวกับการเรียกระบบเหล่านี้หรือเปลี่ยนเส้นทางฉันไปที่อื่นฉันสามารถเรียนรู้เพิ่มเติมเกี่ยวกับพวกเขา?
zec

3
พวกเขาไม่ได้ "ควร" พวกเขาเป็นจริง :) นี่เป็นจุดเริ่มต้นที่ดี: ibm.com/developerworks/linux/library/l-system-calls
mattdm

7
ที่กล่าวว่าความคิด "บ้า" ของคุณเป็นไปไม่ได้อย่างสมบูรณ์ แค่ทำงานมาก ๆ โครงการไวน์เป็นสิ่งสำคัญสำหรับการเรียกใช้ไบนารี่ MS Windows บน Linux (หรือ OS X) มันมีเลเยอร์การแปลสำหรับการเรียกระบบ wiki.winehq.org/…
mattdm

1
ฉันคิดว่ามันคงเป็นไปไม่ได้เลย แต่ฉันก็ไม่ได้คาดหวังว่ามันจะง่ายเหมือนที่ฉันอธิบาย ฉันเขียนคำถามโดยมีความตั้งใจที่จะแก้ไข ในบางครั้งดูเหมือนว่าวิธีที่มีประสิทธิภาพมากขึ้นในการเข้าถึงหัวใจของเรื่องมากกว่าการถามคำถามโดยตรงเช่น "ฉันจะแปลงไบนารีลินุกซ์ให้ทำงานบน Mac OS ได้อย่างไร" นอกจากนี้ฉันเคยใช้ไวน์เป็นครั้งคราว แต่ฉันไม่เคยไตร่ตรองเกี่ยวกับวิธีการทำงานของมันมาก่อนฉันคิดว่าฉันจะเข้าไปดูในบางครั้งตอนนี้
zec

17

สิ่งนี้สามารถทำได้ถ้ามีคนต้องการใช้เวลามากพอที่จะทำให้มันเกิดขึ้น โครงการดาร์ลิ่งจะพยายามนี้แม้ว่าเช่นการเขียนนี้ก็อยู่ในสภาพดั้งเดิมสวย

มันทำได้สำเร็จมาก่อนบนแพลตฟอร์มอื่น:

  • Solaris และ UnixWare มีโปรแกรมตัวช่วยที่เรียกว่าlxrunซึ่งทำงานคล้ายsudoกัน: คุณส่งชื่อปฏิบัติการและพารามิเตอร์ไปยังผู้ช่วยและแก้ไขสิ่งต่าง ๆ แบบไดนามิกเพื่อให้โปรแกรมปฏิบัติการสามารถพูดคุยกับระบบปฏิบัติการได้ เว็บไซต์อย่างเป็นทางการ (ลดลง, การเชื่อมโยงข้อมูลที่เก็บ ) กล่าวว่ามันbitrotted

  • เคอร์เนลของ Linux เคยมีคุณสมบัติที่เรียกว่าiBCSซึ่งทำการย้อนกลับยกเว้นว่ามันไม่ต้องการตัวช่วยเพราะเคอร์เนลรู้จักไบนารี "ต่างชาติ" โดยตรง มันตกอยู่ในสภาพทรุดโทรมในระหว่างการพัฒนาชุดเคอร์เนล 2.3ส่วนใหญ่เป็นเพราะการต่อสู้เซิร์ฟเวอร์ Unix ขนาดเล็กเป็นหลักมากกว่าเมื่อ 2.4 ออกมา

  • เคอร์เนลของ FreeBSD สามารถกำหนดค่าให้รู้จักกับไบนารีลินุกซ์และเรียกใช้พวกเขาราวกับว่าพวกเขาเป็นคนพื้นเมือง ดูเหมือนว่าคุณสมบัตินี้จะมีรูปร่างที่ดีกว่าทั้งสองด้านบน

    OpenBSD และ NetBSD มีคุณสมบัติที่คล้ายกัน

OS X มี FreeBSD จำนวนมากอยู่ในนั้นดังนั้นการย้ายพอร์ตการสนับสนุน Linux อาจตรงไปตรงมา


2
หนึ่งในเหตุผลนี้ไม่ได้เป็นเรื่องใหญ่สำหรับโปรแกรม Linux →แพลตฟอร์มอื่น ๆ : ไม่มีแอพที่มีความสำคัญเฉพาะ Linux สำหรับแหล่งที่ไม่พร้อมใช้งาน คุณต้องการรันโปรแกรมของคุณบน OS X หรือ Solaris จากนั้นทำการคอมไพล์ใหม่และไปที่นั่นแล้ว อาจมีพอร์ตเล็กน้อยที่จะเขียนโค้ดในรูปแบบเฉพาะของ Linux แต่โดยทั่วไปแล้วมันไม่ได้ทำงานมากนักโดยเฉพาะเมื่อเทียบกับการรักษาเลเยอร์ความเข้ากันได้ ความเข้ากันได้ของ Linux ของ FreeBSD เป็นเรื่องใหญ่เมื่อ Netscape เป็นไบนารีที่แจกจ่ายสำหรับ Linux เท่านั้นและอาจยังคงใช้สำหรับ Adobe Flash Player
mattdm

@ Jörg W Mittag - นอกจากนี้คุณต้องมีไลบรารีระบบจากแพลตฟอร์มอื่นที่มีอยู่ นี่อาจเป็นพื้นฐานของการฟ้องร้องต่อต้าน AutoZone แต่จริงๆแล้วฉันลืมรายละเอียดและไม่ใส่ใจอีกต่อไป :)
mattdm

ดังนั้นสิ่งที่คุณพูดเป็นหลักว่าหากระบบปฏิบัติการ X ให้บริการเช่นเดียวกับระบบปฏิบัติการ Y แล้วไบนารีสามารถทำงานภายใต้ทั้งสอง นี่เป็นเรื่องจริง แต่ต้องใช้ความพยายามอย่างรอบคอบสำหรับระบบ X ฉันไม่ทราบว่าระบบปฏิบัติการใด ๆ ที่เข้ากันได้กับ OS X นี้
Thorbjørn Ravn Andersen

bitrotten? ฉันจะแสดงตัวเองออกมา
GnP

3

ฉันเห็นด้วยกับทุกคน แต่ฉันต้องการเพิ่มสิ่งนี้แม้ว่าจะต้องใช้เวลาและความพยายามเป็นจำนวนมาก แต่ก็ไม่ได้ใกล้เคียงกับการพัฒนาไวน์มากนัก

สิ่งที่ยากที่สุดในการพัฒนา Wine คือพวกเขากำลังย้ายรูปแบบไบนารีจากระบบปฏิบัติการแบบปิดแหล่งข้อมูลและ MANY ของการเรียกใช้ระบบจะไม่มีเอกสาร พวกเขาต้องทำวิศวกรรมระบบปฏิบัติการ

หากมีคนทำเช่นนี้จากระบบปฏิบัติการแบบเปิดหนึ่งไปยังอีกระบบปฏิบัติการเปิดพวกเขามีโอกาสที่จะทำมันได้ในเวลา 1/10 ของเวลาเนื่องจากเลเยอร์ความเข้ากันได้อาจคัดลอก / วางจากระบบปฏิบัติการอื่น ๆ ไม่มีอยู่ แน่นอนว่าในกรณีส่วนใหญ่ทั่วโลก POSIX จะมีการโทรแบบพื้นเมือง

โครงการบันทึกย่ออีกโครงการหนึ่งคือ ReactOS โดยที่พวกเขากำลังสร้าง Windows เวอร์ชันที่เข้ากันได้กับไบนารีทั้งหมด ... ไม่จำเป็นต้องใช้ Wine


1

เป็นเทคนิคที่ทำได้ใน macOS แต่ไม่ได้ใช้ความพยายามอย่างมีนัยสำคัญถึงแม้ว่าความพยายามบางอย่างได้ทำมาแล้วสำหรับเรา

  • ทั้ง macOS และ Red Hat Enterprise Linux ได้รับการรับรอง UNIX 03 ซึ่งหมายความว่าในหลักการการเรียก POSIX ควรมี API เดียวกัน
  • ทั้ง macOS และ Linux ใช้ System V ABI สำหรับแพลตฟอร์ม amd64 ซึ่งหมายความว่าสำหรับ amd64 macOS และ Linux ควรมี ABI และ API ที่เข้ากันได้
  • macOS ใช้ Mach-O เป็นรูปแบบปฏิบัติการดั้งเดิมในขณะที่ Linux ใช้ ELF สิ่งนี้ทำให้สิ่งต่าง ๆ ง่ายขึ้นเนื่องจากรูปแบบไฟล์ปฏิบัติการสามารถใช้แยกแยะได้ว่าควรเรียกเลเยอร์ความเข้ากันได้ นี้จะต้องมีบางสิ่งบางอย่างเช่นbinfmt_miscแม้ว่า
  • มีส่วนขยายเคอร์เนล macOS ของบุคคลที่สามที่ให้สิ่งนั้นอย่างแน่นอน ตอนนี้เรามีวิธีในการโหลดโน้มน้าวใจ macOS ให้โหลด ELF เราต้องการสิ่งพิเศษของเราld-linux.soซึ่งตัวเองเป็นปฏิบัติการ Mach-O ที่จะโหลด ELF ของเราและเรียกใช้มัน

ตอนนี้สิ่งที่เราต้องการอย่างน้อยพิเศษld-linux.soที่สามารถทำต่อไปนี้:

  • เป็นปฏิบัติการ Mach-O หรือdyldตัวเอง
  • สามารถโหลดไฟล์ Linux ELF ลงในหน่วยความจำได้ตามที่อยู่ที่ถูกต้อง
  • หวังว่าจะมีความสามารถในการ map ลินุกซ์ soname เพื่อ MacOS คน (ตัวอย่างเช่น/lib/libc.so.6การ/lib/libSystem.B.dylib) และโหลดสอดคล้อง Mach-O เมื่อมีการจับคู่เอลฟ์ไม่พบเพื่อให้เราสามารถนำมาใช้ห้องสมุด MacOS

ด้วยตัวโหลดนั้นเหนือเอลฟ์ที่ไม่สร้าง syscalls โดยตรงมีโอกาสที่ดีในการทำงาน แต่เอลฟ์ที่มี syscalls อาจไม่ทำงาน องค์ประกอบที่สองที่อาจเป็นประโยชน์จะเป็นส่วนขยายเคอร์เนลที่จับ syscalls Linux เหล่านั้นและแมปไปยัง macOS ในฐานะของการใช้สก์ท็อป, การดำเนินงานเมซ่าพิเศษเป็นสิ่งจำเป็นเพื่อ map ลินุกซ์กราฟิกโทรไปและOpenGL.frameworkMetal.framework


0

มีแอพลีนุกซ์เฉพาะจำนวนมากซึ่งนี่จะช่วยได้มาก ในด้านของ FPGA นั้น Quartus และ Vivado เป็นตัวอย่างที่ดีของโปรแกรมที่ทำงานภายใต้ Linux และไม่น่าจะมีซอร์สโค้ดสำหรับพวกเขาหรือโปรแกรมที่คล้ายกันซึ่งมีเป้าหมายไปที่ FPGA ล่าสุด

ฉันคิดว่าคำตอบที่ง่ายสำหรับคำถามของคุณคือ: คอมไพล์ใหม่บน MacOS ที่คุณมีแหล่งที่มาและจัดกลุ่มเพื่อให้ความสามารถถ้าคุณมีเวลา - และมันจะเป็นงานที่ต้องใช้เวลามาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.