JITs de código de máquina e o bit Desativar Execução

10

Como o código de máquina gerado em tempo de execução (como a saída de um JIT) é realmente executado pela CPU se a CPU / OS possui um bit de Desativação de Execução?

Tanto quanto eu sei, muitos processadores modernos e sistemas operacionais incluem suporte para uma NX bit, (incluindo Intel e ARM), que impede a máquina de código que é armazenada em qualquer endereço outro do que a seção do código de um binário compilado de ser executado. Claramente, essa é uma boa vantagem de segurança, porque evita ataques de injeção de código de shell.

Mas como os mecanismos JIT, como o LLVM, que geram código de máquina dinamicamente, resolvem isso?

Siler
fonte
Dê uma olhada nas implementações de Memory :: assignateMappedMemory para ver como isso é feito no LLVM. - Para * nix - Para Windows
zr01 8/8

Respostas:

6

No Linux e em muitos sistemas Posix, um aplicativo pode alterar a proteção de algum intervalo do espaço de endereço do processo na memória virtual usando os syscalls mmap (2) e mprotect (2) .

Portanto, o mecanismo JIT poderia usá-los (provavelmente antes da emissão do código da máquina, mas talvez depois dele).

BTW, em algumas arquiteturas, pode ser necessário informar o cache da CPU sobre os novos segmentos de código de máquina disponíveis, por exemplo, __builtin_clear_cachedo GCC.

Basile Starynkevitch
fonte