Khả năng tương thích nhị phân giữa Mac OS X và Linux


27

Nắm bắt chính mình, câu hỏi này có thể sẽ xuất hiện ngây thơ và / hoặc ngu ngốc, vì tôi tương đối mới đối với hoạt động bên trong của unix như các hệ thống, và lập trình nói chung.

Sẳn sàng? Được! Tôi sẽ trải qua khoảng 3 cấp độ lố bịch, tăng dần khi tôi đi cùng.


Chúng tôi có hai hệ thống có phần cứng tương tự nhau (điểm chính là bộ xử lý, chúng ta hãy nói một bộ đôi intel core 2 tiêu chuẩn).

Một cái đang chạy (chèn distro linux của bạn vào đây: Ubuntu sẽ được sử dụng từ đó) và cái còn lại đang chạy, giả sử Mac OS X.

Một người biên dịch một chương trình tương đương, Chúng ta hãy nói một cái gì đó như:

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

Mã này cực kỳ đơn giản, vì tôi chưa muốn xem xét ý nghĩa của các thư viện dùng chung.

Khi được biên dịch trên các hệ thống tương ứng. Không phải sự khác biệt chính giữa đầu ra là vấn đề của ELF so với Mach-O sao? Nếu ai đó loại bỏ từng nhị phân của định dạng, để lại một nhị phân phẳng, các hướng dẫn máy đã tháo rời có giống nhau không? (có lẽ một vài khác biệt tùy thuộc vào thói quen / xu hướng của trình biên dịch).

1.) Nếu một người phát triển một chương trình để đóng gói lại nhị phân phẳng được tạo ra từ hệ thống Ubuntu của chúng tôi, theo định dạng Mach-O, liệu nó có chạy trong hệ thống Mac OS X không? Sau đó, nếu một người chỉ có tệp nhị phân được biên dịch của chương trình được cho là ở trên và một người có công cụ thần bí này để đóng gói lại các nhị phân phẳng, liệu các chương trình đơn giản có thể chạy trên hệ thống Mac OS X không?


Bây giờ hãy để chúng tôi đưa nó một chút nữa.

Bây giờ chúng tôi có một chương trình với nguồn như:

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

2.) Giả sử chương trình này được biên dịch và liên kết tĩnh, liệu chương trình ma thuật của chúng ta vẫn có thể đóng gói lại nhị phân thô ở định dạng Mach-O và nó có hoạt động trên mac os X không? Xem như không cần phải dựa vào bất kỳ nhị phân nào khác, (trong đó hệ thống mac sẽ không có trong trường hợp này)


Và bây giờ cho cấp độ cuối cùng;

3.) Điều gì sẽ xảy ra nếu chúng ta sử dụng chương trình được cho là này để chuyển đổi tất cả các thư viện chia sẻ cần thiết sang định dạng Mach-O, sau đó thay vào đó biên dịch chương trình ở trên bằng liên kết động. Chương trình vẫn sẽ thành công để chạy?

Đó nên là bây giờ, rõ ràng từng bước vô lý dựa vào cơ sở trước đó, thậm chí có ý nghĩa. Vì vậy, nếu trụ cột đầu tiên bị phá hủy, tôi nghi ngờ sẽ có nhiều công đức cho các tầng còn lại.

Tôi chắc chắn sẽ không đi xa đến mức nghĩ về điều này với các chương trình có GUI. Hệ thống cửa sổ có thể sẽ là một vấn đề đau đầu khác. Tôi chỉ xem xét các chương trình dòng lệnh ở giai đoạn này.

Bây giờ, tôi mời cả thế giới sửa lỗi cho tôi, và nói cho tôi biết mọi thứ sai với dòng suy nghĩ ngớ ngẩn của tôi.


tương đương với Wine cho các nhị phân OS X là Darling: darling.dolezel.info
strugee

Câu trả lời:


25

Bạn quên một điều cốt yếu, đó là chương trình của bạn sẽ phải tương tác với hệ điều hành để làm bất cứ điều gì thú vị.

Các quy ước khác nhau giữa Linux và OS X, do đó, cùng một nhị phân không thể chạy như hiện tại mà không cần có một đoạn mã phụ thuộc hệ điều hành để có thể tương tác với nó. Nhiều thứ trong số này được ẩn đi trong các thư viện mà sau đó bạn cần liên kết và điều đó có nghĩa là chương trình của bạn cần có thể liên kết được và liên kết cũng khác nhau giữa hai hệ thống.

Và vì vậy nó tiếp tục và tiếp tục. Những gì trên bề mặt nghe có vẻ giống như làm điều tương tự là rất khác nhau trong các chi tiết thực tế.


5
Điều này về cơ bản là chính xác vấn đề là gì, nhưng vấn đề không thực sự là các thư viện (có thể được kéo theo) mà là các cuộc gọi hệ thống, là những yêu cầu đối với nhân hệ điều hành. Nếu HĐH không cung cấp giao diện gọi hệ thống tương thích, bạn sẽ không gặp may.
mattdm

1
Aah, điều này thật tuyệt vời Đây chính xác là loại chỉnh sửa mang tính xây dựng mà tôi đã hy vọng. Cảm ơn rất nhiều: D Bạn có thể cho tôi biết thêm về các cuộc gọi hệ thống được cho là này hoặc chuyển hướng tôi đến một nơi nào đó để tôi có thể tìm hiểu thêm về chúng không?
zec

3
Họ không "được cho là", họ thực tế. :) Đây là một khởi đầu tốt: ibm.com/developerworks/linux/l
Library / l

7
Điều đó nói rằng, ý tưởng "điên rồ" của bạn không hoàn toàn không thể. Chỉ là rất nhiều công việc. Dự án Wine về cơ bản là để chạy các nhị phân MS Windows trên Linux (hoặc OS X). Nó cung cấp một lớp dịch cho các cuộc gọi hệ thống. wiki.winehq.org/ Kẻ
mattdm

1
Chà, tôi đoán nó sẽ không hoàn toàn bất khả thi, nhưng tôi cũng không ngờ nó lại đơn giản như tôi mô tả. Tôi đã viết câu hỏi với ý định được sửa chữa. Đôi khi điều này có vẻ như là một phương pháp hiệu quả hơn để đi vào trọng tâm của vấn đề hơn là hỏi một câu hỏi trực tiếp, chẳng hạn như "Làm cách nào để chuyển đổi nhị phân linux để chạy trên Mac OS". Ngoài ra tôi đã sử dụng rượu vang theo thời gian, nhưng tôi chưa bao giờ thực sự suy nghĩ về cách nó hoạt động trước đây, tôi nghĩ rằng đôi khi tôi sẽ xem xét nó.
zec

17

Điều này là có thể làm được nếu ai đó muốn dành đủ thời gian để thực hiện nó. Các dự án Em yêu đang nỗ lực này, mặc dù thời điểm viết bài này, nó ở trong tình trạng khá nguyên thủy.

Nó đã được thực hiện thành công trước đây trên các nền tảng khác:

  • Solaris và UnixWare bao gồm một chương trình trợ giúp được gọi là lxrunhoạt động giống như sudo: bạn chuyển tên và tham số thực thi của mình cho người trợ giúp và nó sửa chữa mọi thứ một cách linh hoạt để người thực thi có thể nói chuyện với HĐH. Các trang web chính thức (xuống, liên kết lưu trữ ) cho biết họ đang bitrotted .

  • Nhân của Linux đã từng có một tính năng gọi là iBCS đã làm ngược lại, ngoại trừ việc nó không cần người trợ giúp vì hạt nhân nhận ra các nhị phân "nước ngoài" trực tiếp. Nó rơi vào tình trạng khó khăn trong loạt phát triển kernel 2.3 , rất có thể là do cuộc chiến máy chủ Unix nhỏ về cơ bản đã kết thúc khi 2.4 xuất hiện.

  • Hạt nhân của FreeBSD có thể được cấu hình để nhận ra các nhị phân Linux và chạy chúng như thể chúng là bản địa. Tính năng này dường như có hình dạng tốt hơn so với hai tính năng trên.

    OpenBSD và NetBSD có các tính năng tương tự.

OS X có rất nhiều FreeBSD trong đó , vì vậy việc hỗ trợ Linux có thể đơn giản.


2
Một trong những lý do đây không phải là vấn đề lớn đối với các chương trình Linux → các nền tảng khác là: không có ứng dụng nào đáng kể chỉ dành cho Linux mà nguồn không có sẵn. Bạn muốn chạy chương trình của mình trên OS X hoặc Solaris, biên dịch lại nó và bạn sẽ đi. Có thể có một chút chuyển để làm nơi mã được viết theo cách riêng của Linux, nhưng nhìn chung đó không phải là nhiều công việc, đặc biệt là so với việc duy trì lớp tương thích. Khả năng tương thích Linux của FreeBSD là một vấn đề lớn khi Netscape là phân phối nhị phân chỉ dành cho Linux và có lẽ vẫn được sử dụng cho Adobe Flash Player.
mattdm

@ Jorg W Mittag - đồng thời, bạn cần có sẵn các thư viện hệ thống từ nền tảng khác. Đây có thể là cơ sở cho vụ kiện của họ chống lại AutoZone. Nhưng thật lòng tôi quên chi tiết và hầu như không quan tâm nữa. :)
mattdm

Vì vậy, những gì bạn nói về cơ bản là, nếu hệ điều hành X cung cấp các dịch vụ giống như hệ điều hành Y, thì một nhị phân có thể chạy theo cả hai. Điều này là đúng, nhưng đòi hỏi một nỗ lực có chủ ý cho hệ thống X. Tôi không biết bất kỳ hệ điều hành nào tương thích theo cách này với OS X.
Thorbjørn Ravn Andersen

bitr'd? Tôi sẽ thể hiện ra ngoài.
GnP

3

Tôi khá đồng ý với tất cả mọi người, nhưng tôi muốn nói thêm rằng, trong khi việc này sẽ tốn một lượng thời gian và công sức đáng kể, nó sẽ không nhiều như đã mất để phát triển Wine.

Phần lớn khó khăn trong phát triển Wine là họ đang chuyển một định dạng nhị phân từ một hệ điều hành nguồn đóng và NHIỀU cuộc gọi hệ thống không có giấy tờ. Về cơ bản họ phải thiết kế ngược hệ điều hành.

Nếu ai đó thực hiện việc này từ một hệ điều hành mở này sang một hệ điều hành mở khác, họ có thể sẽ hoàn thành nó trong 1/10 thời gian, vì lớp tương thích hoàn toàn có thể được sao chép / dán từ hệ điều hành khác nếu một cuộc gọi hệ thống gốc tương đương không tồn tại Tất nhiên, trong hầu hết các trường hợp trên toàn thế giới POSIX, sẽ có sẵn một cuộc gọi riêng.

Một dự án đáng chú ý khác là ReactOS, về cơ bản họ đang tạo ra một phiên bản Windows tương thích nhị phân đầy đủ ... không cần Wine.


1

Đó là kỹ thuật có thể thực hiện được trong macOS nhưng không phải không có nỗ lực đáng kể, mặc dù một số nỗ lực đã được thực hiện cho chúng tôi.

  • Cả macOS và Red Hat Enterprise Linux được đổi thương hiệu đã được chứng nhận UNIX 03. Điều này có nghĩa là về nguyên tắc các cuộc gọi POSIX phải có cùng API.
  • Cả macOS và Linux đều sử dụng System V ABI cho nền tảng amd64. Điều này có nghĩa là đối với amd64 macOS và Linux nên có ABI và API tương thích.
  • macOS sử dụng Mach-O làm định dạng thực thi riêng trong khi Linux sử dụng ELF. Điều này làm cho mọi thứ dễ dàng hơn, vì định dạng tệp thực thi có thể được sử dụng để phân biệt xem có nên gọi lớp tương thích hay không. Điều này sẽ đòi hỏi một cái gì đó như binfmt_miscmặc dù.
  • Tồn tại một phần mở rộng kernel macOS của bên thứ ba cung cấp chính xác điều đó. Bây giờ chúng tôi có một cách để tải thuyết phục macOS để tải ELF, chúng tôi cần sự đặc biệt của chúng tôi ld-linux.so, đó là bản thực thi Mach-O sẽ tải ELF của chúng tôi và chạy nó.

Bây giờ những gì chúng ta cần là ít nhất là một đặc biệt ld-linux.socó thể làm như sau:

  • Hãy là người thực thi Mach-O hoặc dyldchính nó,
  • Có thể tải các tệp ELF của Linux vào bộ nhớ theo đúng địa chỉ,
  • Hy vọng có khả năng ánh xạ soname Linux sang macOS (ví dụ /lib/libc.so.6đến /lib/libSystem.B.dylib) và tải Mach-O tương ứng khi không tìm thấy ELF phù hợp, vì vậy chúng tôi có thể sử dụng lại các thư viện macOS

Chỉ với trình tải trên ELF không tạo ra các tòa nhà trực tiếp có cơ hội hoạt động tốt, nhưng ELF với các tòa nhà cao tầng có thể không hoạt động. Một thành phần thứ hai có thể hữu ích sẽ là một phần mở rộng kernel bắt các tòa nhà Linux đó và ánh xạ chúng thành các macOS. Khi sử dụng máy tính để bàn, việc triển khai mesa đặc biệt là cần thiết để ánh xạ các cuộc gọi đồ họa Linux đến OpenGL.frameworkMetal.framework.


0

Có một số ứng dụng Linux chuyên dụng mà điều này sẽ giúp ích rất nhiều. Về phía FPGA, Quartus và Vivado là những ví dụ điển hình về các chương trình chạy trên Linux và không có khả năng có sẵn mã nguồn cho chúng hoặc các chương trình tương tự nhắm vào các GPU mới nhất.

Tôi nghĩ rằng câu trả lời đơn giản cho câu hỏi của bạn là: biên dịch lại trên MacOS nơi bạn có nguồn và tạo thành một nhóm để cung cấp khả năng nếu bạn có thời gian - và đó sẽ là một nhiệm vụ tốn thời gian.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.