Làm thế nào để Linux xác định các cơ sở sử dụng để chạy nhị phân (không phải văn bản)?


23

Tôi hiểu rằng Linux sử dụng dòng shebang để xác định trình thông dịch nào sẽ sử dụng cho các ngôn ngữ script, nhưng nó hoạt động như thế nào cho các nhị phân?

Ý tôi là tôi có thể chạy các tệp nhị phân Linux và đã cài đặt cả nhị phân rượuđơn , Windows gốc và .NET. Và đối với tất cả bọn họ, chỉ cần ./binary-name(nếu không ở PATH) để chạy nó.

Làm thế nào để Linux xác định rằng một nhị phân nhất định phải được chạy dưới dạng nhị phân riêng của Linux, dưới dạng nhị phân riêng của Windows (sử dụng các phương tiện rượu vang ) hoặc dưới dạng nhị phân Windows .NET (sử dụng các tiện ích đơn âm )?

Câu trả lời:


29

Trong một từ: binfmt_misc . Đây là một cơ sở dành riêng cho Linux, không di động.

Có một vài định dạng được nhân nhận bằng logic tích hợp. Cụ thể, đây là định dạng ELF (đối với các nhị phân thông thường) và quy ước shebang (đối với các tập lệnh). (cảm ơn zwol cho phần sau của câu trả lời). Ngoài ra, Linux nhận ra một vài định dạng dựng sẵn bí truyền hoặc lỗi thời hoặc tương thích. Bạn có thể sẽ không gặp phải chúng. Chúng là a.out, "em86", "phẳng" và "elf_fdpic".

Mọi thứ khác phải được đăng ký thông qua hệ thống binfmt_misc. Hệ thống này cho phép bạn đăng ký với kernel kiểm tra mẫu đơn giản dựa trên số ma thuật và trình thông dịch tương ứng.


6
Mặc dù OP đã yêu cầu Linux một cách rõ ràng, nhưng có thể đáng chú ý rằng không giống như nhiều giải pháp khác hoạt động trên cả Linux và các hệ thống tương tự Unix khác, giải pháp này hoàn toàn dành riêng cho Linux.
cubuspl42

6
Nó có thể không được biên dịch, nhưng cây nguồn Linux vẫn bao gồm hỗ trợ nội tại cho a.outcác định dạng "em86", "phẳng" và "elf_fdpic" cũng như ELF bình thường. Tất cả những cái ngoại trừ em86 dường như là các định dạng thực thi nhị phân gốc; không có đủ thông tin để tôi biết khi nào người ta sẽ sử dụng "căn hộ" hay "elf_fdpic". em86 dường như là một cơ chế tiền binfmt_misc để chạy một trình giả lập x86 cụ thể, có lẽ nó chỉ còn tồn tại để tương thích ngược.
zwol

2
Trên Debian Linux (tôi đã không kiểm tra RedHat và những người khác) lệnh hiển thị tất cả các mục nhập binfmt hiện tại làupdate-binfmts --display
golem
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.