In che modo Linux determina quali servizi usare per eseguire un binario (non testuale)?


23

Capisco che Linux usa la linea shebang per determinare quale interprete usare per i linguaggi di scripting, ma come funziona per i binari?

Voglio dire, posso eseguire binari Linux e aver installato sia binari wine che mono , binari Windows e .NET. E per tutti è solo ./binary-name(se non in PERCORSO) eseguirlo.

In che modo Linux determina che un determinato binario deve essere eseguito come binario nativo Linux, come binario nativo di Windows (usando le strutture del vino ) o come binario di Windows .NET (usando le strutture mono )?

Risposte:


29

In una parola: binfmt_misc . È una struttura specifica per Linux, non portatile.

Esistono un paio di formati riconosciuti dal kernel con logica integrata. Vale a dire, questi sono il formato ELF (per i normali binari) e la convenzione shebang (per gli script). (grazie a zwol per la seguente parte della risposta). Inoltre, Linux riconosce un paio di formati incorporati esoterici o obsoleti o compatibili. Probabilmente non li incontrerai. Sono a.out"em86", "flat" e "elf_fdpic".

Tutto il resto deve essere registrato attraverso il sistema binfmt_misc. Questo sistema consente di registrare con il kernel un semplice controllo del modello basato su un numero magico e l'interprete corrispondente.


6
Sebbene l'OP abbia chiesto esplicitamente Linux, potrebbe valere la pena notare che, a differenza di molte altre soluzioni che funzionano sia su Linux che su altri sistemi simili a Unix, questo è totalmente specifico per Linux.
cubuspl42,

6
Potrebbe non essere compilato, ma l'albero dei sorgenti di Linux include ancora il supporto intrinseco per i a.outformati "em86", "flat", "elf_fdpic" e il normale ELF. Tutti quelli ad eccezione di em86 sembrano essere formati eseguibili binari nativi; non ci sono abbastanza informazioni per farmi capire quando si userebbe "flat" o "elf_fdpic". em86 sembra essere un meccanismo pre-binfmt_misc per l'esecuzione di un particolare emulatore x86, probabilmente è ancora in circolazione solo per compatibilità con le versioni precedenti.
zwol,

2
Su Debian Linux (non ho controllato RedHat e altri) il comando per visualizzare tutte le voci binfmt correnti èupdate-binfmts --display
golem
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.