Semua port Linux (yaitu, kernel Linux pada prosesor yang berbeda) menggunakan ELF sebagai format file untuk executable dan library. Biner ELF tertentu diberi label dengan arsitektur/OS tunggal yang dapat dijalankannya (walaupun beberapa OS memiliki kompatibilitas untuk menjalankan biner ELF dari OS lain).
Sebagian besar port memiliki dukungan untuk format a.out yang lebih lama. (Beberapa prosesor cukup baru sehingga tidak pernah ada a.out yang dapat dieksekusi untuknya.)
Beberapa port juga mendukung format file yang dapat dieksekusi lainnya; misalnya, port PA-RISC mendukung executable SOM lama HP-UX, dan port μcLinux (nonmmu) mendukung format FLAT-nya sendiri.
Linux juga memiliki binfmt_misc
, yang memungkinkan ruang pengguna untuk mendaftarkan penangan untuk format biner arbitrer. Beberapa distribusi memanfaatkan ini untuk dapat menjalankan aplikasi Windows, .NET, atau Java -- ini benar-benar masih meluncurkan juru bahasa, tetapi sepenuhnya transparan bagi pengguna.
Linux di Alpha memiliki dukungan untuk memuat binari Intel, yang dijalankan melalui em86
emulator.
Anda dapat mendaftarkan binfmt_misc
untuk executable dari arsitektur lain, untuk dijalankan dengan qemu-user.
Secara teori, seseorang dapat membuat format baru -- mungkin mendaftarkan "arsitektur" baru di ELF -- untuk binari gemuk. Kemudian kernel binfmt
loader harus diajari tentang format baru ini, dan Anda tidak ingin melewatkan ld-linux.so
linker dinamis dan seluruh rangkaian alat build. Ada sedikit minat pada fitur seperti itu, dan sejauh yang saya tahu, tidak ada yang mengerjakan hal seperti itu.
Semua distribusi Linux menggunakan format biner ELF yang sama, namun masih ada beberapa perbedaan:
- lengkungan cpu yang berbeda menggunakan set instruksi yang berbeda.
- arch cpu yang sama dapat menggunakan ABI yang berbeda, ABI menentukan cara menggunakan file register, cara memanggil/mengembalikan rutin. ABI yang berbeda tidak dapat bekerja sama.
- Bahkan pada arch yang sama, ABI yang sama, ini tetap tidak berarti kita dapat menyalin satu file biner dalam distribusi ke yang lain. Karena sebagian besar file biner tidak ditautkan secara statis, maka mereka bergantung pada pustaka di bawah distribusi, yang berarti distribusi yang berbeda dapat menggunakan versi yang berbeda atau konfigurasi pustaka yang berbeda.
Jadi jika Anda ingin program Anda berjalan di semua distribusi, Anda mungkin harus menautkan secara statis versi yang bergantung pada syscall kernel saja, bahkan ini Anda hanya dapat menjalankan arch yang ditentukan.
Jika Anda benar-benar ingin menjalankan program di arch mana pun, Anda harus mengompilasi binari untuk semua arch, dan menggunakan skrip shell untuk memulai yang benar.
Hampir semua file program linux menggunakan standar ELF.