Arquivos PE do Arm64X

Arm64X é um novo tipo de binário que pode conter o código Arm64 clássico e o código Arm64EC juntos. Isso torna o Arm64x compatível com os processos clássicos do Arm64 e arm64EC em um dispositivo Windows no Arm e um ajuste particularmente bom para middleware ou plug-ins que podem ser usados por ambas as ABIs.

Introduzido no SDK do Windows 11, o binário Arm64X é um tipo de arquivo PE (Portable Executable) que funciona com Windows 11 no Arm e no Windows 10 no Arm. Para criar binários Arm64X, consulte Compilar binários Arm64X.

Como funcionam os binários do Arm64X?

Fundamentalmente, um binário Arm64X contém todo o conteúdo que estaria em binários x64/Arm64EC e Arm64 separados, mas mesclado em um arquivo mais eficiente no disco. O binário Arm64X criado tem dois conjuntos de código, pontos de entrada etc., ao mesmo tempo em que elimina partes redundantes para economizar espaço no disco.

Quando um binário Arm64X é carregado por um aplicativo, o sistema operacional aplica transformações para expor as seções corretas, dependendo da arquitetura do processo em que está sendo carregado. Você pode pensar em um binário Arm64X como imagens 3D antigas, com uma imagem vermelha e azul que pode ser vista através das lentes vermelhas ou azuis em um par de óculos 3D. Um aplicativo x64 verá a DLL como se fosse uma DLL x64, enquanto um aplicativo Arm64 verá a mesma DLL que uma DLL Arm64.

Gráfico de transformação Arm64X mostrando óculos 3D com lentes vermelhas e azuis

As transformações transparentes do sistema operacional permitem que os aplicativos x64 e Arm64 carreguem o mesmo binário Arm64X sem nunca saber que ele também contém código correspondente à outra arquitetura. Por esse motivo, os binários arm64X são apelidados de "camaleão" à medida que assumem a "cor" de seus arredores.

Por padrão, binários Arm64X parecem ser binários Arm64. Isso permite que um sistema que executa o Windows 10 no Arm, que não conhece o formato Arm64X ou como aplicar transformações, carregue o binário Arm64X em um processo Arm64 com êxito.

Como o sistema operacional usa binários Arm64X?

Windows 11 no Arm introduziu a capacidade de executar aplicativos x64 no Arm64. No entanto, ao contrário da emulação x86, que inclui uma SysWoW64 pasta , não há uma pasta separada de binários de sistema operacional x64 puros. Com Windows 11 no Arm, os aplicativos x64 e o Arm64 são capazes de carregar binários e chamar APIs usando os binários no System32. Essa flexibilidade é possível porque todos os binários em System32 que um aplicativo pode precisar carregar foram recompilados como binários arm64X.

Os aplicativos x64 e Arm64 podem carregar e interagir com os binários no System32, sem a necessidade de uma cópia separada de todos os binários do sistema, como SysWoW64 para x86.

Binários compatíveis com x64 e Arm64 nas pastas System32

Arm64X para uso com middleware ou plug-ins

A função principal de um binário Arm64X é habilitar um arquivo no disco para dar suporte a processos x64/Arm64EC e Arm64. A maioria dos desenvolvedores de aplicativos se concentrará na criação de seu aplicativo como Arm64EC ou Arm64, não ambos, nesse caso, o Arm64X provavelmente não será necessário.

O Arm64X deve ser considerado por desenvolvedores de middleware ou plug-ins, no entanto, porque esse código tem o potencial de ser carregado em processos x64 ou Arm64.

Você pode dar suporte a processos x64 e Arm64 sem usar o Arm64X, mas pode achar mais fácil permitir que o sistema operacional manipule o carregamento da arquitetura correta do binário em um determinado processo de 64 bits.

Três abordagens para dar suporte a binários separados por aplicativos, binário Arm64x, encaminhador puro Arm64X combinando binários x64/Arm64EC com Arm64

Três maneiras conceituais de dar suporte a ambas as arquiteturas em Windows 11 no Arm incluem:

  • Binários separados: como as práticas padrão hoje usam binários separados ao dar suporte a várias arquiteturas, você pode descobrir que criar e enviar binários separados x64 e Arm64 funciona melhor para sua solução. Você pode usar seus mecanismos existentes para garantir que o binário correto seja carregado no processo de arquitetura associado.

  • Binário Arm64X: você pode criar um binário Arm64X que contém todo o código x64/Arm64EC e Arm64 em um binário.

  • Encaminhador puro Arm64X: se você precisar de flexibilidade do Arm64X, mas quiser evitar colocar todo o código do aplicativo em um binário Arm64X, poderá optar por usar a abordagem de encaminhador puro, em que um pequeno binário Arm64X sem código é usado para redirecionar o carregador para a arquitetura correta da DLL.

Situações de exemplo que exigiriam Arm64X

Há algumas situações que exigirão o uso de um binário Arm64X para dar suporte a aplicativos x64 e Arm64. Isso inclui:

  • Um servidor COM de 64 bits que pode ser chamado por aplicativos x64 ou Arm64
  • Um plug-in que pode ser carregado em um aplicativo x64 ou Arm64
  • Um único binário que é injetado em um processo x64 ou Arm64

Em cada um desses casos, você pode usar um binário Arm64X ou um encaminhador puro Arm64X para permitir que um binário dê suporte a ambas as arquiteturas.

Para obter detalhes sobre como criar binários Arm64X, consulte Compilar binários Arm64X.