2009-06-23 61 views
10

Vì tất cả các bản phân phối Linux đều sử dụng cùng một hạt nhân, có sự khác biệt nào giữa các tệp nhị phân thực thi của chúng không?Có sự khác biệt nào giữa các tệp nhị phân thực thi giữa các bản phân phối không?

Nếu có, điểm khác biệt chính là gì? Hay điều đó có nghĩa là chúng ta có thể xây dựng một tệp thực thi Linux phổ quát?

+0

"Điều gì đó về tệp nhị phân của Linux" - cách chi tiêu thêm một vài giây để cải thiện tóm tắt câu hỏi này? – scobi

+0

Bạn luôn có thể chỉnh sửa tiêu đề/câu hỏi của người khác - mặc dù vui lòng thực hiện cẩn thận! –

+0

bạn có nghĩa là phổ quát trên các bản phân phối Linux hoặc trên các kiến ​​trúc khác nhau ...? – LB40

Trả lời

12

phân phối Tất cả Linux sử dụng định dạng cùng ELF nhị phân, nhưng vẫn có một số khác biệt:

  1. khác nhau cpu vòm sử dụng tập lệnh khác nhau.
  2. cùng một vòm CPU có thể sử dụng ABI khác nhau, ABI xác định cách sử dụng tệp đăng ký, cách gọi/trả lại một thường trình. ABI khác nhau không thể làm việc cùng nhau.
  3. Ngay cả trên cùng một vòm, cùng một ABI, điều này vẫn không có nghĩa là chúng ta có thể sao chép một tệp nhị phân trong phân phối sang một tệp khác. Vì hầu hết các tệp nhị phân không được liên kết tĩnh nên chúng phụ thuộc vào các thư viện theo phân phối, có nghĩa là phân phối khác nhau có thể sử dụng các phiên bản khác nhau hoặc cấu hình biên dịch khác nhau của thư viện.

Vì vậy, nếu bạn muốn chương trình chạy trên tất cả phân phối, bạn có thể phải liên kết tĩnh phiên bản chỉ phụ thuộc vào syscall của hạt nhân, thậm chí bạn chỉ có thể chạy một vòm cụ thể.

Nếu bạn thực sự muốn chạy chương trình trên bất kỳ vòm nào, thì bạn phải biên dịch mã nhị phân cho tất cả các vòm và sử dụng tập lệnh shell để khởi động chương trình đúng.

+0

Câu trả lời hay, cảm ơn bạn! Nó làm rõ hơn về câu hỏi –

1

Hầu như tất cả các tệp chương trình linux đều sử dụng tiêu chuẩn ELF.

+0

Tôi nghĩ bạn có nghĩa là ELF –

+0

Cảm ơn - sự cố về ngón tay! –

+0

Chúng ta bằng cách nào đó có thể thay đổi ELF của nhị phân? –

12

Tất cả các cổng Linux (nghĩa là hạt nhân Linux trên các bộ vi xử lý khác nhau) sử dụng ELF làm định dạng tệp cho tệp thi hành và thư viện. Một nhị phân ELF cụ thể được gắn nhãn với một kiến ​​trúc/hệ điều hành duy nhất mà nó có thể chạy (mặc dù một số hệ điều hành có khả năng tương thích để chạy các tệp nhị phân ELF từ các hệ điều hành khác).

Hầu hết các cổng đều hỗ trợ định dạng cũ hơn a.out. (Một số bộ vi xử lý đủ mới mà chưa bao giờ tồn tại bất kỳ tệp thực thi a.out nào cho chúng.)

Một số cổng hỗ trợ các định dạng tệp thực thi khác; ví dụ, cổng PA-RISC hỗ trợ các tập tin thực thi SOM cũ của HP-UX và các cổng μ cLinux (nonmmu) hỗ trợ định dạng FLAT của riêng chúng.

Linux cũng có binfmt_misc, cho phép người dùng đăng ký các trình xử lý cho các định dạng nhị phân tùy ý. Một số bản phân phối tận dụng điều này để có thể thực thi các ứng dụng Windows, .NET hoặc Java - nó thực sự vẫn đang khởi chạy một trình thông dịch, nhưng nó hoàn toàn minh bạch đối với người dùng.


Linux on Alpha hỗ trợ tải các tệp nhị phân của Intel, được chạy qua trình mô phỏng em86.

Có thể đăng ký binfmt_misc để thực thi các kiến ​​trúc khác, để chạy với qemu-user.

Về lý thuyết, người ta có thể tạo ra một định dạng mới - có lẽ đăng ký một "kiến trúc" mới trong ELF - cho các tệp nhị phân chất béo. Sau đó, trình tải hạt nhân binfmt sẽ phải được dạy về định dạng mới này và bạn sẽ không muốn bỏ lỡ liên kết động ld-linux.so và toàn bộ chuỗi công cụ xây dựng. Có rất ít sự quan tâm đến một tính năng như vậy, và theo như tôi biết, không ai làm việc trên bất cứ điều gì giống như nó.

+0

Nhưng liệu có thể tạo một nhị phân Linux phổ quát? –

+0

Cảm ơn câu trả lời của bạn –

+0

Có cách nào để liệt kê tất cả các định dạng có thể chạy được trong thời gian chạy không, ví dụ: 'cat/proc/binfmt'? Tôi chỉ có thể liệt kê những cái 'binfmt_misc' với' ls/proc/sys/fs/binfmt_misc'. Điều tốt nhất tôi có bây giờ là 'ls fs/binfmt *' trên cây nguồn. –

1

Unix cũ cũng đã sử dụng định dạng COFF. Bạn vẫn có thể tìm thấy tập tin thực thi từ thời gian của yore trong định dạng này. Linux vẫn có hỗ trợ cho nó (tôi không biết nếu nó được biên dịch trong distro hiện tại, mặc dù).

+1

Linux bỏ qua trực tiếp từ a.out sang ELF. Một vài cổng có thể xây dựng hình ảnh * kernel * thành định dạng ECOFF (MIPS, PowerPC) để tương thích với một số bộ tải khởi động nhất định, và Alpha có thể hỗ trợ tải COFF để tương thích với các tệp thực thi không phải là bản địa, nhưng tôi không thể tìm thấy bất kỳ dấu vết nào của nó trong các nguồn nhân Linux hiện đại. – ephemient

1

Nếu bạn muốn tạo một chương trình chạy một tất cả các bản phân phối Linux, bạn có thể xem xét sử dụng ngôn ngữ kịch bản (như PythonPerl) hoặc một nền tảng ngôn ngữ lập trình độc lập như Java.

Các chương trình được viết bằng ngôn ngữ kịch bản được tuân thủ theo thời gian thực thi, có nghĩa là chúng luôn được biên dịch để khớp với nền tảng chúng được thực thi và do đó luôn hoạt động (với các thư viện được thiết lập đúng).

Các chương trình được viết trong Java, mặt khác, được biên soạn trước khi phân phối chúng, nhưng có thể được thực hiện trên bất kỳ bản phân phối Linux nào miễn là nó có cài đặt Java VM.

Hơn nữa, các chương trình được viết bằng Java có thể chạy trên các hệ điều hành khác như MS WindowsMac OS.

Điều này cũng đúng đối với nhiều chương trình được viết bằng PythonPerl; tuy nhiên, liệu chương trình hoặc Perl có hoạt động trên hệ điều hành khác hay không phụ thuộc vào thư viện nào được chương trình đó sử dụng và liệu các thư viện này có khả dụng trên các hệ điều hành khác hay không.

Các vấn đề liên quan