Điều gì làm cho các chương trình OSX không chạy được trên Linux?


40

Tôi biết có nhiều sự khác biệt giữa OSX và Linux, nhưng điều gì làm cho chúng hoàn toàn khác nhau, khiến chúng không tương thích về cơ bản?


5
Chà, tại sao bạn lại mong đợi các chương trình OSX có thể chạy được trên Linux? Điều gì về hai hệ điều hành cụ thể này khiến bạn đề cập đến chúng trong câu hỏi, nhưng không phải bất kỳ hệ điều hành nào khác cũng không thể chạy các chương trình OSX?
wrosecrans

6
Về cơ bản đó là câu hỏi của tôi. OSX chạy trên kernel unix. Tôi đã tự hỏi điều gì về nó làm cho nó đặc biệt so với các unix /
linux khác

6
Có những quả táo nhỏ bí mật bên trong các nhị phân mà chỉ máy Mac mới có thể nhìn thấy 
bobobobo

Nói chung, các hệ điều hành khác nhau không thể chạy nhị phân của nhau; đó là lý do tại sao việc phân phối phần mềm dưới dạng tarball nguồn phát triển xung quanh Unix. Cả MacOS và Linux đều không đặc biệt về mặt này: sẽ là một điều đặc biệt nếu có thể chạy các nhị phân của người khác. Nhận xét nâng cao hơn trả lời bình luận của wrosecrans là hoàn toàn thiếu quan điểm của nó. : /
Peter Cordes

Câu trả lời:


56

Toàn bộ ABI là khác nhau, không chỉ là định dạng nhị phân (Mach-O so với ELF) như sepp2k đã đề cập.

Ví dụ, trong khi cả Linux và Darwin / XNU (hạt nhân của OS X) đều sử dụng sctrên PowerPC và int 0x80/ sysenter/ syscalltrên x86 cho mục nhập tòa nhà, không có nhiều điểm chung từ đó.

Darwin chỉ đạo các số tòa nhà âm ở hạt nhân Mach và số tòa nhà dương ở hạt nhân nguyên khối BSD - xem xnu / osfmk / mach / syscall_sw.hxnu / bsd / kern / syscalls.master . Các số tòa nhà của Linux thay đổi theo kiến ​​trúc - xem linux / arch / powerpc / include / asm / unistd.h , linux / arch / x86 / include / asm / unistd_32.hlinux / arch / x86 / include / asm / unistd_64.h - nhưng tất cả đều không âm. Vì vậy, rõ ràng là số tòa nhà , tranh luận về tòa nhà , và thậm chí cả tòa nhà chọc trời tồn tại là khác nhau.

Các thư viện thời gian chạy C tiêu chuẩn cũng khác nhau; Darwin chủ yếu thừa hưởng libc của FreeBSD, trong khi Linux thường sử dụng glibc (nhưng có những lựa chọn thay thế, như eglibc và dietlibc và uclibc và Bionic).

Chưa kể rằng toàn bộ ngăn xếp đồ họa là khác nhau; bỏ qua toàn bộ thư viện Cacao Objective-C, các chương trình GUI trên OS X nói chuyện với WindowServer qua các cổng Mach, trong khi trên Linux, các chương trình GUI thường nói chuyện với máy chủ X qua các ổ cắm tên miền UNIX bằng giao thức X11. Tất nhiên, có những trường hợp ngoại lệ; bạn có thể chạy X trên Darwin và bạn có thể bỏ qua X trên Linux, nhưng các ứng dụng OS X chắc chắn không nói về X.

Giống như Wine, nếu ai đó đưa tác phẩm vào

  • triển khai bộ nạp nhị phân cho Mach-O
  • bẫy mọi tòa nhà chọc trời và chuyển đổi nó thành các tòa nhà thích hợp của Linux
  • viết thay thế cho các thư viện OS X như CoreFoundation khi cần
  • viết thay thế cho các dịch vụ OS X như WindowServer khi cần

sau đó có thể chạy một chương trình OS X "nguyên bản" trên Linux. Nhiều năm trước, Kyle Moffet đã thực hiện một số công việc cho mục đầu tiên, tạo ra một nguyên mẫu binfmt_mach-o cho Linux, nhưng nó chưa bao giờ được hoàn thành và tôi không biết về các dự án tương tự nào khác.

(Theo lý thuyết này là hoàn toàn có thể, và những nỗ lực tương tự đã được thực hiện nhiều lần; ngoài Rượu, Linux chính nó có hỗ trợ cho việc chạy mã nhị phân từ UNIXes khác như HP-UX và Tru64, và Glendix mục tiêu dự án để mang lại Plan 9 tương thích để Linux.)


Ai đó đã nỗ lực triển khai trình tải nhị phân Mach-O và trình dịch API cho Linux!

shinh / maloader - GitHub sử dụng cách tiếp cận giống như Wine khi tải nhị phân và bẫy / dịch tất cả các cuộc gọi thư viện trong không gian người dùng. Nó hoàn toàn bỏ qua các tòa nhà chọc trời và tất cả các thư viện liên quan đến đồ họa, nhưng đủ để có nhiều chương trình điều khiển hoạt động.

Darling xây dựng dựa trên trình tải xuống, thêm thư viện và các bit thời gian chạy hỗ trợ khác.


Những nỗ lực mới sẽ có nhiều khả năng sử dụng binfmt_misc hơn là có bất kỳ mã hạt nhân nào của họ, phải không?
SamB

@SamB: Bạn đã bao giờ thử thiết lập trình xử lý binfmt_misc trong một chroot chưa? Tôi nghĩ việc xử lý các định dạng nhị phân cho các hệ thống tương tự UNIX khác trong kernel là khá hợp lý.
ephemient

1
Câu hỏi của tôi là; Nếu bạn đã nhận được các tệp nhị phân OS X để chạy trên Linux, tại sao bạn cần phải viết lại các thư viện và dịch vụ của OS X? Họ sẽ không chạy không thay đổi trên Linux vào thời điểm đó? Có phải chỉ là về vấn đề pháp lý?
Hubro

20

Tại sao các ứng dụng OSX sẽ không chạy tự nhiên trên linux:

Trước hết OSX sử dụng định dạng nhị phân khác với Linux, vì vậy Linux không thể thực thi các tệp nhị phân được biên dịch cho OSX (giống như cách nó không thể thực thi các tệp nhị phân được biên dịch cho Windows hoặc BSD).

Thứ hai, nếu bạn đang nói về các ứng dụng GUI, bộ công cụ GUI của Apple Ca cao a) chỉ khả dụng cho OSX và b) không chạy trên X11.

Tại sao không có rượu tương đương cho các ứng dụng OSX:

Rất nhiều công việc phải được thực hiện trước khi rượu thậm chí có thể sử dụng được một nửa. Vì không có nhiều nhu cầu về tương đương OSX, nên chưa có ai đầu tư cùng một lượng nỗ lực vào một dự án như vậy.


Bạn biết đấy, tôi thậm chí không nhận ra rằng OSX / unix không sử dụng cùng định dạng nhị phân. Bạn có một liên kết đến thông tin nhiều hơn về điều đó?
Falmarri

Falmarri: OSX sử dụng định dạng Mach-O , Linux sử dụng ELF .
sepp2k

1
@Falmarri Không phải tất cả các UNIX đều sử dụng cùng một định dạng nhị phân và mặc dù gần như tất cả các UNIX hiện đại đều sử dụng ELF, bạn vẫn không thể chạy nhị phân từ UNIX này sang UNIX khác. Heck, tôi không nghĩ FreeBSD thậm chí còn đảm bảo rằng bạn có thể chạy một chương trình cho 7.x trên 8.x hoặc ngược lại, trong khi một chương trình Linux cho 1.0 vẫn phải chạy trên 2.6.x.
ephemient

5

Lý do quan trọng nhất khiến các ứng dụng OS X không chạy được trên Linux là vì các hệ điều hành đó đã sử dụng các tòa nhà khác nhau.

Một số câu trả lời trước đây đã đề cập đến các thư viện nhưng thực tế không phải vậy - Core Foundation phần lớn được Apple mở nguồn dưới tên CFLite và dễ dàng di chuyển tới bất kỳ nền tảng nào (phiên bản Windows của iTunes thực sự nằm trên một cổng Windows của Core Foundation và với Một số chỉnh sửa trình biên dịch, bạn có thể trực tiếp tạo CFLite bằng cách sử dụng clang trên bản phân phối Linux) và cũng có những nỗ lực nguồn mở để chuyển môi trường Objective-C, chủ yếu là Foundation và AppKit sang Linux, đặc biệt là GNUstep, một triển khai GNU của OpenStep, ngày đó sớm hơn so với Cacao của Apple (bắt đầu khi vẫn còn công ty NeXT Computer.)

Nếu ai đó quyết tâm, họ có thể thiết kế một trình nạp sẽ thu thập mọi tòa nhà Mach-O và dịch nó sang tòa nhà Linux tương ứng, cũng như tự động liên kết các thư viện nguồn mở "đối tác" với nhị phân với dịch ABI thích hợp.

Và chỉ với thông tin của bạn, nếu bạn có thể lấy mã nguồn của ứng dụng Mach-O, bạn có thể xem xét cổng và nó có thể rất đơn giản. Ví dụ, ứng dụng TextEdit đi kèm với OS X 10.6 có thể được biên dịch lại liên kết trực tiếp với GNUstep sau khi tước một vài dòng mã CF (không quan trọng) và do đó ngay lập tức có sẵn trong Linux (không đề cập đến TextEdit được gửi cùng với GNUstep biên dịch lại trực tiếp ứng dụng TextEdit từ NeXTSTEP, tiền thân của OS X, thậm chí còn giữ lại nhãn "© 1995 NeXT" của nó). TextEdit theo giấy phép BSD.


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.