Como o Linux determina quais recursos usar para executar um binário (sem texto)?

23

Entendo que o Linux usa a linha shebang para determinar qual intérprete usar nas linguagens de script, mas como funciona para binários?

Quero dizer, posso executar binários Linux, e instalar os binários wine e mono , nativos do Windows e .NET. E para todos eles é apenas ./binary-name(se não estiver no PATH) executá-lo.

Como o Linux determina que um determinado binário deve ser executado como um binário nativo do Linux, como um binário nativo do Windows (usando instalações wine ) ou como um binário do Windows .NET (usando instalações mono )?

golem
fonte

Respostas:

29

Em uma palavra: binfmt_misc . É uma instalação específica para Linux, não portátil.

Existem alguns formatos que são reconhecidos pelo kernel com lógica interna. Nomeadamente, esses são o formato ELF (para binários normais) e a convenção shebang (para scripts). (obrigado a zwol pela parte seguinte da resposta). Além disso, o Linux reconhece alguns formatos internos esotéricos ou obsoletos ou de compatibilidade. Você provavelmente não os encontrará. Eles são a.out"em86", "flat" e "elf_fdpic".

Todo o resto deve ser registrado através do sistema binfmt_misc. Este sistema permite que você registre no kernel uma verificação simples de padrões com base em um número mágico e no intérprete correspondente.

Celada
fonte
6
Embora o OP tenha solicitado explicitamente o Linux, pode ser interessante notar que, ao contrário de muitas outras soluções que funcionam tanto em Linux quanto em outros sistemas Unix, essa é totalmente específica para Linux.
precisa saber é o seguinte
6
Pode não ser compilado, mas a árvore de origem do Linux ainda inclui suporte intrínseco aos a.outformatos "em86", "flat" e "elf_fdpic", além do ELF normal. Todos, exceto o em86, parecem ser formatos executáveis ​​binários nativos; não há informações suficientes para descobrir quando alguém usaria "flat" ou "elf_fdpic". O em86 parece ser um mecanismo pré-binfmt_misc para executar um emulador x86 específico, provavelmente ainda existe para compatibilidade com versões anteriores.
Zwol 26/04/2015
2
No Debian Linux (não verifiquei o RedHat e outros), o comando para exibir todas as entradas atuais do binfmt éupdate-binfmts --display
golem