¿Cómo es el código de máquina generado en tiempo de ejecución (como la salida de un JIT), realmente ejecutado por la CPU si la CPU / OS tiene un bit de desactivación de ejecución?
Hasta donde yo sé, muchos procesadores y sistemas operativos modernos incluyen soporte para un bit NX (incluyendo Intel y ARM), que evita que se ejecute el código de máquina que se almacena en cualquier dirección que no sea la sección de código de un binario compilado. Claramente, esta es una buena ventaja de seguridad, ya que evita los ataques de inyección de código shell.
Pero, ¿cómo pueden evitar esto los motores JIT, como LLVM, que generan dinámicamente código máquina?
machine-code
jit
llvm
Siler
fuente
fuente
Respuestas:
En Linux y muchos sistemas Posix, una aplicación puede cambiar la protección de algún rango del espacio de direcciones del proceso en la memoria virtual utilizando las llamadas al sistema mmap (2) y mprotect (2) .
Por lo tanto, el motor JIT podría usarlos (probablemente antes de la emisión del código de la máquina, pero tal vez después ).
Por cierto, en algunas arquitecturas, es posible que deba informar al caché de la CPU sobre segmentos de código de máquina recientemente disponibles, por ejemplo,
__builtin_clear_cache
de GCC.fuente