Bagaimana Linux menentukan fasilitas apa yang digunakan untuk menjalankan biner (non-teks)?

23

Saya mengerti bahwa Linux menggunakan baris shebang untuk menentukan penerjemah apa yang akan digunakan untuk bahasa scripting, tetapi bagaimana cara kerjanya untuk binari?

Maksud saya, saya dapat menjalankan binari Linux, dan setelah menginstal anggur dan mono , Windows asli dan .NET binari. Dan bagi mereka semua itu hanya ./binary-name(jika tidak di PATH) untuk menjalankannya.

Bagaimana Linux menentukan bahwa biner yang diberikan harus dijalankan sebagai biner asli Linux, sebagai biner asli Windows (menggunakan fasilitas anggur ) atau sebagai biner Windows .NET (menggunakan fasilitas mono )?

golem
sumber

Jawaban:

29

Dalam sebuah kata: binfmt_misc . Ini adalah fasilitas khusus, non-portabel, Linux.

Ada beberapa format yang dikenali oleh kernel dengan logika bawaan. Yaitu, ini adalah format ELF (untuk binari normal) dan konvensi shebang (untuk skrip). (terima kasih kepada zwol untuk bagian jawaban berikut). Selain itu, Linux mengenali beberapa format bawaan yang esoterik atau usang atau kompatibilitas. Anda mungkin tidak akan menemukan mereka. Mereka adalah a.out, "em86", "flat", dan "elf_fdpic".

Semua yang lain harus didaftarkan melalui sistem binfmt_misc. Sistem ini memungkinkan Anda untuk mendaftar dengan kernel pemeriksaan pola sederhana berdasarkan angka ajaib, dan juru bahasa yang sesuai.

Celada
sumber
6
Meskipun OP meminta Linux secara eksplisit, mungkin perlu dicatat bahwa tidak seperti banyak solusi lain yang bekerja baik pada Linux dan sistem serupa Unix lainnya, yang ini sepenuhnya spesifik untuk Linux.
cubuspl42
6
Mungkin tidak dapat dikompilasi, tetapi source tree Linux masih menyertakan dukungan intrinsik untuk a.out, "em86", "flat", dan "elf_fdpic" format serta ELF normal. Semua itu kecuali em86 tampaknya merupakan format biner asli yang dapat dieksekusi; tidak ada informasi yang cukup bagi saya untuk mencari tahu kapan orang akan menggunakan "flat" atau "elf_fdpic". em86 tampaknya merupakan mekanisme pra-binfmt_misc untuk menjalankan emulator x86 tertentu, mungkin hanya ada untuk kompatibilitas mundur.
zwol
2
Di Debian Linux (saya tidak memeriksa RedHat dan lainnya) perintah untuk menampilkan semua entri binfmt saat ini adalahupdate-binfmts --display
golem