Wie bestimmt Linux, welche Funktionen zum Ausführen einer (Nicht-Text-) Binärdatei verwendet werden sollen?

23

Ich verstehe, dass Linux shebang line verwendet, um zu bestimmen, welcher Interpreter für Skriptsprachen verwendet werden soll, aber wie funktioniert es für Binärdateien?

Ich meine, ich kann Linux-Binärdateien ausführen und sowohl Wine- als auch Mono- , Windows-native- und .NET-Binärdateien installieren . Und für alle von ihnen ist es nur ./binary-name(wenn nicht in PATH), es auszuführen.

Wie bestimmt Linux, dass eine bestimmte Binärdatei als native Linux-Binärdatei, als native Windows-Binärdatei (unter Verwendung von Wine-Funktionen ) oder als Windows .NET-Binärdatei (unter Verwendung von Mono-Funktionen ) ausgeführt werden muss?

Golem
quelle

Antworten:

29

Mit einem Wort: binfmt_misc . Es ist eine Linux-spezifische, nicht tragbare Einrichtung.

Es gibt einige Formate, die vom Kernel mit integrierter Logik erkannt werden. Dies sind nämlich das ELF-Format (für normale Binärdateien) und die Shebang-Konvention (für Skripte). (danke an zwol für den folgenden teil der antwort ). Außerdem erkennt Linux einige esoterische oder veraltete oder in die Kompatibilität eingebaute Formate. Sie werden ihnen wahrscheinlich nicht begegnen. Sie sind a.out"em86", "flat" und "elf_fdpic".

Alles andere muss über das binfmt_misc-System registriert werden. Mit diesem System können Sie eine einfache Musterprüfung anhand einer magischen Zahl und des entsprechenden Interpreters beim Kernel registrieren.

Celada
quelle
6
Obwohl das OP ausdrücklich nach Linux gefragt hat, sollte angemerkt werden, dass diese Lösung im Gegensatz zu vielen anderen Lösungen, die sowohl auf Linux- als auch auf anderen Unix-ähnlichen Systemen funktionieren, vollständig Linux-spezifisch ist.
Cubuspl42
6
Es wird möglicherweise nicht in kompiliert, aber der Linux-Quelltextbaum enthält weiterhin die eigentliche Unterstützung für die a.outFormate "em86", "flat" und "elf_fdpic" sowie für normales ELF. Alle außer em86 scheinen native ausführbare Binärformate zu sein. Es gibt nicht genug Informationen, um herauszufinden, wann man "flat" oder "elf_fdpic" verwenden würde. em86 scheint ein Mechanismus vor binfmt_misc zu sein, mit dem ein bestimmter x86-Emulator ausgeführt werden kann. Wahrscheinlich gibt es ihn nur noch aus Gründen der Abwärtskompatibilität.
zwol
2
Unter Debian Linux (ich habe RedHat und andere nicht überprüft) lautet der Befehl zum Anzeigen aller aktuellen binfmt-Einträgeupdate-binfmts --display
golem