Tutti i port di Linux (ovvero il kernel Linux su processori diversi) utilizzano ELF come formato di file per eseguibili e librerie. Un file binario ELF specifico è etichettato con una singola architettura/sistema operativo su cui può essere eseguito (sebbene alcuni sistemi operativi siano compatibili con l'esecuzione di binari ELF da altri sistemi operativi).
La maggior parte dei port supporta il vecchio formato a.out. (Alcuni processori sono abbastanza nuovi che non sono mai esistiti eseguibili a.out per loro.)
Alcuni port supportano anche altri formati di file eseguibili; ad esempio, la porta PA-RISC supporta i vecchi eseguibili SOM di HP-UX e le porte μcLinux (nonmmu) supportano il proprio formato FLAT.
Linux ha anche binfmt_misc
, che consente allo spazio utente di registrare gestori per formati binari arbitrari. Alcune distribuzioni ne approfittano per essere in grado di eseguire applicazioni Windows, .NET o Java:in realtà avvia ancora un interprete, ma è completamente trasparente per l'utente.
Linux su Alpha supporta il caricamento dei binari Intel, che vengono eseguiti tramite em86
emulatore.
E' possibile registrare binfmt_misc
per eseguibili di altre architetture, da eseguire con qemu-user.
In teoria, si potrebbe creare un nuovo formato -- magari registrare una nuova "architettura" in ELF -- per i binari fat. Quindi il kernel binfmt
loader dovrebbe essere istruito su questo nuovo formato e non vorrai perderti il ld-linux.so
linker dinamico e l'intera toolchain di build. C'è stato poco interesse per una funzionalità del genere e, per quanto ne so, nessuno sta lavorando a qualcosa di simile.
Tutte le distribuzioni Linux usano lo stesso formato binario ELF, ma ci sono ancora alcune differenze:
- diverse architetture di cpu usano set di istruzioni differenti.
- lo stesso arco della cpu può utilizzare ABI differenti, ABI definisce come utilizzare il file di registro, come chiamare/restituire una routine. ABI diversi non possono funzionare insieme.
- Anche sullo stesso arco, stessa ABI, questo non significa ancora che possiamo copiare un file binario in una distribuzione in un'altra. Poiché la maggior parte dei file binari non sono collegati staticamente, quindi dipendono dalle librerie sotto la distribuzione, il che significa che diverse distribuzioni possono utilizzare versioni diverse o diverse configurazioni di compilazione delle librerie.
Quindi, se vuoi che il tuo programma funzioni su tutte le distribuzioni, potresti dover collegare staticamente una versione che dipende solo dalla chiamata di sistema del kernel, anche se puoi eseguire solo un'architettura specifica.
Se vuoi davvero eseguire un programma su qualsiasi architettura, devi compilare i binari per tutte le architetture e utilizzare uno script di shell per avviare quella giusta.
Quasi tutti i file di programma Linux utilizzano lo standard ELF.