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?
machine-code
jit
llvm
Siler
fonte
fonte
Respostas:
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_cache
do GCC.fonte