W jaki sposób Linux określa, jakich udogodnień użyć do uruchomienia (nietekstowego) pliku binarnego?

23

Rozumiem, że Linux używa linii shebang do określenia, jakiego interpretera należy użyć do języków skryptowych, ale jak to działa w przypadku plików binarnych?

To znaczy mogę uruchomić aplikacji linuksowych, a po zainstalowaniu zarówno wino i mono , Windows rodzimych i .NET plików binarnych. I dla wszystkich z nich po prostu ./binary-name(jeśli nie w PATH), aby go uruchomić.

W jaki sposób Linux określa, że ​​dany plik binarny musi być uruchamiany jako natywny plik binarny systemu Linux, jako natywny plik binarny systemu Windows (przy użyciu narzędzi do wina ) lub jako plik binarny systemu Windows .NET (przy użyciu urządzeń mono )?

golem
źródło

Odpowiedzi:

29

Jednym słowem: binfmt_misc . Jest to specyficzne dla Linuksa, nieprzenośne narzędzie.

Jądro rozpoznaje kilka formatów z wbudowaną logiką. Mianowicie są to format ELF (dla normalnych plików binarnych) i konwencja shebang (dla skryptów). (dzięki zwolnienie za następną część odpowiedzi). Ponadto Linux rozpoznaje kilka ezoterycznych, przestarzałych lub kompatybilnych formatów. Prawdopodobnie ich nie spotkasz. Są to a.out„em86”, „flat” i „elf_fdpic”.

Cała reszta musi być zarejestrowana przez system binfmt_misc. Ten system umożliwia zarejestrowanie w jądrze prostej kontroli wzoru na podstawie magicznej liczby i odpowiedniego interpretera.

Celada
źródło
6
Chociaż OP wyraźnie poprosił o Linuksa, warto zauważyć, że w przeciwieństwie do wielu innych rozwiązań, które działają zarówno na Linuksie, jak i na innych systemach uniksowych, ten jest całkowicie specyficzny dla Linuksa.
cubuspl42
6
Być może nie jest wkompilowane, ale drzewo źródłowe Linuksa nadal zawiera wewnętrzną obsługę a.outformatów „em86”, „flat” i „elf_fdpic”, a także normalny ELF. Wszystkie z wyjątkiem em86 wydają się być natywnymi binarnymi formatami plików wykonywalnych; nie ma wystarczającej ilości informacji, aby wymyślić, kiedy należy użyć „płaskiego” lub „elf_fdpic”. em86 wydaje się być mechanizmem pre-binfmt_misc do uruchamiania określonego emulatora x86, prawdopodobnie jest jeszcze dostępny dla kompatybilności wstecznej.
zwolnij
2
W systemie Debian Linux (nie sprawdzałem RedHata i innych) polecenie wyświetlania wszystkich bieżących wpisów binfmt toupdate-binfmts --display
golem